1. 容器啟動 → 讀取配置元數據 (XML/@Configuration)
2. BeanFactoryPostProcessor.postProcessBeanFactory() // 修改 BeanDefinition
3. 實例化 Bean (構造器/工廠方法)
4. 屬性填充 (Dependency Injection)
5. Aware 接口回調:
- BeanNameAware.setBeanName()
- BeanFactoryAware.setBeanFactory()
- ApplicationContextAware.setApplicationContext()
- ... 其他 *Aware
6. BeanPostProcessor.postProcessBeforeInitialization()
7. 初始化回調:
- InitializingBean.afterPropertiesSet()
- @PostConstruct
- 自定義 init-method
8. BeanPostProcessor.postProcessAfterInitialization() // 代理生成、AOP 織入點
9. Bean 就緒,可被注入其他 Bean / 獲取使用
10. 容器關閉 → 銷毀回調:
- DisposableBean.destroy()
- @PreDestroy
- 自定義 destroy-method
| 階段 | 接口/註解 | 典型用途 | 順序 |
|---|---|---|---|
| BeanDefinition 修改 | BeanFactoryPostProcessor | PropertyPlaceholderConfigurer、ConfigurationClassPostProcessor (掃描 @Configuration) | 1 (最早) |
| 實例化前 | InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation | 返回代理對象跳過默認實例化 | 2 |
| 屬性填充前 | InstantiationAwareBeanPostProcessor.postProcessPropertyValues | 修改/驗證注入值 | 3 |
| 屬性填充後 | — | — | 4 |
| Aware 回調 | BeanNameAware / BeanFactoryAware / ApplicationContextAware 等 | 獲取容器上下文資源 | 5 |
| 初始化前 | BeanPostProcessor.postProcessBeforeInitialization | 初始化前增強、驗證 | 6 |
| 初始化 | InitializingBean / @PostConstruct / init-method | 資源獲取、連接池啟動、緩存預熱 | 7 |
| 初始化後 | BeanPostProcessor.postProcessAfterInitialization | **AOP 代理創建**、對象包裝 | 8 (關鍵) |
| 銷毀 | DisposableBean / @PreDestroy / destroy-method | 資源釋放、連接關閉 | 容器關閉時 |
@Component
public class LifecycleBean implements
BeanNameAware, BeanFactoryAware, ApplicationContextAware,
InitializingBean, DisposableBean {
@PostConstruct
public void postConstruct() { log.info("@PostConstruct"); }
@PreDestroy
public void preDestroy() { log.info("@PreDestroy"); }
@Override public void setBeanName(String name) { log.info("BeanNameAware: {}", name); }
@Override public void setBeanFactory(BeanFactory bf) { log.info("BeanFactoryAware"); }
@Override public void setApplicationContext(ApplicationContext ctx) { log.info("ApplicationContextAware"); }
@Override public void afterPropertiesSet() { log.info("InitializingBean"); }
@Override public void destroy() { log.info("DisposableBean"); }
// XML init-method/destroy-method 同理
}
@Component
public class RequestContextInjector implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof BaseService) {
((BaseService) bean).setRequestContextHolder(RequestContextHolder.currentRequestAttributes());
}
return bean;
}
}
@Component
public class DynamicBeanRegistrar implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) {
// 運行時根據條件註冊 BeanDefinition
if (someCondition()) {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(DynamicService.class);
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
bf.registerBeanDefinition("dynamicService", bd);
}
}
}
destroy() 或用 @Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS) 配合自定義銷毀邏輯。@SpringBootApplication
public class App {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args);
// 註冊關閉鉤子,確保 destroy-method/@PreDestroy 執行
ctx.registerShutdownHook();
}
}
Spring Bean 生命周期是 **「實例化 → 填充 → Aware → 初始化(前/後置處理器環繞) → 就緒 → 銷毀」** 的標準化流程。掌握 **各階段執行順序、Aware 接口用途、BeanPostProcessor 代理生成時機、原型 Bean 銷毀責任**,即可精準控制 Bean 行為、排查循環依賴、實現框架級擴展。