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第五次出现,实例化方法调用完成之后,其它扩展点如下顺序依次被调用