【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

时间:2021-06-07 01:19:57

一、Aware接口&InitializingBean
1、基础准备

2、总结

3、补充:EmbeddedValueResolverAware
二、@Autowired和@PostConstruct注解失效
1、基础准备

2、失效情形

3、失效原因

4、使用Aware接口避免失效

5、总结 补充总结

一、Aware接口&InitializingBean

1、基础准备

  • ① 编写 MyBean 实现 BeanNameAware, ApplicationContextAware, InitializingBean 接口,并使用 @Autowired、@PostConstruct 注解,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 编写测试类

注释掉AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor两个后处理器,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


2、总结

【A】、各类Aware及其作用:

Ⅰ BeanNameAware 注入 bean 的名字;
Ⅱ BeanFactoryAware 注入 BeanFactory 容器;
Ⅲ ApplicationContextAware 注入 ApplicationContext 容器;
Ⅳ EmbeddedValueResolverAware 解析 ${}。

【B】、为什么后处理器能实现的功能要通过Aware接口实现:

对比之下可以发现,原生干净的 GenericApplicationContext 容器并没有各类后处理器,需要我们手动添加才能实现拓展。
而实现这类接口,原生容器就能直接实现拓展。

3、补充:EmbeddedValueResolverAware

BeanFactoryAware与ApplicationContext类似,此处不演示。演示实现EmbeddedValueResolverAware接口,如下:

  • ① 让MyBean实现EmbeddedValueResolverAware接口

实现接口实现方法,并添加如下内容:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 修改测试类

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


二、@Autowired和@PostConstruct注解失效

1、基础准备

  • ① 编写MyConfig1类

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 修改测试类

添加ConfigurationClassPostProcessor后处理器,注册MyConfig1,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


此时,我们可以看到@Autowired和@PostConstruct都生效了。

2、失效情形

  • ① 修改MyConfig1类

添加@Bean的相关内容,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 测试

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


此时,后处理器拓展出来的注解都失效了。

3、失效原因

  • ① Java 配置类不包含 BeanFactoryPostProcessor 的情况

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


  • ② Java 配置类包含 BeanFactoryPostProcessor 的情况

案例中需要被执行的 BeanFactoryPostProcessor 在 MyConfig1 配置类中。为了保证 BeanFactoryPostProcessor 能顺利执行,此时会先创建和初始化 MyConfig1 对象。但是,注册 BeanPostProcessor 的步骤并没有执行到,所以 @Autowired 这类注解并没有生效。

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


为了证明如上顺序,我们继续测试。

  • ③ 测试不失效的情形来佐证

添加 MyConfig2 类,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

修改测试类,添加注册myConfig2,如下:


context.registerBean("myConfig2", MyConfig2.class);

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


可以看到由于 MyConfig2 类中没有 BeanFactoryPostProcessor 的调用需被执行,所以其中的 BeanPostProcessor 可以正常执行到。

  • ④ 结论

BeanFactoryPostProcessor 的执行顺序问题导致 BeanPostProcessor 相关配置失效。

4、使用Aware接口避免失效

  • ① 编写MyConfig3

实现InitializingBean、ApplicationContextAware接口,如下:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 修改测试类

添加注册myConfig3的内容,如下:


context.registerBean("myConfig3", MyConfig3.class);

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


5、总结

  • ① 尽量避免在调用BeanFactoryPostProcessor的Bean中使用BeanPostProcessor相关配置;
  • ② 如果无法避免两者在同一个Bean中均要用到的情形,则考虑实现Aware接口来实现BeanPostProcessor类似的功能。

补充总结:

  • ① AutowiredAnnotationBeanPostProcessor后处理器:解析 @Autowired、@Value 注解;
  • ② CommonAnnotationBeanPostProcessor后处理器:解析 @Resource、@PostConstruct、@PreDestroy 注解;
  • ③ ConfigurationClassPostProcessor后处理器:解析 @Component、ConfigurationProperties、@Import、@ImportSource 注解。


三、结尾

以上即为Aware接口&InitializingBean的全部内容


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

接下来讲解:

Spring原理分析-初始化与销毁执行顺序

一、初始化执行顺序

1、基础准备

  • ① 编写Bean1

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 编写启动类

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ③ 测试

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


2、总结

@PostConstruct → InitializingBean#afterPropertiesSet → @Bean(initMethod = "")


二、销毁执行顺序

1、基础准备

  • ① 编写Bean2

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ② 修改启动类

添加如下内容:

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】

  • ③ 测试

【Spring原理分析-Aware接口&InitializingBean&初始化与销毁执行顺序】


2、总结

@PreDestroy → DisposableBean#destroy → @Bean(destroyMethod = "")


三、结尾

以上即为初始化与销毁执行顺序的全部内容,感谢阅读。