蛋糕網(wǎng)站內(nèi)容規(guī)劃網(wǎng)絡營銷工程師是做什么的
Spring Bean 的生命周期涉及多個階段,從實例化到銷毀,在開發(fā)中我們可以通過各種接口和注解介入這些階段來定制化自己的功能。以下是詳細的生命周期流程:
1. Bean 的實例化(Instantiation)
- 方式:通過構造函數(shù)或工廠方法創(chuàng)建 Bean 的實例。
- 觸發(fā)條件:容器啟動時,根據(jù)配置(如
@Component
、XML 配置等)創(chuàng)建 Bean。 - 關鍵點:此時 Bean 的屬性尚未注入。
2. 屬性賦值(Population of Properties)
- 依賴注入:通過
@Autowired
、Setter 方法、XML 配置的<property>
等方式注入依賴。 - 處理
@Value
:解析并注入外部化配置(如application.properties
)。
3. Aware 接口回調(diào)
Bean 可以通過實現(xiàn) Aware
接口獲取容器信息:
BeanNameAware
:獲取 Bean 的名稱。BeanFactoryAware
:獲取BeanFactory
實例。ApplicationContextAware
:獲取ApplicationContext
實例。EnvironmentAware
:獲取環(huán)境變量和配置。
public class MyBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {// 獲取 Bean 的名稱}
}
4. BeanPostProcessor 的前置處理
- 接口:
BeanPostProcessor.postProcessBeforeInitialization()
- 作用:在初始化方法(如
@PostConstruct
)之前執(zhí)行自定義邏輯。 - 典型應用:AOP 代理的生成、監(jiān)控埋點等。
5. 初始化(Initialization)
初始化邏輯按順序執(zhí)行:
@PostConstruct
注解:JSR-250 標準,標記初始化方法。InitializingBean.afterPropertiesSet()
:Spring 提供的初始化接口。- 自定義
init-method
:通過 XML 或@Bean(initMethod = "init")
指定。
public class MyBean {@PostConstructpublic void postConstruct() {// 初始化邏輯}public void init() {// XML 或 @Bean 指定的初始化方法}
}
6. BeanPostProcessor 的后置處理
- 接口:
BeanPostProcessor.postProcessAfterInitialization()
- 作用:在初始化方法之后執(zhí)行自定義邏輯。
- 典型應用:最終代理對象的包裝(如 Spring AOP)。
7. Bean 就緒(Ready)
- 此時 Bean 已完全初始化,可被應用程序使用。
- 作用域影響:
- Singleton:容器中只有一個實例。
- Prototype:每次請求都生成新實例(銷毀需手動處理)。
- 其他作用域(Request、Session 等):生命周期與會話或請求綁定。
8. 銷毀(Destruction)
銷毀邏輯按順序執(zhí)行:
@PreDestroy
注解:JSR-250 標準,標記銷毀方法。DisposableBean.destroy()
:Spring 提供的銷毀接口。- 自定義
destroy-method
:通過 XML 或@Bean(destroyMethod = "destroy")
指定。
public class MyBean {@PreDestroypublic void preDestroy() {// 銷毀邏輯}public void destroy() {// XML 或 @Bean 指定的銷毀方法}
}
完整生命周期流程圖
實例化 → 屬性注入 → Aware 接口 → BeanPostProcessor 前置處理 →
@PostConstruct → InitializingBean → init-method →
BeanPostProcessor 后置處理 → 使用中 →
@PreDestroy → DisposableBean → destroy-method
擴展點與注意事項
BeanFactoryPostProcessor
:- 在 Bean 定義加載后、實例化前修改 Bean 的定義(如修改屬性值)。
BeanDefinitionRegistryPostProcessor
:- 更早階段注冊額外的 Bean 定義。
- 作用域差異:
- Prototype Bean 的銷毀需手動調(diào)用
ctx.getBeanFactory().destroyBean(bean)
。
- Prototype Bean 的銷毀需手動調(diào)用
- 循環(huán)依賴:
- 通過三級緩存解決(僅限 Singleton Bean)。
示例代碼
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String name;@Overridepublic void setBeanName(String name) {this.name = name; // BeanNameAware 回調(diào)}@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct 方法");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean.afterPropertiesSet()");}public void customInit() {System.out.println("自定義 init-method");}@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy 方法");}@Overridepublic void destroy() {System.out.println("DisposableBean.destroy()");}public void customDestroy() {System.out.println("自定義 destroy-method");}
}
通過理解 Spring Bean 的生命周期,我們可以更精準地控制 Bean 的初始化與銷毀過程,優(yōu)化資源管理和擴展框架功能。