一个 Bean 从构造器到销毁,@PostConstruct、afterPropertiesSet、initMethod 到底谁先谁后?Aware 回调排在哪?prototype 会不会被销毁?初始化失败了销毁回调还会不会调用?这篇让一个 Bean 带上所有常见回调,在 Spring Framework 7.0.9 上把顺序逐个记下来。
--- 创建阶段(从构造器到 BeanPostProcessor.after) 1. [BPP] postProcessBeforeInstantiation 2. 构造器 Life(Dep) 3. [BPP] postProcessAfterInstantiation 4. [BPP] postProcessProperties 5. @Autowired setter setDep2 6. BeanNameAware.setBeanName(life) 7. BeanClassLoaderAware.setBeanClassLoader 8. BeanFactoryAware.setBeanFactory 9. EnvironmentAware.setEnvironment 10. ApplicationContextAware.setApplicationContext 11. [BPP] postProcessBeforeInitialization 12. @PostConstruct 13. InitializingBean.afterPropertiesSet 14. @Bean(initMethod) customInit 15. [BPP] postProcessAfterInitialization --- c.close() 之后 1. @PreDestroy 2. DisposableBean.destroy 3. @Bean(destroyMethod) customDestroy
实例化前、构造器、注入、Aware、BPP.before、@PostConstruct、afterPropertiesSet、initMethod、BPP.after,销毁是反向的三个回调。
--- 两次 getBean(prototype) 1. 构造器 Life(Dep) 2. @Autowired setter setDep2 3. BeanNameAware.setBeanName(life) 4. BeanClassLoaderAware.setBeanClassLoader 5. BeanFactoryAware.setBeanFactory 6. EnvironmentAware.setEnvironment 7. ApplicationContextAware.setApplicationContext 8. @PostConstruct 9. InitializingBean.afterPropertiesSet 10. 构造器 Life(Dep) 11. @Autowired setter setDep2 12. BeanNameAware.setBeanName(life) 13. BeanClassLoaderAware.setBeanClassLoader 14. BeanFactoryAware.setBeanFactory 15. EnvironmentAware.setEnvironment 16. ApplicationContextAware.setApplicationContext 17. @PostConstruct 18. InitializingBean.afterPropertiesSet --- c.close() 之后(prototype 的销毁回调)
容器只负责创建,不持有、不销毁 prototype 实例。
--- c.close() 之后 1. Closer.close() 被调用(没有任何配置)
@Bean 返回的对象有 close() 时,即使没配置也会在关闭时被调用;destroyMethod 设成空串可以关掉。
--- 初始化抛异常的 Bean 1. 构造器 Boom 2. Boom.@PostConstruct 抛异常 3. refresh 抛出 BeanCreationException ← IllegalStateException: 初始化失败
@PostConstruct 抛异常的 Bean 不会被登记销毁,@PreDestroy 不会被调用。