溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring懶加載的單例Bean獲取過程是怎樣的

發布時間:2021-12-21 13:45:35 來源:億速云 閱讀:157 作者:iii 欄目:編程語言

這篇文章主要講解了“Spring懶加載的單例Bean獲取過程是怎樣的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring懶加載的單例Bean獲取過程是怎樣的”吧!

前言

xml的讀取應該是Spring的重要功能,因為Spring的大部分功能都是以配置做為切入點的。

   我們在靜態代碼塊中讀取配置文件可以這樣做:
   //這樣來加載配置文件    
   XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
   (1)XmlBeanFactory 繼承 AbstractBeanDefinitionReader ,使用ResourceLoader 將資源文件路徑轉換為對應的Resource文件。
   (2)通過DocumentLoader 對 Resource 文件進行轉換,將 Resource 文件轉換為 Document 文件。
   (3)通過實現接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader 類對Document 進行解析,并且使用 BeanDefinitionParserDelegate對Element進行解析。

step1:

Spring懶加載的單例Bean獲取過程是怎樣的

 在平常開發中,我們也可以使用Resource 獲取 資源文件:
  Resource resource = new ClassPathResource("application.xml");
  InputStream in = resource.getInputStream();

step2:

Spring懶加載的單例Bean獲取過程是怎樣的

  在資源實現加載之前,調用了 super(parentBeanFactory) --  /**Ignore the given dependency interface for autowiring.(忽略接口的自動裝配功能)*/
  調用XmlBeanDefinitionReader 的 loadBeanDefinitions()方法進行加載資源:
  (1) 對Resource資源進行編碼
  (2) 通過SAX讀取XML文件來創建InputSource對象
  (3) 核心處理

Spring懶加載的單例Bean獲取過程是怎樣的

   可以很直觀的看出來是這個function是在解析xml文件從而獲得對應的Document對象。

Spring懶加載的單例Bean獲取過程是怎樣的

  在doLoadDocument方法里面還存一個方法getValidationModeForResource()用來讀取xml的驗證模式。(和我關心的沒什么關系,暫時不看了~)
  轉換成document也是最常用的方法:
 ![869effccb2e4f7b69e0b53d17fe0a2b50044d61b](https://oss-cn-hangzhou.aliyuncs.com/yqfiles/869effccb2e4f7b69e0b53d17fe0a2b50044d61b.png)

step3 : 我們已經step by step 的看到了如何將xml文件轉換成Document的,現在就要分析是如何提取和注冊bean的。

        /**Register the bean definitions contained in the given DOM document*/

Spring懶加載的單例Bean獲取過程是怎樣的

參數doc是doLoadBeanDefinitions()方法傳進來的  loadDocument 加載過來的。這邊就很好的體現出了面向對象的單一全責原則,將邏輯處理委托給單一的類去處理。

在這邊單一邏輯處理類是:  BeanDefinitionDocumentReader

核心方法:  documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

Spring懶加載的單例Bean獲取過程是怎樣的開始解析:Spring懶加載的單例Bean獲取過程是怎樣的


在Spring的xml配置中有兩種方式來聲明bean:

 一種是默認的:  <bean id = " " class = " " />
 還有一種是自定義的:  < tx : annotation-driven / >

Spring懶加載的單例Bean獲取過程是怎樣的

通過xml配置文件的默認配置空間來判斷: http://www.springframework.org/schema/beans

對于默認標簽的解析:

Spring懶加載的單例Bean獲取過程是怎樣的

對Bean 配置的解析:

Spring懶加載的單例Bean獲取過程是怎樣的

BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);  返回BeanDefinitionHolder

Spring懶加載的單例Bean獲取過程是怎樣的

Spring懶加載的單例Bean獲取過程是怎樣的

這邊代碼大致看下來:

  1. 提取元素中的id和name屬性

  2. 進一步解析將其他屬性封裝到 BeanDefinition 的實現類中

  3. 如果沒有指定beanName 變使用默認規則生成beanName

  4. 封裝類BeanDefinitionHolder

可以先了解一下  BeanDefinition  這個類的作用。

  BeanDefinition是一個接口,對應著配置文件中<bean>里面的所有配置,在Spring中存在著三個實現類:

Spring懶加載的單例Bean獲取過程是怎樣的

  在配置文件中,可以定義父<bean>和子<bean>,父<bean>是用RootDefinition來表示,子<bean>是用ChildBeanDefinition來表示。
  Spring 通過BeanDefiniton將配置文件中的<bean>配置信息轉換為容器內部表示,并且將這些BeanDefinition注冊到BeanDefinitonRegistry中。

Spring容器的BeanDefinitonRegistry就像是Spring配置信息的內存數據庫,主要是以map的形式保存的。

 因此解析屬性首先要創建用于承載屬性的實例:

Spring懶加載的單例Bean獲取過程是怎樣的

然后就是各種對屬性的解析的具體方法:

Spring懶加載的單例Bean獲取過程是怎樣的

感謝各位的閱讀,以上就是“Spring懶加載的單例Bean獲取過程是怎樣的”的內容了,經過本文的學習后,相信大家對Spring懶加載的單例Bean獲取過程是怎樣的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女