最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度解析Spring Bean生命周期的各個(gè)階段

 更新時(shí)間:2025年09月23日 09:30:07   作者:猿究院-陸昱澤  
本文將詳細(xì)梳理Spring Bean生命周期的各個(gè)階段,并通過代碼示例展示每個(gè)關(guān)鍵節(jié)點(diǎn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

概述

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í)行順序和用途對于:

  1. 調(diào)試和問題排查:能夠快速定位Bean初始化相關(guān)的問題
  2. 擴(kuò)展功能:通過BeanPostProcessor等機(jī)制擴(kuò)展Spring功能
  3. 資源管理:正確管理數(shù)據(jù)庫連接、線程池等資源
  4. 性能優(yōu)化:合理使用各種初始化機(jī)制提升應(yīng)用性能

到此這篇關(guān)于Spring Bean生命周期全面解析的文章就介紹到這了,更多相關(guān)Spring Bean生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Android觸摸事件分發(fā)的原理詳析

    關(guān)于Android觸摸事件分發(fā)的原理詳析

    觸摸事件分發(fā)機(jī)制一直以來都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • java實(shí)現(xiàn)點(diǎn)贊功能

    java實(shí)現(xiàn)點(diǎn)贊功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)點(diǎn)贊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java中的四種單例模式淺析

    Java中的四種單例模式淺析

    這篇文章主要給大家介紹了關(guān)于Java中四種單例模式的相關(guān)資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內(nèi)部類等四種,分別給出了詳細(xì)的示例代碼和介紹,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Kosaraju算法詳解

    Kosaraju算法詳解

    這篇文章主要為大家詳細(xì)介紹了Kosaraju算法,Kosaraju算法可以計(jì)算出一個(gè)有向圖的強(qiáng)連通分量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java-lambda表達(dá)式入門看這一篇就夠了

    Java-lambda表達(dá)式入門看這一篇就夠了

    lambda表達(dá)式最簡單的作用就是用于簡化創(chuàng)建匿名內(nèi)部類對象,Lambda表達(dá)式是一個(gè)可傳遞的代碼塊,可以在以后執(zhí)行一次或多次,下面通過本文給大家介紹Java-lambda表達(dá)式入門教程,感興趣的朋友一起看看吧
    2021-05-05
  • Mybatis MapperScannerConfigurer自動(dòng)掃描Mapper接口生成代理注入到Spring的方法

    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)試器

    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
  • 一文帶你探究Spring中Bean的線程安全性問題

    一文帶你探究Spring中Bean的線程安全性問題

    很多人都想spring中的bean是線程安全的嗎?本文將帶你探究Spring中Bean的線程安全性問題,感興趣的同學(xué)可以參考閱讀下
    2023-05-05
  • java  HashMap和HashTable的區(qū)別詳解

    java HashMap和HashTable的區(qū)別詳解

    這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • OpenJDK源碼調(diào)試圖文教程

    OpenJDK源碼調(diào)試圖文教程

    這篇文章主要介紹了OpenJDK源碼調(diào)試,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評論

鄯善县| 临汾市| 毕节市| 乐东| 伊通| 晋宁县| 澄迈县| 常山县| 白河县| 榆树市| 蓝山县| 如东县| 丹棱县| 西峡县| 德格县| 太保市| 通辽市| 河南省| 思茅市| 潮州市| 马关县| 汨罗市| 武定县| 黄梅县| 内江市| 剑川县| 罗山县| 固阳县| 巴林右旗| 内乡县| 宝清县| 亳州市| 崇仁县| 邓州市| 定陶县| 延津县| 榕江县| 牟定县| 灌云县| 汶川县| 罗山县|