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

?Spring?中?Bean?的生命周期詳解

 更新時間:2022年09月13日 09:38:40   作者:Java中文社群???????  
這篇文章主要介紹了Spring中Bean的生命周期詳解,Java中的公共類稱之為Bean或Java?Bean,而Spring中的Bean指的是將對象的生命周期

前言

Java 中的公共類稱之為 Bean 或 Java Bean,而 Spring 中的 Bean 指的是將對象的生命周期,交個 Spring IoC 容器來管理的對象。所以 Spring 中的 Bean 對象在使用時,無需通過 new 來創(chuàng)建對象,只需要通過 DI(依賴注入),從 Spring 中取出要使用的對象即可。 那么 Spring 中,Bean 的生命周期又有哪些呢?接下來,我們一起來看。

1.Bean 生命周期

Spring 中 Bean 的生命周期是指:Bean 在 Spring(IoC)中從創(chuàng)建到銷毀的整個過程。

 Spring 中 Bean 的生命周期主要包含以下 5 部分:

  • 實例化:為 Bean 分配內(nèi)存空間;
  • 設(shè)置屬性:將當(dāng)前類依賴的 Bean 屬性,進(jìn)行注入和裝配;
  • 初始化:
    • 執(zhí)行各種通知;
    • 執(zhí)行初始化的前置方法;
    • 執(zhí)行初始化方法;
    • 執(zhí)行初始化的后置方法。
  • 使用 Bean:在程序中使用 Bean 對象;
  • 銷毀 Bean:將 Bean 對象進(jìn)行銷毀操作。

以上生命周期中,需要注意的是:“實例化”和“初始化”是兩個完全不同的過程,千萬不要搞混,實例化只是給 Bean 分配了內(nèi)存空間,而初始化則是將程序的執(zhí)行權(quán),從系統(tǒng)級別轉(zhuǎn)換到用戶級別,并開始執(zhí)行用戶添加的業(yè)務(wù)代碼

2.代碼演示

接下來我們使用代碼的方式在 Spring Boot 中,給大家演示一下 Bean 的生命周期。

PS:因為 Spring Boot 是基于 Spring 創(chuàng)建的,所以 Bean 在 Spring 或 Spring Boot 中的行為都是一致的,而 Spring Boot 又是目前主流的框架,所以本文使用 Spring Boot 來演示 Bean 的生命周期。

首先,我們創(chuàng)建一個 Bean 對象,起名為 BeanLifeComponent(類命無所謂,可隨意指定),它的具體實現(xiàn)代碼如下:

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class BeanLifeComponent implements BeanNameAware {
    public void setBeanName(String s) {
        System.out.println("執(zhí)行 BeanName 的通知方法");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("執(zhí)行初始化方法");
    }

    public void use() {
        System.out.println("使用 Bean");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("執(zhí)行銷毀方法");
    }
}

然后,我們再創(chuàng)建一個 MyBeanPostProcessor 類(類命無所謂,可隨意指定),來實現(xiàn)初始化的前置方法和初始化的后置方法,

具體實現(xiàn)代碼如下:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("beanLifeComponent")) {
            System.out.println("執(zhí)行初始化前置方法");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("beanLifeComponent")) {
            System.out.println("執(zhí)行初始化后置方法");
        }
        return bean;
    }
}

為什么要創(chuàng)建一個單獨的類來執(zhí)行初始化的前置方法和初始化的后置方法呢? 這是因為初始化的前置方法和后置方法是為所有 Bean 服務(wù)的,而非為某一個 Bean 服務(wù)的,所以這兩個方法不能寫在某個具體的 Bean 中,否則(這兩個方法)不會執(zhí)行。 最后,在 Spring Boot 的啟動類中獲取 Bean,

具體實現(xiàn)代碼如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        // 得到上下文對象,并啟動 Spring Boot 項目
        ConfigurableApplicationContext context = 
            SpringApplication.run(DemoApplication.class, args);
        // 獲取 Bean
        BeanLifeComponent component = context.getBean(BeanLifeComponent.class);
        // 使用 Bean
        component.use();
        // 停止 Spring Boot 項目
        context.close();
    }
}

以上程序最終的執(zhí)行結(jié)果如下圖所示: 

 從上面的執(zhí)行結(jié)果可以看出,代碼執(zhí)行順序符合 Bean 生命周期的執(zhí)行順序:

  • 實例化:為 Bean 分配內(nèi)存空間;
  • 設(shè)置屬性:將當(dāng)前類依賴的 Bean 屬性,進(jìn)行注入和裝配;
  • 初始化:
    • 執(zhí)行各種通知;
    • 執(zhí)行初始化的前置方法;
    • 執(zhí)行初始化方法;
    • 執(zhí)行初始化的后置方法。
  • 使用 Bean:在程序中使用 Bean 對象;
  • 銷毀 Bean:將 Bean 對象進(jìn)行銷毀操作。

那么問題來了,能不能先執(zhí)行初始化再執(zhí)行設(shè)置屬性呢?也就是將生命周期中的步驟 2 和步驟 3 的執(zhí)行順序交換一下? 答案是否定的。想象一個場景,如果在初始化方法中要用到被注入對象的某個方法,

比如以下代碼:

@Controller
public class UserController {
    @Resource
    private UserService userService;

    @PostConstruct // 初始化方法
    public void postConstruct() {
        userService.sayHi();
    }
}

此時如果先執(zhí)行步驟 2,先將 UserService 注入到當(dāng)前類,再調(diào)用步驟 3 執(zhí)行初始化,那么程序的執(zhí)行是正常的。然而如果將交互步驟 2 和步驟 3 的執(zhí)行順序,那么程序執(zhí)行就會報錯(空指針異常),所以 Bean 的生命周期的順序必須是:

1.實例化:為 Bean 分配內(nèi)存空間; 2.設(shè)置屬性:將當(dāng)前類依賴的 Bean 屬性,進(jìn)行注入和裝配; 3.初始化:

  • 執(zhí)行各種通知;
  • 執(zhí)行初始化的前置方法;
  • 執(zhí)行初始化方法;
  • 執(zhí)行初始化的后置方法。 4.使用 Bean:在程序中使用 Bean 對象; 5.銷毀 Bean:將 Bean 對象進(jìn)行銷毀操作。

總結(jié)

Bean 的生命周期指的是 Bean 在 Spring(IoC)中從創(chuàng)建到銷毀的整個過程。Bean 的生命周期主要包含以下 5 個流程:

1.實例化:為 Bean 分配內(nèi)存空間;

2.設(shè)置屬性:將當(dāng)前類依賴的 Bean 屬性,進(jìn)行注入和裝配;

3.初始化:

  • 執(zhí)行各種通知;
  • 執(zhí)行初始化的前置方法;
  • 執(zhí)行初始化方法;
  • 執(zhí)行初始化的后置方法。 4.使用 Bean:在程序中使用 Bean 對象; 5.銷毀 Bean:將 Bean 對象進(jìn)行銷毀操作。

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

相關(guān)文章

  • 詳解Java創(chuàng)建線程的五種常見方式

    詳解Java創(chuàng)建線程的五種常見方式

    Java中如何進(jìn)行多線程編程,如何使用多線程?不要擔(dān)心,本文將為你詳細(xì)介紹一下Java實現(xiàn)線程創(chuàng)建的五種常見方式,感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-01-01
  • 如何將JSP/Servlet項目轉(zhuǎn)換為Spring Boot項目

    如何將JSP/Servlet項目轉(zhuǎn)換為Spring Boot項目

    這篇文章主要介紹了如何將JSP/Servlet項目轉(zhuǎn)換為Spring Boot項目,幫助大家更好的利用springboot進(jìn)行網(wǎng)絡(luò)編程,感興趣的朋友可以了解下
    2020-10-10
  • Java實現(xiàn)常見的排序算法的示例代碼

    Java實現(xiàn)常見的排序算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)常見的排序算法(選擇排序、插入排序、希爾排序等)的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-10-10
  • SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式

    這篇文章主要介紹了SpringBoot validator參數(shù)驗證restful自定義錯誤碼響應(yīng)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JAVA中Comparable接口和自定義比較器示例講解

    JAVA中Comparable接口和自定義比較器示例講解

    這篇文章主要給大家介紹了關(guān)于JAVA中Comparable接口和自定義比較器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java爬蟲實現(xiàn)Jsoup利用dom方法遍歷Document對象

    Java爬蟲實現(xiàn)Jsoup利用dom方法遍歷Document對象

    本文主要介紹了Java爬蟲實現(xiàn)Jsoup利用dom方法遍歷Document對象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 淺談Java成員變量與屬性的區(qū)別(簡單最易懂的解釋)

    淺談Java成員變量與屬性的區(qū)別(簡單最易懂的解釋)

    下面小編就為大家?guī)硪黄獪\談Java成員變量與屬性的區(qū)別(簡單最易懂的解釋)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • springboot?集成dubbo的步驟詳解

    springboot?集成dubbo的步驟詳解

    這篇文章主要介紹了springboot?簡易集成dubbo的步驟詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 詳解用Eclipse如何創(chuàng)建Web項目

    詳解用Eclipse如何創(chuàng)建Web項目

    本篇文章主要介紹了詳解用Eclipse如何創(chuàng)建Web項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • java學(xué)習(xí)之junit單元測試案例(經(jīng)典版)

    java學(xué)習(xí)之junit單元測試案例(經(jīng)典版)

    這篇文章主要介紹了java學(xué)習(xí)之junit單元測試的相關(guān)資料,文中講解了JUnit單元測試的基本概念、作用、使用assert進(jìn)行驗證、覆蓋率分析、BeforeEach和AfterAll的使用、通過反射和注解實現(xiàn)測試,需要的朋友可以參考下
    2024-12-12

最新評論

个旧市| 丁青县| 嵊州市| 黔江区| 普兰店市| 临猗县| 屏东县| 尤溪县| 桦南县| 怀柔区| 驻马店市| 泰兴市| 竹山县| 汾西县| 梓潼县| 甘南县| 玛纳斯县| 南京市| 岗巴县| 龙游县| 固原市| 彰化市| 博湖县| 郴州市| 邵阳市| 荆门市| 柯坪县| 惠东县| 昆明市| 沐川县| 林州市| 庐江县| 谢通门县| 肥西县| 绥宁县| 遵化市| 迁安市| 德格县| 西充县| 布尔津县| 凤台县|