理解生命周期能精準控制初始化/銷毀邏輯、排查依賴注入順序問題、實現優雅啟動關閉。
setBeanName(String beanId)setBeanFactory(BeanFactory factory)setApplicationContext(ApplicationContext ctx) (BeanFactory 無此步)postProcessBeforeInitialization(bean, beanName)init-method="init" 或 InitializingBean.afterPropertiesSet()postProcessAfterInitialization(bean, beanName)DisposableBean.destroy() 或 destroy-method="close"
public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware, InitializingBean, ApplicationContextAware, DisposableBean {
private String content;
public HelloDaoImpl() { System.out.println("---實例化"); }
public void setContent(String content) { System.out.println("---依賴注入: " + content); this.content = content; }
@Override public void setBeanName(String beanId) { System.out.println("---BeanNameAware: " + beanId); }
@Override public void setBeanFactory(BeanFactory factory) { System.out.println("---BeanFactoryAware: " + factory.getClass()); }
@Override public void setApplicationContext(ApplicationContext ctx) { System.out.println("---ApplicationContextAware: " + ctx); }
@Override public void afterPropertiesSet() { System.out.println("---InitializingBean.afterPropertiesSet"); }
public void init() { System.out.println("---自定義 init-method"); }
@Override public void destroy() { System.out.println("---DisposableBean.destroy"); }
public void close() { System.out.println("---自定義 destroy-method"); }
}
public class BeanPostProcessorImpl implements BeanPostProcessor {
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("---前置處理: " + beanName); return bean;
}
@Override public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("---後置處理: " + beanName); return bean;
}
}
<bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"
scope="singleton" lazy-init="false"
init-method="init" destroy-method="close">
<property name="content" value="陳老師早上好!"/>
</bean>
<bean class="www.csdn.spring.dao.BeanPostProcessorImpl"/> <!-- 全局後置處理器 -->
public class BeanTest {
@Test public void test() {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-dao.xml");
ctx.close(); // 關鍵:觸發銷毀回調
}
}

factory.addBeanPostProcessor(new BeanPostProcessorImpl())factory.destroySingletons()getBean() 時才創建單例;ApplicationContext 啟動時預創建所有單例

| 特性 | ApplicationContext | BeanFactory |
|---|---|---|
| ApplicationContextAware | ✅ 支持 | ❌ 不支持 |
| BeanPostProcessor 註冊 | 自動掃描 | 手動 addBeanPostProcessor |
| 單例 Bean 創建時機 | 容器啟動時預創建 | 首次 getBean() 時懶創建 |
| 國際化/事件/資源加載 | 內置支持 | 需額外擴展 |
| 適用場景 | 企業級應用標準容器 | 測試、輕量級嵌入式 |
@PostConstruct / @PreDestroy (JSR-250) 替代接口/XML 配置SmartInitializingSingleton 在所有單例創建完後執行邏輯ApplicationListener<ContextRefreshedEvent> 監聽容器就緒事件ConfigurableApplicationContext.close() 或 Spring Boot SpringApplication.exit()掌握生命周期,讓 Bean 在正確時間做正確的事!