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

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

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

前言

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

一、Bean的介紹

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

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

什么是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 應用中才有意義,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方法

BeanPostProcess 的 postProcessAfterInitialzation(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的生命周期及實例化操作詳解的文章就介紹到這了,更多相關Bean的生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • hibernate和mybatis對比分析

    hibernate和mybatis對比分析

    通過本文給分享了hibernate和mybatis對比分析,從開發(fā)對比,系統(tǒng)調(diào)優(yōu)對比,對象管理與抓取策略,緩存機制對比等方面給大家詳細介紹,需要的朋友參考下吧
    2017-09-09
  • IDEA 2020.1打開時閃退的問題及解決方法(完美解決方法)

    IDEA 2020.1打開時閃退的問題及解決方法(完美解決方法)

    這篇文章主要介紹了IDEA 2020.1打開時閃退問題及解決方法,本文給大家分享我的處理方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 關于IDEA關聯(lián)數(shù)據(jù)庫的問題

    關于IDEA關聯(lián)數(shù)據(jù)庫的問題

    這篇文章主要介紹了IDEA關聯(lián)數(shù)據(jù)庫的相關知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spring Boot 中常用的注解@RequestParam及基本用法

    Spring Boot 中常用的注解@RequestParam及基本用法

    @RequestParam 是 Spring Framework 和 Spring Boot 中常用的注解之一,用于從請求中獲取參數(shù)值,本文給大家介紹Spring Boot 中常用的注解@RequestParam,感興趣的朋友一起看看吧
    2023-10-10
  • ServletContext中常用方法介紹

    ServletContext中常用方法介紹

    本篇文章是對ServletContext中的常用方法進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • 詳解Lombok的坑

    詳解Lombok的坑

    這篇文章主要介紹了詳解Lombok的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Kotlin與Java的主客觀對比分析

    Kotlin與Java的主客觀對比分析

    這篇文章主要介紹了Kotlin與Java的主客觀對比分析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • spring boot application properties配置實例代碼詳解

    spring boot application properties配置實例代碼詳解

    本文通過代碼給大家介紹了spring boot application properties配置方法,需要的的朋友參考下吧
    2017-07-07
  • JVM中的程序計數(shù)寄存器PC是什么詳解

    JVM中的程序計數(shù)寄存器PC是什么詳解

    這篇文章主要介紹了JVM中的程序計數(shù)寄存器PC原理分析,JVM中的程序計數(shù)寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存儲指令相關的現(xiàn)場信息
    2021-09-09
  • 詳解如何全注解方式構建SpringMVC項目

    詳解如何全注解方式構建SpringMVC項目

    這篇文章主要介紹了詳解如何全注解方式構建SpringMVC項目,利用Eclipse構建SpringMVC項目,非常具有實用價值,需要的朋友可以參考下
    2018-10-10

最新評論