欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Bean生命周期詳細分析

 更新時間:2022年08月16日 09:41:23   作者:飄飄~  
spring的核心思想之一IOC就是通過IOC容器對Bean的創(chuàng)建和各個bean之間的依賴關系進行操作,今天就來和大家分享一下bean的生命周期相關知識點

前言

Bean的生命周期分為實例化Instantiation、屬性賦值Populate、初始化Initalization、銷毀Destruction,下面我將從這四個方面深入分享Bean的生命周期。

一、Bean的介紹

我們首先來看看spring的兩大核心思想IOC(控制反轉),DI(依賴注入)和AOP (面向切面編程)

IOC(控制反轉):是Spring框架的核心思想之一,主要用于解耦。I0C是指將創(chuàng)建對象的控制權轉移給Spring框架進行管理。由Spring框架根據(jù)配置文件或注解等元數(shù)據(jù),創(chuàng)建bean對象并管理各個bean對象之間的依賴關系。使對象之間形成松散耦合的關系,利于解耦。

DI(依賴注入):是對IOC概念的不同角度的描述,是指應用程序在運行時,每一個bean對象都依賴IOC容器注入當前bean對象所需要的另外一-個bean對象。(例如在MyBatis整合Spring時,SqISessionFactoryBean依賴容器注入-個DataSource數(shù)據(jù)源)

IOC容器:IOC容器屬于SpringCore模塊,是用來創(chuàng)建和管理Bean的地方,以默認單例的方式將bean存儲在以ConcurrentHashMap的形式存儲了BeanDefinition對象,該對象封裝了Spring對一個Bean所有信息的定義,包括類名,屬性,構造方法參數(shù),依賴,是否延遲加載,是否單例等,之后對Bean的操作都是直接對它進行的。

IOC容器的初始化分三個步驟:

  • BeanDefinition的資源定位
  • BeanDefinition的資源的載入和解析
  • BeanDefinition的注冊

AOP (面向切面編程):SpringAOP基于動態(tài)代理實現(xiàn)。能夠將那些與業(yè)務無關,卻為業(yè)務模塊所共同調(diào)用的邏輯(例如事務處理、日志管理、權限控制等)封裝抽取成一個可重用的模塊,這個模塊被命名為“切面”(Aspect),便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性;

什么是Bean

bean是計算機自動生成的類,bean是一個由SpringIoC容器實例化、組裝和管理的對象。也就是說,bean并不是程序員編輯的,而是程序運行時,由spring通過反射生成的

Bean的生命周期

實例化->屬性賦值->初始化->銷毀

Bean的作用域

singleton : 唯一 bean 實例,Spring 中的 bean 默認都是單例的。

prototype : 每次請求都會創(chuàng)建一個新的 bean 實例。

request : 每一次 HTTP 請求都會產(chǎn)生一個新的 bean,該 bean 僅在當前 HTTP request 內(nèi)有效。

session : 每一次 HTTP 請求都會產(chǎn)生一個新的 bean,該 bean 僅在當前 HTTP session 內(nèi)有效。

global-session: 全局 session 作用域,僅僅在基于 Portlet 的 web 應用中才有意義,Spring5 已經(jīng)沒有了。Portlet 是能夠生成語義代碼(例如:HTML)片段的小型 Java Web 插件。它們基于 portlet 容器,可以像 servlet 一樣處理 HTTP 請求。但是,與 servlet 不同,每個 portlet 都有不同的會話。

二、詳細過程

實例化和屬性賦值分別對應構造方法和setter方法的注入,初始化和銷毀是用戶能自定義擴展的兩個階段。

可通過查源碼的方式發(fā)現(xiàn),他們都在doCreate()方法中,如下:

//可通過查源碼的方式發(fā)現(xiàn),他們都在doCreate()方法中,
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {
   // Instantiate the bean.
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 實例化階段!
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }
   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
       // 屬性賦值階段!
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化階段!
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }
}

1. Bean的實例化

Spring對Bean進行實例化(相當于 new XXX()),對于 BeanFactory一般是延遲實例化,就是說調(diào)用 getBean方法才會實例化,但是對于 ApplicationContext,當容器初始化完成之后,就完成了所有Bean的實例化工作。實例化的對象被包裝在 BeanWrapper對象中, BeanWrapper提供了設置對象屬性的接口,從而避免了使用反射機制設置屬性。

2. InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor這個接口主要是幫助你在Bean實例化之前做一些操作。它繼承自 BeanPostProcessor接口,其中 postProcessBeforeInstantiation()方法是在目標對象實例化之前調(diào)用的方法,可以返回目標實例的一個代理用來代替目標實例。postProcessPropertyValues方法是在屬性值被設置到目標實例之前調(diào)用,可以修改屬性的設值。

3. 設置屬性(依賴注入)

實例化后的對象被封裝到 BeanWrapper對象中,并且此時對象是一個原生狀態(tài),并沒有執(zhí)行依賴注入。緊接著,Spring根據(jù) BeanDefinition中的信息進行依賴注入。并且通過 BeanWrapper提供的設置屬性的接口完成依賴注入。

4. 注入Aware接口

Spring 會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關的xxxAware實例注入給Bean。各種各樣的Aware接口,其作用就是在對象實例化完成后將Aware接口定義中規(guī)定的依賴注入到當前實例中。比較常見的 ApplicationContextAware接口,實現(xiàn)了這個接口的類都可以獲取到一個 ApplicationContext對象,當容器中每個對象的實例化過程走到 BeanPostProcessor前置處理這一步時,容器會檢測到之前注冊到容器的 ApplicationContextAwareProcessor,然后就會調(diào)用其 postProcessorBeforeInitialization()方法,檢查并設置Aware相關的依賴。

5. BeanPostProcessor的postProcessBeforeInitialzation方法

經(jīng)過上述步驟后,Bean對象已經(jīng)被正確構造了,如果你想要對象被使用之前在進行自定義的處理,可以通過 BeanPostProcessor接口實現(xiàn)。該接口提供了兩個方法 其中 postProcessBeforeInitialzation(Objectbean,StringbeanName) 方法;當前正在初始化的bean對象會被傳遞進來,我們就可以對這個Bean做任何處理,這個方法會先于 InitializingBean執(zhí)行,因此稱為前置處理。

6. InitializingBean與init-method

如果Bean實現(xiàn)了 InitializingBean接口,Spring將調(diào)用它們的 afterPropertiesSet方法,作用與在配置文件中對Bean使用 init-method聲明初始化的作用一樣,都是在Bean的全部屬性設置成功后執(zhí)行的初始化方法。afterPropertiesSet 方法與前置處理不同的是,由于其沒有把Bean對象傳進來,因此在這一步?jīng)]有辦法處理對象本身,只能增加一些額外的邏輯。

7. BeanPostProcess的postProcessAfterInitialzation方法

BeanPostProcesspostProcessAfterInitialzation(Objectbean,StringbeanName) 方法;當前正在初始化的bean對象會被傳遞進來,我們就可以對這個bean做任何處理。這個函數(shù)會在 InitializingBean完成后執(zhí)行,因此稱為后置處理。

8. Bean初始化結束

經(jīng)過以上的工作以后,Bean的初始化就結束了,Bean將一直駐留在應用上下文中給應用使用,知道應用上下文被銷毀。

9. DispostbleBean接口

如果Bean實現(xiàn)了 DispostbleBean接口,Spring將調(diào)用它的 destroy方法,作用與在配置文件中對Bean使用 destroy-method屬性的作用是一樣的,都是在Bean實例銷毀前執(zhí)行的方法。

最后的最后用我多年畫工附一張如給大家康康:

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

相關文章

  • Spring?Boot實現(xiàn)登錄驗證碼功能的案例詳解

    Spring?Boot實現(xiàn)登錄驗證碼功能的案例詳解

    驗證碼的作用可以有效防止其他人對某一個特定的注冊用戶用特定的程序暴力破解方式進行不斷的登錄嘗試,接下來通過本文給大家介紹Spring?Boot實現(xiàn)登錄驗證碼功能,需要的朋友可以參考下
    2022-08-08
  • Java異常ClassCastException的解決

    Java異常ClassCastException的解決

    這篇文章主要介紹了Java異常ClassCastException的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java面試題沖刺第二十一天--JVM

    Java面試題沖刺第二十一天--JVM

    這篇文章主要為大家分享了最有價值的三道關于JVM的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結構和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解JAVA 弱引用

    詳解JAVA 弱引用

    這篇文章主要介紹了 JAVA 弱引用的相關資料,幫助大家更好的理解和學習java引用對象,感興趣的朋友可以了解下
    2020-08-08
  • 淺談Java變量的初始化順序詳解

    淺談Java變量的初始化順序詳解

    本篇文章是對Java變量的初始化順序進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Java獲取當前時間戳案例詳解

    Java獲取當前時間戳案例詳解

    這篇文章主要介紹了Java獲取當前時間戳案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java動態(tài)顯示文件上傳進度實現(xiàn)代碼

    Java動態(tài)顯示文件上傳進度實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了Java動態(tài)顯示文件上傳進度實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 在Linux上搭建一個Java部署環(huán)境的詳細步驟

    在Linux上搭建一個Java部署環(huán)境的詳細步驟

    這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • druid執(zhí)行SQL出現(xiàn)錯誤但不影響返回結果的問題及解決

    druid執(zhí)行SQL出現(xiàn)錯誤但不影響返回結果的問題及解決

    這篇文章主要介紹了druid執(zhí)行SQL出現(xiàn)錯誤但不影響返回結果的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 搜索一文入門ElasticSearch(節(jié)點 分片 CRUD 倒排索引 分詞)

    搜索一文入門ElasticSearch(節(jié)點 分片 CRUD 倒排索引 分詞)

    這篇文章主要為大家介紹了搜索一文入門ElasticSearch(節(jié)點 分片 CRUD 倒排索引 分詞)的基礎詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論