AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Spring如何管理Bean的生命周期呢?

來源: 責編: 時間:2024-05-28 09:08:20 169觀看
導讀我們都知道,在面試的過程中,關于 Spring 的面試題,那是各種各樣,很多時候就會問到關于 Spring的相關問題,比如 AOP ,IOC 等等,還有就是關于 Spring 是如何管理 Bean 的生命周期的相關問題,今天了不起就來和大家一起看看 Sprin

我們都知道,在面試的過程中,關于 Spring 的面試題,那是各種各樣,很多時候就會問到關于 Spring的相關問題,比如 AOP ,IOC 等等,還有就是關于 Spring 是如何管理 Bean 的生命周期的相關問題,今天了不起就來和大家一起看看 Spring 是如何管理 Bean 的生命周期的。to128資訊網——每日最新資訊28at.com

源碼分析

BeanFactory

其實我們對于這個 Spring 管理 Bean 的生命周期有時候并不需要我們去大篇幅的去背誦某塊的內容,我們需要的就是學會看源代碼,比如源代碼中的注釋部分,當我們看到這注釋部分的時候,很大程度上能夠幫助我們理解源碼的含義。to128資訊網——每日最新資訊28at.com

BeanFactory是Spring框架中的一個接口,它是一個工廠類,用來創建和管理Spring中的Bean對象。to128資訊網——每日最新資訊28at.com

我們看源碼中的注釋to128資訊網——每日最新資訊28at.com

* <p>Bean factory implementations should support the standard bean lifecycle interfaces * as far as possible. The full set of initialization methods and their standard order is:

這句話直接翻譯就是 Bean Factory 實現類應該盡可能的支持標準的生命周期接口。注釋的下半段內容,就是描述的 Bean 生命周期的相關內容了。所以源碼里面的注釋需要我們及時的去看一下,雖然都是純英文的,但是能讀出個大概得內容,再去看源碼的話,至少知道它是干嘛的方法。to128資訊網——每日最新資訊28at.com

Bean 的生命周期

我們在了解他如何管理的時候,我們得先知道這個 Bean 的生命周期都有哪幾個階段,知道了階段,我們再來看它的實現。to128資訊網——每日最新資訊28at.com

我們先總結:to128資訊網——每日最新資訊28at.com

Bean 的生命周期可以總結為如下的幾個階段,to128資訊網——每日最新資訊28at.com

1. Bean的實例化階段to128資訊網——每日最新資訊28at.com

2. Bean的設置屬性階段to128資訊網——每日最新資訊28at.com

3. Bean的 初始化階段to128資訊網——每日最新資訊28at.com

4. Bean的銷毀階段to128資訊網——每日最新資訊28at.com

也有些人會細分實例化階段,就是把實例化拆分成兩部分,第一部分是注冊階段,第二部分是實例化階段,其實區別不大。to128資訊網——每日最新資訊28at.com

Bean實例化階段

在Spring框架中,Bean的實例化是一個核心過程,它涉及了多個步驟以確保Bean能夠正確地被創建并注入到應用上下文中。to128資訊網——每日最新資訊28at.com

Bean定義注冊:to128資訊網——每日最新資訊28at.com

  • 首先,你需要在Spring的配置文件(如XML配置文件或Java配置類)中定義Bean。這包括指定Bean的類名、作用域、初始化方法、銷毀方法以及可能的依賴關系等。
  • Spring容器會讀取這些配置,并將Bean定義信息存儲在其內部的數據結構中,通常是BeanDefinition對象。

實例化前的準備:to128資訊網——每日最新資訊28at.com

  • 在實例化Bean之前,Spring會進行一些準備工作,如解析Bean定義中的屬性、檢查依賴關系等。
  • 如果Bean定義中引用了其他Bean,Spring會嘗試先解析并實例化這些依賴Bean。

實例化:to128資訊網——每日最新資訊28at.com

  • 實例化是創建Bean對象的過程。Spring提供了多種實例化Bean的方式:

構造器實例化:通過調用Bean的構造方法來創建實例。你可以在配置文件中指定要使用的構造方法,并提供相應的參數。to128資訊網——每日最新資訊28at.com

靜態工廠方法實例化:通過調用靜態工廠方法來創建Bean實例。你需要在配置文件中指定工廠類的類名和工廠方法的名稱。to128資訊網——每日最新資訊28at.com

實例工廠方法實例化:首先實例化一個工廠Bean,然后調用該工廠Bean的某個非靜態方法來創建目標Bean實例。to128資訊網——每日最新資訊28at.com

默認構造器實例化:如果Bean定義中沒有指定其他實例化方式,并且Bean類有一個無參構造器,那么Spring將使用默認構造器來實例化Bean。to128資訊網——每日最新資訊28at.com

  • 實例化完成后,你得到的是一個原始的對象,它還沒有進行任何屬性注入或初始化。

屬性注入:to128資訊網——每日最新資訊28at.com

  • 在Bean實例化之后,Spring會進行屬性注入(也稱為依賴注入)。這包括將Bean定義中指定的屬性值或對其他Bean的引用注入到Bean的相應屬性中。
  • Spring支持多種屬性注入方式,如基于字段的注入、基于setter方法的注入和基于構造器的注入等。

BeanPostProcessor處理:to128資訊網——每日最新資訊28at.com

在Bean的屬性注入完成后,但Bean的初始化方法執行之前,Spring會調用已注冊的BeanPostProcessor接口的postProcessBeforeInitialization方法。這是一個可選的步驟,你可以通過實現該接口并注冊相應的BeanPostProcessor來在Bean初始化前后執行自定義的邏輯。to128資訊網——每日最新資訊28at.com

初始化:to128資訊網——每日最新資訊28at.com

  • 接下來,Spring會調用Bean定義中指定的初始化方法(如果有的話)。這通常是在Bean類中定義的某個方法,并用特定的注解(如@PostConstruct)或XML配置中的元素的init-method屬性來指定。
  • 初始化方法是Bean在準備好接受請求之前進行必要設置或執行特定任務的地方。

BeanPostProcessor再處理:to128資訊網——每日最新資訊28at.com

在Bean初始化方法執行之后,Spring會再次調用已注冊的BeanPostProcessor接口的postProcessAfterInitialization方法。這是另一個可選的步驟,你可以在這里執行一些清理或后處理操作。to128資訊網——每日最新資訊28at.com

Bean就緒:to128資訊網——每日最新資訊28at.com

經過上述步驟后,Bean就已經被完全創建并初始化了。現在它可以被應用上下文中的其他組件使用或注入到其他Bean中。to128資訊網——每日最新資訊28at.com

到這里,我們的實例化就說完了,記下來看第二階段。to128資訊網——每日最新資訊28at.com

Bean的設置屬性階段

Bean的設置屬性階段(也稱為屬性注入或依賴注入)是Bean生命周期中的一個重要環節。這個階段發生在Spring容器創建Bean的實例之后,但在Bean被實際使用之前。to128資訊網——每日最新資訊28at.com

  • 當Spring容器創建一個Bean的實例后,它會檢查該Bean是否有需要注入的屬性。這些屬性可能是其他的Bean、基本數據類型、集合、Map等。
  • Spring會查找與這些屬性對應的配置信息(可能是XML中的標簽、注解中的值或其他配置方式),并將它們注入到Bean的相應字段或setter方法中。

注入方式:to128資訊網——每日最新資訊28at.com

  • 字段注入:通過直接在字段上使用@Autowired或其他相關注解來實現。但請注意,字段注入在某些情況下可能導致測試困難或難以遵循良好的封裝原則。
  • 構造函數注入:在構造函數參數上使用@Autowired或其他相關注解。這是推薦的方式之一,因為它確保了Bean在創建時就已經擁有所有必需的依賴項,并且這些依賴項是不可變的。
  • setter方法注入:在setter方法上使用@Autowired或其他相關注解。這種方式允許Bean在創建后的某個時間點接收其依賴項。

既然我們已經把這個屬性設置完畢了,那么就要開始后進行初始化階段了。to128資訊網——每日最新資訊28at.com

Bean 的初始化

  • Bean Aware接口回調
  • Bean初始化前操作
  • Bean初始化操作
  • Bean初始化后操作
  • Bean初始化完成操作

BeanAware接口回調to128資訊網——每日最新資訊28at.com

private void invokeAwareMethods(final String beanName, final Object bean) {  if (bean instanceof Aware) {   if (bean instanceof BeanNameAware) {    ((BeanNameAware) bean).setBeanName(beanName);   }   if (bean instanceof BeanClassLoaderAware) {    ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());   }   if (bean instanceof BeanFactoryAware) {    ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);   }  } }

Bean初始化前操作to128資訊網——每日最新資訊28at.com

@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)  throws BeansException { Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {  result = beanProcessor.postProcessBeforeInitialization(result, beanName);  if (result == null) {   return result;  } } return result;}

Bean初始化操作to128資訊網——每日最新資訊28at.com

調用InitializingBean接口的afterPropertiesSet方法 調用定義bean的時候指定的初始化方法。to128資訊網——每日最新資訊28at.com

public interface InitializingBean { /**  * Invoked by the containing {@code BeanFactory} after it has set all bean properties  * and satisfied {@link BeanFactoryAware}, {@code ApplicationContextAware} etc.  * <p>This method allows the bean instance to perform validation of its overall  * configuration and final initialization when all bean properties have been set.  * @throws Exception in the event of misconfiguration (such as failure to set an  * essential property) or if initialization fails for any other reason  */ void afterPropertiesSet() throws Exception;}

Bean初始化后階段to128資訊網——每日最新資訊28at.com

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)   throws BeansException {  Object result = existingBean;  for (BeanPostProcessor processor : getBeanPostProcessors()) {   Object current = processor.postProcessAfterInitialization(result, beanName);   if (current == null) {    return result;   }   result = current;  }  return result; }

Bean初始化完成操作to128資訊網——每日最新資訊28at.com

public interface SmartInitializingSingleton { /**  * Invoked right at the end of the singleton pre-instantiation phase,  * with a guarantee that all regular singleton beans have been created  * already. {@link ListableBeanFactory#getBeansOfType} calls within  * this method won't trigger accidental side effects during bootstrap.  * <p><b>NOTE:</b> This callback won't be triggered for singleton beans  * lazily initialized on demand after {@link BeanFactory} bootstrap,  * and not for any other bean scope either. Carefully use it for beans  * with the intended bootstrap semantics only.  */ void afterSingletonsInstantiated();}

當我們完成了初始化之后,使用完成,最后 Bean 就要走到銷毀階段了。to128資訊網——每日最新資訊28at.com

Bean 的銷毀

@Override public void destroyBean(Object existingBean) {  new DisposableBeanAdapter(    existingBean, getBeanPostProcessorCache().destructionAware, getAccessControlContext()).destroy(); }

這里需要注意的是to128資訊網——每日最新資訊28at.com

  • 當容器關閉時,或者當單例 Bean 的作用域結束時,Spring 會銷毀 Bean 的實例。
  • 對于非單例 Bean(如 prototype 作用域的 Bean),它們會在每次請求時創建,并在不再需要時由 Java 的垃圾回收機制銷毀。

你知道 Spring是如何管理 Bean 的生命周期了么?to128資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-91163-0.htmlSpring如何管理Bean的生命周期呢?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python 操作系統交互的 15 個實用命令

下一篇: 一個 .NET 開源的地圖組件庫-Mapsui

標簽:
  • 熱門焦點
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優惠,到手價12999元,比發布價便宜了7000元,在大屏電視市場開卷。據了解,Redmi MAX 100
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • OPPO、vivo、小米等國內廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據外媒報道,研究機構的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
Top