perf[storage]: 优化代码结构,并删除无用代码

This commit is contained in:
jaysunxiao
2021-06-26 13:57:05 +08:00
parent 617500ae59
commit 036d05d7d7
5 changed files with 61 additions and 112 deletions
@@ -16,7 +16,6 @@ package com.zfoo.storage;
import com.zfoo.protocol.util.StringUtils;
import com.zfoo.storage.interpreter.IResourceReader;
import com.zfoo.storage.manager.IStorageManager;
import com.zfoo.storage.schema.ResInjectionProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationContextEvent;
@@ -66,16 +65,6 @@ public class StorageContext implements ApplicationListener<ApplicationContextEve
return instance.storageManager;
}
public static void injectResource() {
var applicationContext = instance.applicationContext;
var beanNames = applicationContext.getBeanDefinitionNames();
var processor = applicationContext.getBean(ResInjectionProcessor.class);
for (var beanName : beanNames) {
processor.postProcessAfterInitialization(applicationContext.getBean(beanName), beanName);
}
}
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
@@ -94,7 +83,7 @@ public class StorageContext implements ApplicationListener<ApplicationContextEve
instance.storageManager.initBefore();
// 注入配置表资源
injectResource();
instance.storageManager.inject();
// 移除没有被引用的不必要资源,为了节省服务器内存
instance.storageManager.initAfter();
@@ -30,6 +30,11 @@ public interface IStorageManager {
*/
void initBefore();
/**
* 注入
*/
void inject();
/**
* 程序加载过后,移除没有用到的配置表
*/
@@ -15,7 +15,11 @@ package com.zfoo.storage.manager;
import com.zfoo.protocol.collection.CollectionUtils;
import com.zfoo.protocol.exception.ExceptionUtils;
import com.zfoo.protocol.util.ReflectionUtils;
import com.zfoo.protocol.util.StringUtils;
import com.zfoo.storage.StorageContext;
import com.zfoo.storage.model.anno.Id;
import com.zfoo.storage.model.anno.ResInjection;
import com.zfoo.storage.model.config.StorageConfig;
import com.zfoo.storage.model.vo.ResourceDef;
import com.zfoo.storage.model.vo.Storage;
@@ -26,6 +30,9 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.util.ResourceUtils;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Collectors;
@@ -97,6 +104,54 @@ public class StorageManager implements IStorageManager {
}
}
@Override
public void inject() {
var applicationContext = StorageContext.getApplicationContext();
var beanNames = applicationContext.getBeanDefinitionNames();
for (var beanName : beanNames) {
var bean = applicationContext.getBean(beanName);
ReflectionUtils.filterFieldsInClass(bean.getClass()
, field -> field.isAnnotationPresent(ResInjection.class)
, field -> {
Type type = field.getGenericType();
if (!(type instanceof ParameterizedType)) {
throw new RuntimeException(StringUtils.format("[bean:{}]类型声明不正确,不是泛型类", bean.getClass().getSimpleName()));
}
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
// @ResInjection
// Storage<Integer, ActivityResource> resources;
Class<?> keyClazz = (Class<?>) types[0];
Class<?> resourceClazz = (Class<?>) types[1];
Storage<?, ?> storage = StorageContext.getStorageManager().getStorage(resourceClazz);
if (storage == null) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]不存在", resourceClazz.getSimpleName()));
}
Field[] idFields = ReflectionUtils.getFieldsByAnnoInPOJOClass(resourceClazz, Id.class);
if (idFields.length != 1) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]配置没有注解id", resourceClazz.getSimpleName()));
}
if (!keyClazz.getSimpleName().toLowerCase().contains(idFields[0].getType().getSimpleName().toLowerCase())) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]配置注解[id:{}]类型和泛型类型[type:{}]不匹配"
, resourceClazz.getSimpleName(), idFields[0].getType().getSimpleName(), keyClazz.getSimpleName()));
}
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(field, bean, storage);
storage.setUsable(true);
});
}
}
@Override
public void initAfter() {
var unusableStorageClassList = storageMap.entrySet().stream()
@@ -1,94 +0,0 @@
/*
* Copyright (C) 2020 The zfoo Authors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations under the License.
*/
package com.zfoo.storage.schema;
import com.zfoo.protocol.util.ReflectionUtils;
import com.zfoo.protocol.util.StringUtils;
import com.zfoo.storage.StorageContext;
import com.zfoo.storage.model.anno.Id;
import com.zfoo.storage.model.anno.ResInjection;
import com.zfoo.storage.model.vo.Storage;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.function.Consumer;
/**
* Bean级生命周期接口和容器生命周期接口是个性和共性的辩证统一思想的体现,
* 前者解决Bean个性化处理的问题,而后者解决容器中某些Bean共性处理的问题
*
* @author jaysunxiao
* @version 3.0
*/
public class ResInjectionProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (StorageContext.getStorageContext() == null) {
return bean;
}
ReflectionUtils.filterFieldsInClass(bean.getClass(), null, new Consumer<Field>() {
@Override
public void accept(Field field) {
ResInjection anno = field.getAnnotation(ResInjection.class);
if (anno != null) {
injectStorage(bean, field, anno);
}
}
});
return bean;
}
private void injectStorage(Object bean, Field field, ResInjection anno) {
Type type = field.getGenericType();
if (!(type instanceof ParameterizedType)) {
throw new RuntimeException(StringUtils.format("[bean:{}]类型声明不正确,不是泛型类", bean.getClass().getSimpleName()));
}
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
// @ResInjection
// Storage<Integer, ActivityResource> resources;
Class<?> keyClazz = (Class<?>) types[0];
Class<?> resourceClazz = (Class<?>) types[1];
Storage<?, ?> storage = StorageContext.getStorageManager().getStorage(resourceClazz);
if (storage == null) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]不存在", resourceClazz.getSimpleName()));
}
Field[] idFields = ReflectionUtils.getFieldsByAnnoInPOJOClass(resourceClazz, Id.class);
if (idFields.length != 1) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]配置没有注解id", resourceClazz.getSimpleName()));
}
if (!keyClazz.getSimpleName().toLowerCase().contains(idFields[0].getType().getSimpleName().toLowerCase())) {
throw new RuntimeException(StringUtils.format("静态类资源[resource:{}]配置注解[id:{}]类型和泛型类型[type:{}]不匹配"
, resourceClazz.getSimpleName(), idFields[0].getType().getSimpleName(), keyClazz.getSimpleName()));
}
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(field, bean, storage);
storage.setUsable(true);
}
}
@@ -98,12 +98,6 @@ public class StorageDefinitionParser implements BeanDefinitionParser {
builder = BeanDefinitionBuilder.rootBeanDefinition(clazz);
registry.registerBeanDefinition(name, builder.getBeanDefinition());
// 注入StaticInjectProcessor
clazz = ResInjectionProcessor.class;
name = StringUtils.uncapitalize(clazz.getName());
builder = BeanDefinitionBuilder.rootBeanDefinition(clazz);
registry.registerBeanDefinition(name, builder.getBeanDefinition());
// 注入ConversionServiceFactoryBean
clazz = ConversionServiceFactoryBean.class;
name = StringUtils.uncapitalize(clazz.getName());