深度解析Spring Bean生命周期的各個(gè)階段
概述
Spring Bean的生命周期是Spring框架的核心概念之一,理解Bean從創(chuàng)建到銷毀的整個(gè)過程對于開發(fā)高質(zhì)量的Spring應(yīng)用程序至關(guān)重要。本文將詳細(xì)梳理Spring Bean生命周期的各個(gè)階段,并通過代碼示例展示每個(gè)關(guān)鍵節(jié)點(diǎn)。
Spring Bean生命周期階段
1. 實(shí)例化階段
Spring容器通過構(gòu)造函數(shù)或工廠方法創(chuàng)建Bean實(shí)例
public class ExampleBean {
public ExampleBean() {
System.out.println("1. Bean實(shí)例化 - 構(gòu)造函數(shù)執(zhí)行");
}
}2. 屬性賦值階段
Spring容器注入Bean的屬性和依賴
public class ExampleBean {
private String name;
private AnotherBean anotherBean;
// Setter方法用于屬性注入
public void setName(String name) {
System.out.println("2. 屬性注入 - name: " + name);
this.name = name;
}
public void setAnotherBean(AnotherBean anotherBean) {
System.out.println("2. 依賴注入 - anotherBean");
this.anotherBean = anotherBean;
}
}3. Aware接口回調(diào)階段
Bean實(shí)現(xiàn)Aware接口獲取容器資源
public class ExampleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {
@Override
public void setBeanName(String name) {
System.out.println("3. BeanNameAware - Bean名稱: " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3. BeanFactoryAware - BeanFactory注入");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("3. ApplicationContextAware - ApplicationContext注入");
}
}4. BeanPostProcessor前置處理
BeanPostProcessor的postProcessBeforeInitialization方法
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ExampleBean) {
System.out.println("4. BeanPostProcessor前置處理 - " + beanName);
}
return bean;
}
}5. 初始化階段
@PostConstruct注解方法
public class ExampleBean {
@PostConstruct
public void postConstruct() {
System.out.println("5.1 @PostConstruct方法執(zhí)行");
}
}InitializingBean接口
public class ExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5.2 InitializingBean.afterPropertiesSet()執(zhí)行");
}
}自定義init方法
public class ExampleBean {
public void customInit() {
System.out.println("5.3 自定義init方法執(zhí)行");
}
}
// 配置類中指定init方法
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit")
public ExampleBean exampleBean() {
return new ExampleBean();
}
}6. BeanPostProcessor后置處理
BeanPostProcessor的postProcessAfterInitialization方法
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ExampleBean) {
System.out.println("6. BeanPostProcessor后置處理 - " + beanName);
}
return bean;
}
}7. Bean使用階段
Bean完全初始化,可供應(yīng)用程序使用
@Service
public class BusinessService {
private final ExampleBean exampleBean;
public BusinessService(ExampleBean exampleBean) {
this.exampleBean = exampleBean;
}
public void doBusiness() {
System.out.println("7. Bean使用階段 - 執(zhí)行業(yè)務(wù)邏輯");
}
}8. 銷毀階段
@PreDestroy注解方法
public class ExampleBean {
@PreDestroy
public void preDestroy() {
System.out.println("8.1 @PreDestroy方法執(zhí)行");
}
}DisposableBean接口
public class ExampleBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("8.2 DisposableBean.destroy()執(zhí)行");
}
}自定義destroy方法
public class ExampleBean {
public void customDestroy() {
System.out.println("8.3 自定義destroy方法執(zhí)行");
}
}
// 配置類中指定destroy方法
@Configuration
public class AppConfig {
@Bean(destroyMethod = "customDestroy")
public ExampleBean exampleBean() {
return new ExampleBean();
}
}完整示例代碼
1. 定義Bean類
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class LifecycleBean implements BeanNameAware, BeanFactoryAware,
ApplicationContextAware, InitializingBean, DisposableBean {
private String name;
private AnotherBean anotherBean;
public LifecycleBean() {
System.out.println("1. 構(gòu)造函數(shù)執(zhí)行 - Bean實(shí)例化");
}
public void setName(String name) {
System.out.println("2. 屬性注入 - name: " + name);
this.name = name;
}
public void setAnotherBean(AnotherBean anotherBean) {
System.out.println("2. 依賴注入 - anotherBean");
this.anotherBean = anotherBean;
}
@Override
public void setBeanName(String name) {
System.out.println("3. BeanNameAware - Bean名稱: " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3. BeanFactoryAware - BeanFactory注入");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("3. ApplicationContextAware - ApplicationContext注入");
}
@PostConstruct
public void postConstruct() {
System.out.println("5.1 @PostConstruct方法執(zhí)行");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5.2 InitializingBean.afterPropertiesSet()執(zhí)行");
}
public void customInit() {
System.out.println("5.3 自定義init方法執(zhí)行");
}
public void doSomething() {
System.out.println("7. Bean使用階段 - 執(zhí)行業(yè)務(wù)方法");
}
@PreDestroy
public void preDestroy() {
System.out.println("8.1 @PreDestroy方法執(zhí)行");
}
@Override
public void destroy() throws Exception {
System.out.println("8.2 DisposableBean.destroy()執(zhí)行");
}
public void customDestroy() {
System.out.println("8.3 自定義destroy方法執(zhí)行");
}
}2. 配置BeanPostProcessor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifecycleBean) {
System.out.println("4. BeanPostProcessor前置處理 - " + beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifecycleBean) {
System.out.println("6. BeanPostProcessor后置處理 - " + beanName);
}
return bean;
}
}3. 配置類
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public LifecycleBean lifecycleBean() {
LifecycleBean bean = new LifecycleBean();
bean.setName("示例Bean");
return bean;
}
@Bean
public AnotherBean anotherBean() {
return new AnotherBean();
}
}4. 測試類
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class LifecycleTest {
public static void main(String[] args) {
System.out.println("Spring容器啟動(dòng)...");
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println("\n獲取Bean并執(zhí)行業(yè)務(wù)方法...");
LifecycleBean bean = context.getBean(LifecycleBean.class);
bean.doSomething();
System.out.println("\nSpring容器關(guān)閉...");
context.close();
System.out.println("程序結(jié)束");
}
}生命周期流程圖
Bean生命周期完整流程:
1. 實(shí)例化 → 2. 屬性賦值 → 3. Aware接口回調(diào) → 4. BeanPostProcessor前置處理 →
5. 初始化(@PostConstruct → InitializingBean → 自定義init) → 6. BeanPostProcessor后置處理 →
7. Bean就緒可用 → 8. 銷毀(@PreDestroy → DisposableBean → 自定義destroy)
總結(jié)
Spring Bean的生命周期是一個(gè)復(fù)雜但有序的過程,理解每個(gè)階段的執(zhí)行順序和用途對于:
- 調(diào)試和問題排查:能夠快速定位Bean初始化相關(guān)的問題
- 擴(kuò)展功能:通過BeanPostProcessor等機(jī)制擴(kuò)展Spring功能
- 資源管理:正確管理數(shù)據(jù)庫連接、線程池等資源
- 性能優(yōu)化:合理使用各種初始化機(jī)制提升應(yīng)用性能
到此這篇關(guān)于Spring Bean生命周期全面解析的文章就介紹到這了,更多相關(guān)Spring Bean生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Android觸摸事件分發(fā)的原理詳析
觸摸事件分發(fā)機(jī)制一直以來都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下2022-01-01
Mybatis MapperScannerConfigurer自動(dòng)掃描Mapper接口生成代理注入到Spring的方法
這篇文章主要給大家介紹了關(guān)于Mybatis MapperScannerConfigurer自動(dòng)掃描將Mapper接口生成代理注入到Spring的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2019-03-03
SpringBoot結(jié)合Vue實(shí)現(xiàn)Python在線調(diào)試器
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)合Vue實(shí)現(xiàn)Python在線調(diào)試器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-01-01
java HashMap和HashTable的區(qū)別詳解
這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12

