日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

源碼分析

BeanFactory

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

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

我們看源碼中的注釋fhe28資訊網——每日最新資訊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 生命周期的相關內容了。所以源碼里面的注釋需要我們及時的去看一下,雖然都是純英文的,但是能讀出個大概得內容,再去看源碼的話,至少知道它是干嘛的方法。fhe28資訊網——每日最新資訊28at.com

Bean 的生命周期

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

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

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

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

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

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

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

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

Bean實例化階段

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Bean的設置屬性階段

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

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

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

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

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

Bean 的初始化

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

BeanAware接口回調fhe28資訊網——每日最新資訊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初始化前操作fhe28資訊網——每日最新資訊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初始化操作fhe28資訊網——每日最新資訊28at.com

調用InitializingBean接口的afterPropertiesSet方法 調用定義bean的時候指定的初始化方法。fhe28資訊網——每日最新資訊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初始化后階段fhe28資訊網——每日最新資訊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初始化完成操作fhe28資訊網——每日最新資訊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 就要走到銷毀階段了。fhe28資訊網——每日最新資訊28at.com

Bean 的銷毀

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
99精品99久久久久久宅男| 国产日韩欧美在线观看| 欧美成人嫩草网站| 欧美日韩亚洲91| 国产伦理精品不卡| 国产专区一区| 亚洲国产另类 国产精品国产免费| 久久久午夜电影| 美女国内精品自产拍在线播放| 欧美日本一道本| 国产日韩精品一区二区浪潮av| 精品电影在线观看| 一区二区日韩免费看| 欧美伊人久久| 免费观看日韩av| 欧美日韩伦理在线免费| 国产无一区二区| 99国产精品私拍| 欧美中文字幕不卡| 欧美片在线播放| 国产一区二区三区四区在线观看| 亚洲精品在线一区二区| 久久成人国产精品| 欧美日韩国产123| 国产一区二区三区丝袜 | 激情五月综合色婷婷一区二区| 亚洲三级免费| 欧美专区亚洲专区| 欧美日韩国产系列| 激情综合色综合久久综合| 一区二区不卡在线视频 午夜欧美不卡' | 国外成人在线| 亚洲一区二区三区影院| 蜜桃久久av一区| 国产伦精品一区二区| 亚洲日本一区二区三区| 久久福利精品| 欧美午夜一区二区福利视频| 亚洲国产成人精品久久| 欧美一区二区观看视频| 欧美精品一区二区视频| 狠狠做深爱婷婷久久综合一区 | 欧美一区二区私人影院日本| 欧美激情一区二区三区高清视频| 国产欧美一区二区色老头 | 亚洲激情在线播放| 久久激情视频久久| 国产精品成人播放| 最新日韩精品| 久久野战av| 国产美女高潮久久白浆| 夜夜狂射影院欧美极品| 欧美二区在线播放| 狠狠色伊人亚洲综合网站色| 亚洲欧美日韩一区在线| 欧美视频成人| 日韩视频一区二区三区在线播放| 久久精品水蜜桃av综合天堂| 国产精品久久久久av| 日韩视频免费在线| 欧美成人一区二区三区| 极品少妇一区二区三区| 欧美与欧洲交xxxx免费观看| 国产精品久久久久毛片软件| 99精品国产在热久久婷婷| 欧美成人福利视频| 亚洲国产精品久久91精品| 久久久久久自在自线| 国产一区二区三区av电影| 欧美一区二区啪啪| 国产欧美日韩精品专区| 亚洲欧美日韩中文播放| 欧美午夜精品电影| 亚洲精品日韩在线观看| 欧美成人一区在线| 亚洲欧洲一区二区天堂久久| 牛牛精品成人免费视频| 亚洲国产精品尤物yw在线观看| 老**午夜毛片一区二区三区| 樱桃成人精品视频在线播放| 国产一区二区三区自拍| 亚洲一区免费观看| 国产精品久久久久久久久动漫| 中文欧美在线视频| 欧美日韩亚洲高清一区二区| 99国产精品久久| 欧美日韩欧美一区二区| 中文欧美字幕免费| 国产精品久久久久影院色老大| 亚洲一区二区三区乱码aⅴ| 欧美亚男人的天堂| 亚洲欧美制服另类日韩| 国产日韩欧美一区| 久久琪琪电影院| 亚洲国产成人av| 欧美片第1页综合| 亚洲视频狠狠| 国产精品香蕉在线观看| 久久精品国产免费看久久精品| 黄色在线成人| 免费观看亚洲视频大全| 亚洲人成亚洲人成在线观看| 欧美日韩三级在线| 亚洲一级二级| 国产一区二区福利| 久久综合成人精品亚洲另类欧美| 亚洲高清网站| 欧美日韩麻豆| 欧美一区二区视频网站| 尤物精品国产第一福利三区| 国产视频欧美视频| 国产欧美日韩91| 久久激情综合| 亚洲福利免费| 欧美日韩午夜在线视频| 香蕉成人啪国产精品视频综合网| 国产主播精品在线| 欧美成人中文| 亚洲宅男天堂在线观看无病毒| 国产一区二区中文字幕免费看| 免费一级欧美片在线播放| 一区二区三区四区国产精品| 国产伦精品一区二区三| 久久久午夜精品| 亚洲精品资源美女情侣酒店| 国产精品萝li| 老鸭窝亚洲一区二区三区| 日韩视频在线永久播放| 国产精品一区一区| 欧美91精品| 亚洲欧美在线免费| 在线观看三级视频欧美| 国产精品第一页第二页第三页| 久久精品一本| 一本久久a久久精品亚洲| 国产亚洲精品v| 欧美日韩国产一区二区| 久久精品1区| 宅男精品视频| 在线看视频不卡| 国产精品日本| 欧美成人性生活| 新67194成人永久网站| 亚洲三级电影全部在线观看高清| 国产精品综合久久久| 欧美激情第三页| 国产欧美一区二区视频| 欧美成人激情视频| 午夜精品电影| 亚洲精品一区中文| 韩国视频理论视频久久| 欧美视频一区在线观看| 久久亚洲欧美| 午夜精品久久久久久久白皮肤 | 亚洲欧美中文日韩在线| 亚洲日本免费电影| 国内精品国产成人| 国产精品久久久999| 欧美精品一区二区三区四区| 久久久999成人| 亚洲——在线| 日韩视频免费在线观看| 精品99视频| 国产精品永久免费在线| 欧美日韩国语| 欧美福利一区二区| 夜夜精品视频| 亚洲丶国产丶欧美一区二区三区| 国产精品一二三四| 欧美日韩免费一区| 麻豆精品传媒视频| 久久成人资源| 亚洲欧美久久| 亚洲一区在线观看视频| av成人手机在线| 亚洲精品国偷自产在线99热| 伊人久久婷婷| 国产曰批免费观看久久久| 国产精品一区二区久久| 国产精品国产三级国产普通话蜜臀 | 欧美连裤袜在线视频| 美女黄毛**国产精品啪啪| 久久精品夜色噜噜亚洲a∨| 香港成人在线视频| 亚洲免费一区二区| 亚洲已满18点击进入久久| 一区二区福利| 一区二区三区鲁丝不卡| 99精品国产在热久久| 91久久中文| 亚洲欧洲视频| 亚洲欧洲综合另类在线| 亚洲激情视频网| 亚洲国产精品一区| 亚洲国产一区二区三区a毛片| 在线国产亚洲欧美| 在线观看一区| 亚洲电影免费在线| 在线看片成人| 亚洲国产精品ⅴa在线观看| 亚洲国产精品成人久久综合一区 | 久久精品天堂| 久久夜色精品国产欧美乱极品 | 国产精品成人在线观看|