tinguo002的gravatar头像
tinguo002 2018-12-14 09:06:50
spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

Controller类是使用注解@Resource 注入service类,我想通过配置文件,动态的改变注入的service类。

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

实现思路:

  1. 加载所有配置文件,读取属性和值,保存在单例类中。

  2. 切入点:在spring把这个类实例化之后(实例化完成),并且所有成员变量赋值完成之后(初始化完成),拿到这个实例对象。

  3. 从对象中取出标记了@UpdateValueByConfigByClassInit的属性。

  4. 使用class的名+属性名从配置类中取值,有值则为该字段重新赋值。

  5. 这边赋值分二种情况:若字段上没有@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第一次出现

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

 

UserToListPageController第二次出现

 

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

 

UserToListPageController第三次出现,第一个扩展点出现

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

 

UserToListPageController第四次出现,实例化方法被调用

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)

 

UserToListPageController第五次出现,实例化方法调用完成之后,其它扩展点如下顺序依次被调用

spring 使用@Resource 注入后,根据配置文件修改注入属性的值(实现思路及spring扩展点使用注意事项,无代码)


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
BlueTag 2020年11月27日
暂无贡献等级
honghuang  LV1 2019年11月26日
1375839701  LV4 2019年8月27日
tinguo002  LV6 2019年7月8日
161203301 2019年4月25日
暂无贡献等级
onlyhowe  LV9 2019年4月12日
长地宁  LV2 2019年2月25日
zmy001  LV11 2019年2月24日
zhoumengshun  LV4 2019年2月19日
faersheng2017  LV8 2019年2月19日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友