一.理论基础
1.xml中直接使用"${aa}"注入属性值的原理,BeanFactory后置处理器:在容器中的bean对象实例化之前,对容器中的beanDefinition对象做特定修改;例如:将一个beanDefinition对象的某个String类型的属性a初始值从"11"修改为"1111",scope属性值从singleton修改为prototype
2.注解@Value("${aa}")注入属性值的原理,InstantiationAwareBeanPostProcessor Bean后置处理器,产生实例对象后(构造方法调用结束),填充属性时调用postProcessProperties方法,反射方式设置属性值
二.xml占位符,PropertyPlaceholderConfigurer(BeanFactory后置处理器)
1.实现EnvironmentAware接口,取到容器上下文中的环境信息
2.postProcessBeanFactory后置方法
1)取到容器环境中的资源配置信息,创建配置解析工具类对象
2)循环观察容器中所有beanDefinition对象,找到有"${}"符号标识的,取出里面的key字符串,
3)用key值,去查找资源配置文件中对应的value,将value值替换到beanDefinition对象的属性值上
4)后面创建bean对象时,使用的是修改过的beanDefinition,从而实现占位符到真实值的转换过程
三.注解占位符,AutowiredAnnotationBeanPostProcessor(Bean后置处理器)
1.实现接口MergedBeanDefinitionPostProcessor Bean后置处理器,每个Bean的创建需要的是一个MergedBeanDefinition(基于原始BeanDefinition及其双亲BeanDefinition信息得到一个"合并"之后的BeanDefinition);bean创建过程中,MergedBeanDefinition生成之后,对象属性填充之前,对该bean和MergedBeanDefinition做一次回调操作,相当于提供一个机会可以修改MergedBeanDefinition。对于AutowiredAnnotationBeanPostProcessor对象来说,扫描class类属性上面的@Autowired和@Value注解,将属性和注解值封装为metadata对象并缓存
2.实现接口InstantiationAwareBeanPostProcessor Bean后置处理器,对于AutowiredAnnotationBeanPostProcessor对象来说,其实就是拿着属性上注解key,去容器中查找所有配置文件中的配置,看能不能匹配上,取到对应的value值,反射设置对象属性值