各位小猿,程序員小猿開發筆記,希望大家共同進步。
引言
1.整體流程圖
2.各階段分析
1??定義階段
1.1 定位資源
- Spring 掃描
@Component
、@Service
、@Controller
等注解的類 - 或解析 XML/Java Config 中的 Bean 定義
1.2定義 BeanDefinition
- 解析類信息(作用域、懶加載、初始化/銷毀方法等)
- 將解析結果封裝為
BeanDefinition
對象 - 存儲到
BeanDefinitionRegistry
(通常是DefaultListableBeanFactory
)
1.3發布到容器
BeanDefinition
注冊完成,但尚未實例化- 此時可通過
BeanFactory
獲取 Bean 的定義信息
發布,已經定義的bean到IOC容器中
1.4實例化bean
- 容器通過反射調用構造函數創建原始對象
- 若存在構造器依賴,優先解決循環依賴(三級緩存機制)
1.5完成相關依賴注入
- 處理
@Autowired
、@Value
、@Resource
等注解 - 填充普通屬性和集合類型
2??初始化
2.1setName方法
BeanNameAware.setBeanName()
2.2setBeanFactory
BeanFactoryAware.setBeanFactory()
2.3setApplicationContext
ApplicationContextAware.setApplicationContext()
2.4postProcessorBeforeInitislization()前置處理方法
BeanPostProcessor.postProcessBeforeInitialization()
- 典型應用:
@PostConstruct
注解處理、代理生成(如 AOP)
2.5調用 InitializingBean.afterPropertiesSet()
2.6執行自定義 init-method
(XML 或 @Bean(initMethod)
)
2.6BeanPostProcessor 后置處理
BeanPostProcessor.postProcessAfterInitialization()
- 典型應用:AOP 最終代理、監控增強
2.7postProcessorAfterInitislization()后置處理方法
3??準備使用
- Bean 正式服務于應用程序
- 所有依賴和方法均可正常使用
4??自定義銷毀方法
- 銷毀前置處理
DestructionAwareBeanPostProcessor.postProcessBeforeDestruction()
- 銷毀方法執行(按順序)
- 調用
@PreDestroy
注解方法 - 執行
DisposableBean.destroy()
- 執行自定義
destroy-method
(XML 或@Bean(destroyMethod)
)
- 調用
- 資源釋放
- 斷開數據庫連接
- 停止線程池
- 釋放文件句柄等資源
3.注意事項
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;// 1. 定義 Bean 類(演示所有生命周期接口)
class ProductService implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,InitializingBean, DisposableBean {private String productName;// 1.1 構造器(實例化階段)public ProductService() {System.out.println("🚀 1. 實例化階段: 調用構造器創建 ProductService 實例");}// 1.2 屬性注入(依賴注入階段)public void setProductName(String productName) {this.productName = productName;System.out.println("🔄 2. 依賴注入: setProductName() 注入屬性值: " + productName);}// 2.1 BeanNameAware 回調@Overridepublic void setBeanName(String name) {System.out.println("🔖 3.1 Aware 接口: setBeanName() → Bean ID: " + name);}// 2.2 BeanFactoryAware 回調@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("🏭 3.2 Aware 接口: setBeanFactory() → BeanFactory 已注入");}// 2.3 ApplicationContextAware 回調@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("🌐 3.3 Aware 接口: setApplicationContext() → ApplicationContext 已注入");}// 2.4 自定義初始化方法 (通過 @Bean 指定)public void customInit() {System.out.println("🔧 5.1 初始化: 執行 @Bean 指定的 customInit()");}// 2.5 @PostConstruct 方法@PostConstructpublic void postConstructInit() {System.out.println("🔧 4.1 初始化: 執行 @PostConstruct 方法");}// 2.6 InitializingBean 接口@Overridepublic void afterPropertiesSet() {System.out.println("🔧 5.2 初始化: 執行 InitializingBean.afterPropertiesSet()");}// 3. 業務方法public void displayProduct() {System.out.println("🛒 6. 使用階段: 當前產品 → " + productName);}// 4.1 @PreDestroy 方法@PreDestroypublic void preDestroy() {System.out.println("?? 7.1 銷毀階段: 執行 @PreDestroy 方法");}// 4.2 DisposableBean 接口@Overridepublic void destroy() {System.out.println("?? 7.2 銷毀階段: 執行 DisposableBean.destroy()");}// 4.3 自定義銷毀方法 (通過 @Bean 指定)public void customDestroy() {System.out.println("?? 7.3 銷毀階段: 執行 @Bean 指定的 customDestroy()");}
}// 2. 自定義 BeanPostProcessor(演示擴展點)
class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ProductService) {System.out.println("?? 4. 初始化前: BeanPostProcessor.postProcessBeforeInitialization()");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ProductService) {System.out.println("?? 5.3 初始化后: BeanPostProcessor.postProcessAfterInitialization()");}return bean;}
}// 3. Spring 配置類
@Configuration
class AppConfig {@Bean(initMethod = "customInit", destroyMethod = "customDestroy")public ProductService productService() {ProductService service = new ProductService();service.setProductName("iPhone 15"); // 屬性注入return service;}@Beanpublic CustomBeanPostProcessor customBeanPostProcessor() {return new CustomBeanPostProcessor();}
}// 4. 主應用類
public class BeanLifecycleDemo {public static void main(String[] args) {System.out.println("============ 啟動 Spring 容器 ============");AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println("\n============ 使用階段 ============");ProductService productService = context.getBean(ProductService.class);productService.displayProduct();System.out.println("\n============ 關閉 Spring 容器 ============");context.close(); // 觸發銷毀階段}
}
輸出結果展示
============ 啟動 Spring 容器 ============
🚀 1. 實例化階段: 調用構造器創建 ProductService 實例
🔄 2. 依賴注入: setProductName() 注入屬性值: iPhone 15
🔖 3.1 Aware 接口: setBeanName() → Bean ID: productService
🏭 3.2 Aware 接口: setBeanFactory() → BeanFactory 已注入
🌐 3.3 Aware 接口: setApplicationContext() → ApplicationContext 已注入
?? 4. 初始化前: BeanPostProcessor.postProcessBeforeInitialization()
🔧 4.1 初始化: 執行 @PostConstruct 方法
🔧 5.1 初始化: 執行 @Bean 指定的 customInit()
🔧 5.2 初始化: 執行 InitializingBean.afterPropertiesSet()
?? 5.3 初始化后: BeanPostProcessor.postProcessAfterInitialization()============ 使用階段 ============
🛒 6. 使用階段: 當前產品 → iPhone 15============ 關閉 Spring 容器 ============
?? 7.1 銷毀階段: 執行 @PreDestroy 方法
?? 7.2 銷毀階段: 執行 DisposableBean.destroy()
?? 7.3 銷毀階段: 執行 @Bean 指定的 customDestroy()
生命周期階段詳解:
- 實例化階段
- 調用構造函數創建 Bean 實例
- 依賴注入
- 通過 setter 或字段注入屬性值
- Aware 接口回調(按順序)
BeanNameAware
→BeanFactoryAware
→ApplicationContextAware
- 初始化前處理
BeanPostProcessor.postProcessBeforeInitialization()
- 初始化階段(按順序)
@PostConstruct
方法 → 自定義init-method
→InitializingBean.afterPropertiesSet()
- 初始化后處理
BeanPostProcessor.postProcessAfterInitialization()
(如 AOP 代理在此生成)
- 使用階段
- Bean 完全初始化,可被應用程序使用
- 銷毀階段(容器關閉時)
@PreDestroy
→DisposableBean.destroy()
→ 自定義destroy-method
關鍵點說明:
- 執行順序:初始化方法按
@PostConstruct
→InitializingBean
→init-method
順序執行 - 擴展點:
BeanPostProcessor
可干預初始化過程(如 AOP、事務代理) - 銷毀順序:與初始化順序相反(棧結構)
- 作用域影響:原型(prototype) Bean 不執行銷毀方法?