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

Spring中Bean的生命周期及實例化操作詳解

 更新時間:2023年08月17日 09:33:34   投稿:caobin  
這篇文章主要介紹了Spring中Bean的生命周期及實例化操作詳解,spring的核心思想之一IOC就是通過IOC容器對Bean的創(chuàng)建和各個bean之間的依賴關(guān)系進行操作,今天就來和大家分享一下bean的生命周期相關(guān)知識點,需要的朋友可以參考下

前言

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

一、Bean的介紹

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

  • IOC(控制反轉(zhuǎn)):是Spring框架的核心思想之一, 主要用于解耦。I0C是指將創(chuàng)建對象的控制權(quán)轉(zhuǎn)移給Spring框架進行管理。由Spring框架根據(jù)配置文件或注解等元數(shù)據(jù),創(chuàng)建bean對象并管理各個bean對象之間的依賴關(guān)系。使對象之間形成松散耦合的關(guān)系,利于解耦。
  • DI(依賴注入):是對IOC概念的不同角度的描述,是指應(yīng)用程序在運行時,每一個bean對象都依賴IOC容器注入當前bean對象所需要的另外一-個bean對象。 (例如在MyBatis整合Spring時, SqISessionFactoryBean 依賴容器注入-個DataSource數(shù)據(jù)源) 
  • IOC容器:IOC容器屬于Spring Core模塊,是用來創(chuàng)建和管理Bean的地方,以默認單例的方式將bean存儲在以ConcurrentHashMap的形式存儲了BeanDefinition 對象,該對象封裝了Spring 對一個Bean所有信息的定義,包括類名,屬性,構(gòu)造方法參數(shù),依賴,是否延遲加載,是否單例等,之后對Bean的操作都是直接對它進行的。 IOC容器的初始化分三個步驟:
    • BeanDefinition的資源定位
    • BeanDefinition的資源的載入和解析
    • BeanDefinition的注冊 
  • AOP (面向切面編程):Spring AOP基于動態(tài)代理實現(xiàn)。 能夠?qū)⒛切┡c業(yè)務(wù)無關(guān), 卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝抽取成一個可重用的模塊, 這個模塊被命名為“ 切面”(Aspect) ,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性;

什么是Bean:

bean是計算機自動生成的類,bean是一個由Spring IoC容器實例化、組裝和管理的對象。

也就是說,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 應(yīng)用中才有意義,Spring5 已經(jīng)沒有了。Portlet 是能夠生成語義代碼

(例如:HTML)片段的小型 Java Web 插件。它們基于 portlet 容器,可以像 servlet 一樣處理 HTTP 請求。

但是,與 servlet 不同,每個 portlet 都有不同的會話。  

二、詳細過程

實例化和屬性賦值分別對應(yīng)構(gòu)造方法和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 提供了設(shè)置對象屬性的接口,從而避免了使用反射機制設(shè)置屬性。

2. InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor 這個接口主要是幫助你在Bean實例化之前做一些操作。

它繼承自 BeanPostProcessor 接口,其中 postProcessBeforeInstantiation() 方法是在目標對象實例化之前調(diào)用的方法,可以返回目標實例的一個代理用來代替目標實例。

postProcessPropertyValues 方法是在屬性值被設(shè)置到目標實例之前調(diào)用,可以修改屬性的設(shè)值。

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

實例化后的對象被封裝到 BeanWrapper 對象中,并且此時對象是一個原生狀態(tài),并沒有執(zhí)行依賴注入。

緊接著,Spring根據(jù) BeanDefinition 中的信息進行依賴注入。

并且通過 BeanWrapper 提供的設(shè)置屬性的接口完成依賴注入。

4. 注入Aware接口

Spring 會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關(guān)的xxxAware實例注入給Bean。

各種各樣的Aware接口,其作用就是在對象實例化完成后將Aware接口定義中規(guī)定的依賴注入到當前實例中。

比較常見的 ApplicationContextAware 接口,實現(xiàn)了這個接口的類都可以獲取到一個 ApplicationContext 對象,當容器中每個對象的實例化過程走到 BeanPostProcessor 前置處理這一步時,容器會檢測到之前注冊到容器的 ApplicationContextAwareProcessor ,然后就會調(diào)用其 postProcessorBeforeInitialization() 方法,檢查并設(shè)置Aware相關(guān)的依賴。

5. BeanPostProcessor的postProcessBeforeInitialzation方法

經(jīng)過上述步驟后,Bean對象已經(jīng)被正確構(gòu)造了,如果你想要對象被使用之前在進行自定義的處理,可以通過 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的全部屬性設(shè)置成功后執(zhí)行的初始化方法。

afterPropertiesSet 方法與前置處理不同的是,由于其沒有把Bean對象傳進來,因此在這一步?jīng)]有辦法處理對象本身,只能增加一些額外的邏輯。

7.BeanPostProcess的postProcessAfterInitialzation方法

BeanPostProcess 的 postProcessAfterInitialzation(Objectbean,StringbeanName) 方法;當前正在初始化的bean對象會被傳遞進來,我們就可以對這個bean做任何處理。

這個函數(shù)會在 InitializingBean 完成后執(zhí)行,因此稱為后置處理。

8. Bean初始化結(jié)束

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

9. DispostbleBean接口

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

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

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

相關(guān)文章

  • SpringBoot啟動時自動執(zhí)行特定代碼的完整指南

    SpringBoot啟動時自動執(zhí)行特定代碼的完整指南

    Spring?Boot?提供了多種靈活的方式在應(yīng)用啟動時執(zhí)行初始化代碼,以下是所有可行方法的詳細說明和最佳實踐,大家可以根據(jù)自己的需求進行選擇
    2025-04-04
  • Spring Cloud微服務(wù)之間調(diào)用Dubbo的詳細過程

    Spring Cloud微服務(wù)之間調(diào)用Dubbo的詳細過程

    SpringCloudAlibabaDubbo是阿里巴巴開源的Dubbo與SpringCloud的深度集成方案,本文介紹Spring Cloud微服務(wù)之間調(diào)用Dubbo的詳細過程,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Spring?MVC的三種異常處理方式實例詳解

    Spring?MVC的三種異常處理方式實例詳解

    在SpringMVC 中,不管是編譯異常還是運行時異常,都可以最終由 SpringMVC提供的異常處理器進行統(tǒng)一處理,這樣就避免了隨時隨地捕獲處理的繁瑣性,這篇文章主要介紹了Spring?MVC的三種異常處理方式?,需要的朋友可以參考下
    2024-01-01
  • Mybatis持久層框架入門之CRUD實例代碼詳解

    Mybatis持久層框架入門之CRUD實例代碼詳解

    這篇文章主要介紹了Mybatis持久層框架入門之CRUD實例,需要的朋友可以參考下
    2022-05-05
  • Java Stream流之求和的實現(xiàn)

    Java Stream流之求和的實現(xiàn)

    這篇文章主要介紹了Java Stream流之求和的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 通過Java實現(xiàn)bash命令過程解析

    通過Java實現(xiàn)bash命令過程解析

    這篇文章主要介紹了通過Java實現(xiàn)bash命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java封裝數(shù)組實現(xiàn)包含、搜索和刪除元素操作詳解

    Java封裝數(shù)組實現(xiàn)包含、搜索和刪除元素操作詳解

    這篇文章主要介紹了Java封裝數(shù)組實現(xiàn)包含、搜索和刪除元素操作,結(jié)合實例形式分析了java針對數(shù)組元素的查找、刪除、判斷等相關(guān)操作封裝與使用技巧,需要的朋友可以參考下
    2020-03-03
  • Java設(shè)計模式之適配器模式(Adapter模式)介紹

    Java設(shè)計模式之適配器模式(Adapter模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之適配器模式(Adapter模式)介紹,本文講解了為何使用適配器模式、如何使用適配器模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 創(chuàng)建首個 Spring Boot 登錄項目的全攻略

    創(chuàng)建首個 Spring Boot 登錄項目的全攻略

    在Java Web開發(fā)中,登錄功能是最基礎(chǔ)也是最重要的模塊之一,本文將手把手帶你使用IntelliJ IDEA和Maven構(gòu)建一個基于Spring Boot的簡單登錄系統(tǒng),感興趣的朋友跟隨小編一起看看吧
    2025-06-06
  • SpringCloud?OpenFeign概述與使用教程

    SpringCloud?OpenFeign概述與使用教程

    OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細節(jié)。所有遠程調(diào)用,都像調(diào)用本地方法一樣完成
    2023-02-02

最新評論

卫辉市| 太仆寺旗| 洪泽县| 太原市| 黑龙江省| 乐亭县| 澄城县| 冕宁县| 辽中县| 南康市| 余干县| 广宁县| 监利县| 曲阜市| 游戏| 威海市| 民丰县| 琼结县| 秭归县| 江门市| 遵义市| 滦平县| 仲巴县| 宣汉县| 九龙坡区| 内江市| 重庆市| 上思县| 新建县| 武山县| 扎鲁特旗| 正安县| 镇江市| 大连市| 云浮市| 新蔡县| 明光市| 洪雅县| 通渭县| 连山| 比如县|