前置文章:
一、Spring原理分析-BeanFactory与ApplicationContext
二、Spring原理分析-Bean生命周期
三、Spring原理分析-Bean后处理器
四、Spring原理分析-BeanFactory后处理器
一、Aware接口&InitializingBean
1、基础准备
2、总结
3、补充:EmbeddedValueResolverAware
二、@Autowired和@PostConstruct注解失效
1、基础准备
2、失效情形
3、失效原因
4、使用Aware接口避免失效
5、总结
补充总结
1、基础准备
注释掉AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor两个后处理器,如下:
2、总结
【A】、各类Aware及其作用:
Ⅰ BeanNameAware 注入 bean 的名字;
Ⅱ BeanFactoryAware 注入 BeanFactory 容器;
Ⅲ ApplicationContextAware 注入 ApplicationContext 容器;
Ⅳ EmbeddedValueResolverAware 解析 ${}。
【B】、为什么后处理器能实现的功能要通过Aware接口实现:
对比之下可以发现,原生干净的 GenericApplicationContext 容器并没有各类后处理器,需要我们手动添加才能实现拓展。
而实现这类接口,原生容器就能直接实现拓展。
3、补充:EmbeddedValueResolverAware
BeanFactoryAware与ApplicationContext类似,此处不演示。演示实现EmbeddedValueResolverAware接口,如下:
实现接口实现方法,并添加如下内容:
1、基础准备
添加ConfigurationClassPostProcessor后处理器,注册MyConfig1,如下:
此时,我们可以看到@Autowired和@PostConstruct都生效了。
2、失效情形
添加@Bean的相关内容,如下:
此时,后处理器拓展出来的注解都失效了。
3、失效原因
案例中需要被执行的 BeanFactoryPostProcessor 在 MyConfig1 配置类中。为了保证 BeanFactoryPostProcessor 能顺利执行,此时会先创建和初始化 MyConfig1 对象。但是,注册 BeanPostProcessor 的步骤并没有执行到,所以 @Autowired 这类注解并没有生效。
为了证明如上顺序,我们继续测试。
添加 MyConfig2 类,如下:
修改测试类,添加注册myConfig2,如下:
可以看到由于 MyConfig2 类中没有 BeanFactoryPostProcessor 的调用需被执行,所以其中的 BeanPostProcessor 可以正常执行到。
BeanFactoryPostProcessor 的执行顺序问题导致 BeanPostProcessor 相关配置失效。
4、使用Aware接口避免失效
实现InitializingBean、ApplicationContextAware接口,如下:
添加注册myConfig3的内容,如下:
5、总结
补充总结:
以上即为Aware接口&InitializingBean的全部内容,感谢阅读。