这个问题可以分两种解释:
1. 某个bean初始化执行?
2. 所有bean初始化后执行?
第一个问题可以在spring bean的生命周期中找到答案:
bean定义-实例化-初始化-销毁。注意: 这里的bean定义是指所有的bean定义完成,然后才继续执行,而实例化和初始化 单个bean 一次执行的 。
那么问题1 可以有如下方式:
实现BeanPostProcessor.postProcessAfterInitialization
使用注解@PostConstruct
实现InitializationBean.afterPropertiesSet
但以上方法仅对当前bean的生命周期起作用。 比如我想在A类中控制B类(我的需求:B类在jar报中使用@Bean生成)的初始化,我用了BeanPostProcessor,发现A类先于B类实例化,可以使用@DependsOn 强制B类实例化。
问题2: 可以使用 ApplicationListener<ContextRefeshedEvent> 监控容器启动完成后。
或者 ApplicationRunner CommandLineRunner .
其他补充: 今天想看看这些围绕bean的接口的执行顺序,于是:
public class AA implements InitializingBean, BeanPostProcessor,
BeanFactoryPostProcessor, BeanNameAware, BeanFactoryAware,
ApplicationContextAware {
但是发现 BeanPostProcessor , BeanFactoryPostProcessor 接口的两个方法不执行。 调试代码发现普通的类走else ,而AA却走的if , 看描述是提前实例化(循环依赖问题),后续学习。
解决方案: 在另一个类中实现这两个接口 然后在方法中对A处理。 最终的执行顺序:
zc beanFactoryPostProcessor
zc beanNameAwareAA
zc beanFactoryAware
zc applicationContextAware
zc beanPostProcessor before
zc postConstruct
zc initializing
zc beanPostProcessor after