声明:本文测试环境为SpringBoot。
提示:本文以图片说明为主,文字版的测试代码,可见文末的代码托管链接。
有时,我们需要在bean创建后(或者bean销毁前),做一些事情,方式方法有很多,下面介绍如何通过【初始化/销毁相关方法】来达到我们的目的。
常用初始化后(或销毁前)做逻辑的方式:
-
实现InitializingBean接口、DisposableBean接口。
-
使用@PostConstruct注解、@PreDestroy注解。
-
指定init-method方法、destory-method方法。
-
实现BeanPostProcessor接口。
-
……
相关执行顺序及方法:
初始化时:
初始化时的执行顺序及方法 | |
① | 构造方法 |
② | BeanPostProcessor接口的postProcessBeforeInitialization方法 |
③ | @PostConstruct标注的方法 |
④ | InitializingBean接口的afterPropertiesSet方法 |
⑤ | @Bean时,指定的initMethod方法 |
⑥ | BeanPostProcessor接口的postProcessAfterInitialization方法 |
销毁时:
销毁时的执行顺序及方法 | |
① | @PreDestroy标注的方法 |
② | DisposableBean接口的destroy方法 |
③ | @Bean时,指定的destroyMethod方法 |
注:上面的初始化方法、销毁时方法,能生效的前提是,该Bean的生命周期是交由Spring进行管理的。若该Bean的
生命周期是交由Spring进行管理的,但该Bean是采用的懒加载模式,那么只有当第一次使用到该Bean时,才会
进行构造,进而才会进行初始化。
验证测试:
先给出几个相关的类:
Abc:
MyBeanPostProcessor:
注:之所以不直接用Abc实现BeanPostProcessor接口,是因为:如果用Abc实现BeanPostProcessor接口的话,
其注册进SpringIOC容器的处理器的postProcessBeforeInitialization方法和postProcessAfterInitialization
方法,只会对在Abc后面才注册进SpringIOC容器的Bean起效果,对于Abc本身,是没有效果的。
Xyz:
注:在这里通过@Bean将Abc的声明周期交由Spring进行管理,同时指定其初始化方法、销毁方法。
注:如果注入Abc时,采用的是懒加载,那么只有当程序第一次用到Abc时,才会走其构造以及后面紧接着的相关初始化方法。
测试一下:
运行一个空的测试方法:
控制台输出:
注:虽然测试方法是空的,但是容器中的bean还是会走一个完整的生命周期的。