1. 程式人生 > >Spring容器的初始化過程

Spring容器的初始化過程

1、Spring 容器高層檢視

Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,然後根據這張登錄檔例項化Bean,裝配號Bean之間的依賴關係,為上層應用提供準備就緒的執行環境。

在這裡插入圖片描述

2、內部工作機制

該圖描述了Spring容器從載入配置檔案到創建出一個完整Bean的作業流程:

在這裡插入圖片描述

1、ResourceLoader從儲存介質中載入Spring配置資訊,並使用Resource表示這個配置檔案的資源;

2、BeanDefinitionReader讀取Resource所指向的配置檔案資源,然後解析配置檔案。配置檔案中每一個解析成一個BeanDefinition物件,並儲存到BeanDefinitionRegistry中;

3、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機制自動識別出Bean工廠後處理後器(實現BeanFactoryPostProcessor介面)的Bean,然後呼叫這些Bean工廠後處理器對BeanDefinitionRegistry中的BeanDefinition進行加工處理。主要完成以下兩項工作:

1)對使用到佔位符的元素標籤進行解析,得到最終的配置值,這意味對一些半成品式的BeanDefinition物件進行加工處理並得到成品的BeanDefinition物件;

2)對BeanDefinitionRegistry中的BeanDefinition進行掃描,通過Java反射機制找出所有屬性編輯器的Bean(實現java.beans.PropertyEditor介面的Bean),並自動將它們註冊到Spring容器的屬性編輯器登錄檔中(PropertyEditorRegistry);

4.Spring容器從BeanDefinitionRegistry中取出加工後的BeanDefinition,並呼叫InstantiationStrategy著手進行Bean例項化的工作;

5.在例項化Bean時,Spring容器使用BeanWrapper對Bean進行封裝,BeanWrapper提供了很多以Java反射機制操作Bean的方法,它將結合該Bean的BeanDefinition以及容器中屬性編輯器,完成Bean屬性的設定工作;

6.利用容器中註冊的Bean後處理器(實現BeanPostProcessor介面的Bean)對已經完成屬性設定工作的Bean進行後續加工,直接裝配出一個準備就緒的Bean。

Spring容器確實堪稱一部設計精密的機器,其內部擁有眾多的元件和裝置。Spring的高明之處在於,它使用眾多介面描繪出了所有裝置的藍圖,構建好Spring的骨架,繼而通過繼承體系層層推演,不斷豐富,最終讓Spring成為有血有肉的完整的框架。所以檢視Spring框架的原始碼時,有兩條清晰可見的脈絡:

1)介面層描述了容器的重要元件及元件間的協作關係;

2)繼承體系逐步實現元件的各項功能。

介面層清晰地勾勒出Spring框架的高層功能,框架脈絡呼之欲出。有了介面層抽象的描述後,不但Spring自己可以提供具體的實現,任何第三方組織也可以提供不同實現, 可以說Spring完善的介面層使框架的擴充套件性得到了很好的保證。縱向繼承體系的逐步擴充套件,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的程式碼邏輯負載,框架的複雜度被完美地分解開了。

Spring元件按其所承擔的角色可以劃分為兩類:

1)物料元件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費的元件,就像流水線上被加工的物料;

2)加工裝置元件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等元件像是流水線上不同環節的加工裝置,對物料元件進行加工處理。

Spring什麼時候例項化bean,首先要分2種情況

第一:如果你使用BeanFactory作為Spring Bean的工廠類,則所有的bean都是在第一次使用該Bean的時候例項化
第二:如果你使用ApplicationContext作為Spring Bean的工廠類,則又分為以下幾種情況:
(1):如果bean的scope是singleton的,並且lazy-init為false(預設是false,所以可以不用設定),則ApplicationContext啟動的時候就例項化該Bean,並且將例項化的Bean放在一個map結構的快取中,下次再使用該Bean的時候,直接從這個快取中取
(2):如果bean的scope是singleton的,並且lazy-init為true,則該Bean的例項化是在第一次使用該Bean的時候進行例項化
(3):如果bean的scope是prototype的,則該Bean的例項化是在第一次使用該Bean的時候進行例項化

在我工程的Demo裡,是通過ClassPathXmlApplicationContext獲取xml的。所以屬於通過ApplicationContext獲取bean,它的預設BeanFactory是DefaultListableBeanFactory。

相關推薦

Spring容器初始過程

https://blog.csdn.net/xingxing513234072/article/details/78247480 一、Spring 容器高層檢視   Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,

Spring容器初始過程都做了哪些事兒

1.ClassPathXmlApplicationContext為入口構造方法中有個refresh()方法用來初始化Spring refresh執行的大致流程: Configurab

spring原始碼學習之路---深度分析IOC容器初始過程(三)

分析FileSystemXmlApplicationContext的建構函式,到底都做了什麼,導致IOC容器初始化成功。 public FileSystemXmlApplicationContext(String[] configLocations, boolean ref

Spring系列(五) 容器初始過程原始碼

IoC/DI 的概念 容器是Spring的核心之一(另一個核心是AOP). 有了容器, IOC才可能實現. 什麼使IoC? IoC就是將類自身管理的與其由依賴關係的物件的建立/關聯和管理交予容器實現, 容器按照配置(比如xml檔案)來組織應用物件的建立和關聯. 什麼使DI? DI是IoC的實現方式, 由容器

Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構與設計原理》讀書筆記(一):IOC容器初始過程

通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

spring技術內幕筆記:IoC容器初始過程(2)- BeanDefinition的載入

Spring版本:4.3.8.RELEASEBeanDefinition載入過程,相當於把定義的BeanDefinition在IoC容器中轉換成一個Spring內部表示的資料結構的過程。IoC容器對Bean的管理和依賴注入功能的實現,就是通過對其持有的BeanDefiniti

Spring技術內幕之IOC容器的實現(01)-IOC容器初始過程

Spring IOC容器的初始化過程 Spring IOC容器的初始化過程主要包括BeanDefinition的Resouce定位/載入/註冊三個基本過程。Spring把這三個過程的實現分別放在不同的模組下,通過這樣的設計方式可以使使用者更加靈活地對這個三個過程進行裁剪和自

spring容器初始bean的過程中的時間週期

知識點介紹 1、 init-method方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。init-method需要在 applicationContext.xml配置文件中bean的定義裡頭寫明。例如:<bean id="TestBean" cla

spring原始碼分析-web容器初始過程解析1

   在之前的“”中分析了spring mvc的初始化過程,接下來將分析其請求處理過程。         在找請求處理的入口時,我們需要先知道Servlet的程式設計規範,對應不同的請求(如POST、GET等)的實現方法在FrameworkServlet中,分別是doP

Spring】- IOC容器初始過程

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

spring MVC初始過程學習筆記1

load cati 過程 mage 筆記 ngx 名稱 spring -s 如果有錯誤請指正~ 1.springmvc容器和spring的關系? 1.1 spring是個容器,主要是管理bean,不需要servlet容器就可以啟動,而springMVC實現了servl

spring容器初始bean之後或銷燬bean之前,能做的操作

通過 <bean> 標籤 init-method  初始化bean之後呼叫的方法 destroy-method  銷燬bean之前呼叫的操作方法 <bean id="initQuartzJob" class="com.upinc

Spring容器初始後執行某個指定的方法

1.配置springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww

Web容器初始過程

一、SpringMVC啟動過程 Spring的MVC是基於Servlet功能實現的,每個web工程中都有一個web.xml檔案,web容器在啟動的時候會載入這個配置檔案,當一個web應用載入到web容器中後,在web應用開始響應客戶端的請求之前,要按照順序執行下面幾個步驟: 1、例項化部署描述符中的<

spring容器初始之後執行某些系統初始動作

最近自己所在的專案中出現此種情形:專案啟動後,需要做一些初始化動作,如,讀取配置檔案、查詢資料庫資料存入快取等。參考前人寫的程式碼的實現方式如下: 思路:編寫一個系統初始化類,該類實現ServletContextListenner介面,並實現contextInitializ

spring 容器初始完成後執行某個方法

一下內容來自internet,後面會整理在做web專案開發中,尤其是企業級應用開發的時候,往往會在工程啟動的時候做許多的前置檢查。比如檢查是否使用了我們組禁止使用的MySQL的group_concat函式,如果使用了專案就不能啟動,,在Spring容器將所有的Bean都初始化

Spring原始碼閱讀】 Spring容器初始流程

文章目錄 refresh方法原始碼 prepareRefresh實現 obtainFreshBeanFactory實現 refreshBeanFactory方法實現 prepareBeanFactory方法實現 invokeBeanFa

Spring容器初始完之後執行某個方法

initializingBean介面是spring提供的,子類要實現afterPropertiesSet()方法,init-method是使用者可以通過屬性檔案配置的。從這裡可以看出實現initializingBean介面是要和spring耦合的,而init-method則不會。但afterProperti

最佳實踐--Spring容器初始完成之後執行某個方法

在做javaweb專案的時候,當用戶訪問的時候需要從資料庫載入資料,現在要在容器初始化完成之後直接把資料放入快取,當用戶訪問的時候提高速度。 查閱相關spring文件,找到了一個最佳實踐(best p

spring容器初始時候遇到的死鎖問題

最近啟動spring專案的時候遇到一個死鎖問題,使用jstack獲取執行緒堆疊的時候,可以看到2個執行緒出現了死鎖: DefaultSingletonBeanRegistry.getSinglet