1. 程式人生 > >Spring IOC 內部工作機制

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