Spring IOC 內部工作機制
1 Spring內部工作機制
ApplicationContext的預設實現是AbstractApplicationContext,可以通過refresh()窺探Spring在重新整理時的動作
// 初始化BeanFactory ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); …… //呼叫工廠後處理器 invokeBeanFactoryPostProcessors(beanFactory); //註冊Bean後處理器 registerBeanPostProcessors(beanFactory); //初始化訊息源 initMessageSource(); //初始化應用上下文事件廣播器 initApplicationEventMulticaster(); //初始化其他特殊的Bean.eg由自類實現的Bean onRefresh(); //註冊事件監聽器 registerListeners(); //初始化所有單例Bean,懶載入模式的Bean除外 finishBeanFactoryInitialization(beanFactory); // 完成重新整理併發布容器重新整理事件 finishRefresh();
1.初始化BeanFactory:呼叫refreshBeanFactory()重新整理BeanFactory,之後呼叫getBeanFactory()獲得BranFactory,這兩個方法都是由具體子類實現。這一步中最重要的就是Spring將形成BeanDefinitionRegistry(Bean定義登錄檔),但是此時的Bean都沒有被初始化
2.呼叫工廠後處理器:在Bean定義登錄檔中找出工廠後處理器(BeanFactoryPostProcessor子類)並呼叫物件的介面方法(postProcessBeanFactory())
3.註冊Bean 後處理器:在Bean定義登錄檔中找出Bean 後處理器(BeanPostProcessor子類)並註冊到Bean後處理器登錄檔中
4.初始化訊息源:初始化容器的國際化訊息資源
5.初始化應用上下文事件廣播器
6.初始化其他特使的Bean
7.註冊事件監聽器,方便響應容器事件
8.初始化所有單例項Bean:初始化所有的單例項Bean並形成Bean的快取池
9.完成併發布容器重新整理事件:應用上下文事件廣播器會將該事件廣播到每個註冊的事件監聽器中。
2 Spring IOC流程圖
1.ResourceLoader載入bean配置檔案並使用對應的Resource表示
2.BeanDefinitionReader讀取Resource表示的資源並解析,將配置的Bean表示為BeanDefinition並形成BeanDefinitionRegistry。bean登錄檔中的Bean是最原始的Bean即沒有經過任何處理的Bean。eg符號替換
3.掃描BeanDefinitionRegistry。分為兩個主要的步驟
3.1 掃描BeanDefinitionRegistry識別BeanFactoryPostProcessor子類即工廠後處理器。採用工廠後處理器對Bean進行處理,對使用佔位符的<bean>標籤進行解析並獲得配置值即佔位符替換
3.2 掃描BeanDefinitionRegistry識別PropertyEditor子類即屬性編輯器並形成PropertyEditorRegistry(屬性編輯器登錄檔)
4.從BeanDefinitionRegistry中獲取加工後的BeanDefinition並呼叫InstantiationStrategy進行Bean例項化動作
5.BeanWrepper結合BeanDefinition以及PropertyEditorRegistry中註冊的屬性編輯器完成屬性注入動作
6.利用註冊的Bean後處理器對已經完成屬性設定的Bean進行後續處理,直接裝配出一個準備就緒的Bean
3 BeanDefinition
BeanDefinition是Bean定義在Spring中的內部表示。
RootBeanDefinition是最常用的實現類。它對應一般性的<bean>元素標籤。由於Bean存在父子關係,所以RootBeanDefinition表示父Bean,ChildBeanDefinition表示子Bean。沒有父Bean的Bean也表示為RootBeanDefinition。
一般情況下BeanDefinition只在容器啟動時載入並解析,除非容器重新整理或者重啟否則這些資訊不會發生變化。
BeanDefinition的建立主要包含兩個步驟。
1.利用BeanDefinitionReader讀取Resource,通過解析Xml並生成DOM物件,該步僅僅是生成<bean>標籤對應的Beandefinition物件,形成的Bean是半成品,佔位符在該步中並沒有被替換
2.利用容器中註冊的BeanFactoryPostProcessor對半成品的BeanDefinition進行處理,將佔位符替換成實際值。此時的Bean是成品的Bean
4 InstantiationStrategy
例項化策略負責根據BeanDefinition物件建立一個Bean例項。
SimpleInstantiationStrategy是最常用的例項化策略。該策略利用Bean的建構函式或者工廠方法建立Bean例項
CglibSubclassingInstantiationStrategy擴充套件了SimpleInstantiationStrategy,為進行方法注入的Bean提供了支援。利用Cglib為Bean動態生成子類。在子類中生成方法注入的邏輯,然後利用子類建立Bean的例項
InstantiationStrategy僅僅負責Bean的例項化,相當於new的功能,不會參與Bean屬性的設定。我們可以獲得此時的Bean例項,但是沒有辦法使用,因為Bean沒有被初始化,Bean的初始化需要BeanWrapper來完成
5 BeanWrapper
完成Bean屬性的填充工作。例項建立完成後,通過BeanWrapper將例項包裝。
PropertyAccessor介面定義了訪問Bean屬性的方法。eg:setPropertyValue(String,Object),setPropertyValues(PropertyValues pvs);PropertyEditorRegistry是屬性編輯器登錄檔。從類圖結構上可以看出WrapperImpl有3中身份
1.對Bean進行包裝即Bean包裝器,Wrapper.setWrappedInstance(Object obj)完成Bean的包裝
2.實現PropertyAccessor介面,可以訪問Bean的屬性即屬性訪問器
3.實現了屬性編輯器登錄檔介面,指定了將外部資料如何轉換為Bean屬性的規則
可以看出BeanWrapperImpl內部封裝可兩類元件:1.待處理的Bean,可以直接從BeanDefinitionRegistry獲取。2.一套用於設定Bean屬性的屬性編輯器,從BeanDefinition中獲取PropertyValue並通過屬性編輯器對PropertyValue進行處理獲得Bean屬性值並注入
相關推薦
Spring IOC 內部工作機制
1 Spring內部工作機制ApplicationContext的預設實現是AbstractApplicationContext,可以通過refresh()窺探Spring在重新整理時的動作// 初始化BeanFactory ConfigurableListableBeanF
spring 內部工作機制(二)
出了 流水線 tor 應用程序 java反射機制 post 技術 process 加載 本章節講Spring容器從加載配置文件到創建出一個完整Bean的作業流程及參與的角色。 Spring 啟動時讀取應用程序提供的Bean配置信息,並在Spring容器中生成一份相應
【轉】Java學習---HashMap和HashSet的內部工作機制
link 實踐 離散 val 數據結構 結構 通過 如何 factor 【原文】https://www.toutiao.com/i6593863882484220430/ HashMap和HashSet的內部工作機制 HashMap 和 HashSet 內部是如何工作的?散
spring IOC三種機制
面試時被問到spring的三種注入方式,以前沒有接觸過,直接回答了說通過 註解和xml檔案,好尷尬,回來看看正確答案。 spring的三種注入方式為 介面注入,getter setter注入和構造器注入。 介面注入:在需要使用介面的地方直接注入一個介面的實現類。在ssm框架
Spring IoC 的實現機制
pri ioc 實現原理 void imp ring new sna clas Spring 中的 IoC 的實現原理就是工廠模式加反射機制。 interface Fruit { public abstract void eat();
Spring IOC的核心機制:例項化與注入
上文我們介紹了IOC和DI,IOC是一種設計模式,DI是它的具體實現,有很多的框架都有這樣的實現,本文主要以spring框架的實現,來看具體的注入實現邏輯。 # spring是如何將物件加入容器的 spring將物件加入容器的方式有很多種,最主要的是xml和註解的形式,而當下註解的形式應用更加的廣泛,所以
Spring Ioc工作機制 初步
Spring IoC工作原理 Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,然後根據這張登錄檔例項化Bean,裝配好Bean之間的依賴關係,為上層應用提供準備就緒的執行環境。 測試 Spring
JavaScript工作機制:V8 引擎內部機制及如何編寫優化代碼的5個訣竅
with 由於 intern 但是 集成 項目 ssi 意義 實的 概述 JavaScript引擎是一個執行JavaScript代碼的程序或解釋器。JavaScript引擎可以被實現為標準解釋器,或者實現為以某種形式將JavaScript編譯為字節碼的即時編譯器。 下面是實
【Java Web】Spring IOC機制
POJO POJO的全稱有兩個:plain old java object 、plain ordinary java object。我們可以把POJO類看做是簡單的JavaBean類(具有一系列Getter、Setter的方法)。 IOC IOC的全稱是:Inv
Spring IOC/BeanFactory/ApplicationContext的工作流程/實現原理/初始化/依賴注入原始碼詳解
Spring的工作流程/實現原理之基石IOC/BeanFactory/ApplicationContext 更新1:2017/11/23更新2:2018/1/30(截圖)一、什麼是IOC容器?IOC(Inversion of Control)、控制反轉亦稱依賴注入.IOC容器
spring-boot-maven-plugin的工作機制
當我們使用springboot的時候,工程的pom.xml中通常會配置spring-boot-maven-plugin這個外掛,它的工作機制是什麼呢? 外掛配置如下: <build> <plugins> <plugin> &
Spring IOC refresh()方法——告訴子類重新整理內部bean工廠
告訴子類重新整理內部bean工廠。 /** * Tell the subclass to refresh the internal bean factory. * @return the fresh BeanFactory inst
Spring Ioc 容器如何工作
Ioc 容器如何工作 前面介紹了 Core 元件、Bean 元件和 Context 元件的結構與相互關係,下面這裡從使用者角度看一下他們是如何執行的,以及我們如何讓 Spring 完成各種功能,Spring 到底能有那些功能,這些功能是如何得來的,下面介紹。 如何建立 B
Spring環境下Mybatis的配置以及工作機制
MyBatis 是一款一流的支援自定義SQL、儲存過程和高階對映的持久化框架。MyBatis 能夠使用簡單的XML 格式或者註解進行來配置,能夠對映基本資料元素、Map 介面和POJO(普通java 物件)到資料庫中的記錄。所有的MyBatis 應用都以SqlSession
Spring IOC原理之Java反射機制
1、反射概念以及為什麼要使用反射 我們考慮一個場景,如果我們在程式執行時,一個物件想要檢視自己所擁有的成員屬性,該如何操作? 那再考慮這樣另一個場景,如果我們想要在執行期獲得某個類Class的資訊如它
利用java反射機制模擬spring IOC原理的實現
在Java中反射和動態代理機制很強大,通過反射機制在執行時獲取資訊。用於實現IOC。 代理是Java基本的設計模式,提供向物件插入額外的或不同的操作。Java的動態代理能動態的建立代理物件,以及動態的呼叫代理方法。用於實現AOP。一、Java反射機制1、作用 (1)在執行時判斷任意一個物件所屬的類; (
android核心剖析學習筆記:AMS(ActivityManagerService)內部原理和工作機制
一、ActivityManagerService提供的主要功能: (1)統一排程各應用程式的Activity (2)記憶體管理 (3)程序管理 二、啟動一個Activity的方式有以下幾種:
番外 01:Spring IoC 實現原理簡析,Java的反射機制,通過類名建立物件
轉載請註明來源 賴賴的部落格 前景概要 在 01 走進Spring,Context、Bean和IoC 中,我們看到了強大的Spring通過ApplicationContext實現了bean工廠(也就是物件工廠),那究竟是怎麼實現的呢,本次給大家寫一個小D
Java反射機制模擬Spring IOC容器
Ref: java反射機制 package reflection; import java.lang.reflect.Method; public class InvokeTest { public String add(int param1, int p
Spring Ioc實現機制——簡析
public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> beans = new HashMap<String, Object>(); //IoC