一、Bean 生命周期的核心階段
1. 實例化(Instantiation)
? 觸發時機:容器啟動時(單例 Bean)或請求時(原型 Bean)。
? 實現方式:
通過反射(Class.newInstance()
或構造器)創建 Bean 的實例。
2. 屬性賦值(Population)
? 依賴注入:
通過字段注入(@Autowired
)、Setter 注入或構造器注入為 Bean 的屬性賦值。
? 處理 Aware 接口:
若 Bean 實現了 BeanNameAware
、BeanFactoryAware
等接口,容器會回調對應方法。
public class MyBean implements BeanNameAware {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // 獲取 Bean 的名稱}
}
3. BeanPostProcessor 的前置處理
? 調用 postProcessBeforeInitialization
:
在 Bean 初始化前執行自定義邏輯(如修改 Bean 屬性)。
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 對 Bean 進行前置處理return bean;}
}
4. 初始化(Initialization)
? @PostConstruct
注解方法:
標記在方法上,容器會調用該方法。
@PostConstruct
public void init() {// 初始化邏輯
}
? InitializingBean
接口:
實現 afterPropertiesSet()
方法。
public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {// 屬性賦值完成后執行}
}
? XML 配置的 init-method
:
在 XML 中指定初始化方法。
<bean id="myBean" class="com.example.MyBean" init-method="customInit"/>
5. BeanPostProcessor 的后置處理
? 調用 postProcessAfterInitialization
:
在 Bean 初始化后執行自定義邏輯(如生成代理對象)。
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {// 對 Bean 進行后置處理(如 AOP 代理)return bean;
}
6. Bean 就緒(In Use)
? 業務使用階段:
Bean 被應用程序代碼調用,執行業務邏輯。
7. 銷毀(Destruction)
? @PreDestroy
注解方法:
標記在方法上,容器銷毀前調用。
@PreDestroy
public void cleanup() {// 釋放資源邏輯
}
? DisposableBean
接口:
實現 destroy()
方法。
public class MyBean implements DisposableBean {@Overridepublic void destroy() {// 容器銷毀時執行}
}
? XML 配置的 destroy-method
:
在 XML 中指定銷毀方法。
<bean id="myBean" class="com.example.MyBean" destroy-method="customDestroy"/>
二、生命周期的完整流程圖
實例化 → 屬性賦值 → BeanPostProcessor前置處理 → 初始化 → BeanPostProcessor后置處理 → 使用 → 銷毀
三、擴展點與高級特性
1. Aware 接口
? 作用:讓 Bean 感知容器環境。
? 常見接口:
? BeanNameAware
:獲取 Bean 的名稱。
? BeanFactoryAware
:獲取 BeanFactory 引用。
? ApplicationContextAware
:獲取 ApplicationContext 引用。
2. BeanPostProcessor
? 核心用途:
在 Bean 初始化前后插入自定義邏輯(如 AOP 代理、屬性加密)。
? 典型場景:
Spring AOP 通過 AbstractAutoProxyCreator
(BeanPostProcessor 的子類)生成代理對象。
3. BeanFactoryPostProcessor
? 作用:
在 Bean 定義加載后、實例化前修改 Bean 的定義(如修改屬性值)。
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {BeanDefinition beanDef = beanFactory.getBeanDefinition("myBean");beanDef.getPropertyValues().add("property", "newValue");}
}
4. 作用域對生命周期的影響
? 單例(Singleton):
容器啟動時創建,容器關閉時銷毀。
? 原型(Prototype):
每次請求時創建,容器不管理其銷毀。
? 其他作用域:
? Request/Session(Web 環境):生命周期與請求或會話綁定。
? 自定義作用域:通過 Scope
接口擴展。
四、示例代碼:完整生命周期演示
1. Bean 類
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // BeanNameAware 回調}@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct 方法調用");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean.afterPropertiesSet() 調用");}public void customInit() {System.out.println("XML init-method 調用");}@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy 方法調用");}@Overridepublic void destroy() {System.out.println("DisposableBean.destroy() 調用");}public void customDestroy() {System.out.println("XML destroy-method 調用");}
}
2. BeanPostProcessor
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessBeforeInitialization() 調用");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessAfterInitialization() 調用");}return bean;}
}
3. 輸出結果
實例化 LifecycleBean
BeanNameAware.setBeanName() 調用
BeanPostProcessor.postProcessBeforeInitialization() 調用
@PostConstruct 方法調用
InitializingBean.afterPropertiesSet() 調用
XML init-method 調用
BeanPostProcessor.postProcessAfterInitialization() 調用
...(Bean 使用階段)...
@PreDestroy 方法調用
DisposableBean.destroy() 調用
XML destroy-method 調用
五、總結
- 核心階段:實例化 → 屬性注入 → 初始化 → 銷毀。
- 關鍵擴展點:
? Aware 接口(獲取容器信息)。
?BeanPostProcessor
(初始化前后處理)。
?@PostConstruct
/@PreDestroy
(注解回調)。
?InitializingBean
/DisposableBean
(接口回調)。 - 作用域影響:單例和原型 Bean 的生命周期差異。
- 設計思想:通過回調接口和擴展點實現松耦合和可定制化。
通過掌握 Bean 的生命周期,可以更好地利用 Spring 的擴展能力(如自定義初始化、資源管理),同時避免因生命周期管理不當導致的資源泄漏或狀態錯誤。