Controller类是使用注解@Resource 注入service类,我想通过配置文件,动态的改变注入的service类。
实现思路:
-
加载所有配置文件,读取属性和值,保存在单例类中。
-
切入点:在spring把这个类实例化之后(实例化完成),并且所有成员变量赋值完成之后(初始化完成),拿到这个实例对象。
-
从对象中取出标记了@UpdateValueByConfigByClassInit的属性。
-
使用class的名+属性名从配置类中取值,有值则为该字段重新赋值。
-
这边赋值分二种情况:若字段上没有@Resource标签,从配置文件取值后转String赋值给该字段;若该字段有@Resource标签,从配置文件取值后使用取得的值从spring容器取对象,把取得的对象赋值给该字段。
===================================================================
使用spring mvc 与 spring整合之后,spring扩展点执行顺序与网上说的不太一样,所以这里记录一下。(spring4.3.7)
对如下五个扩展点进行测试,结论:使用这个postProcessBeforeInitialization和postProcessAfterInitialization扩展点可以实现上面思路。
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;
import java.beans.PropertyDescriptor;
/**
* 对 spring 提供的扩展点进行测试
* Created by Think on 2018/12/2.
*/
@Component
public class FilterBeanPostProcessor implements BeanPostProcessor,InstantiationAwareBeanPostProcessor {
private static final Logger logger = Logger.getLogger(FilterBeanPostProcessor.class);
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
logger.info("====postProcessAfterInitialization====="+o.getClass().getName());
return o;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
logger.info("====postProcessBeforeInitialization====="+bean.getClass().getName());
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> aClass, String s) throws BeansException {
logger.info("====postProcessBeforeInstantiation====="+aClass.getName());
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object o, String s) throws BeansException {
logger.info("====postProcessAfterInstantiation====="+o.getClass().getName());
return true;
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues propertyValues, PropertyDescriptor[] propertyDescriptors, Object o, String s) throws BeansException {
logger.info("====postProcessPropertyValues====="+o.getClass().getName());
return propertyValues;
}
}
UserToListPageController第一次出现
UserToListPageController第二次出现
UserToListPageController第三次出现,第一个扩展点出现
UserToListPageController第四次出现,实例化方法被调用
UserToListPageController第五次出现,实例化方法调用完成之后,其它扩展点如下顺序依次被调用
最近浏览





