mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-18 08:25:32 +00:00
perf[storage]: 优化代码结构,并删除无用代码
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user