1. 程式人生 > >spring原始碼分析系列4:ApplicationContext研究

spring原始碼分析系列4:ApplicationContext研究

ApplicationContext介面

首先看一下一個最基本的上下文應該是什麼樣子

ApplicationContext介面的註釋裡寫的很清楚:
一個基本applicationContext應該提供:

  • 訪問Bean的能力
  • 提供載入資源的能力
  • 釋出事件的能力
  • 解析訊息、支援國際化的能力

AbstractApplicationContext承上啟下

ConfigurableApplicationContext介面:

大部分上下文都實現了此介面. 此介面除了繼承了ApplicaitnContext介面的能力外. 還具有可配置上下文與生命週期管理功能.
其中最重要的是定義了refresh()方法. refresh()功能是載入配置.

AbstractApplicationContext抽象類:

大部分上下文都繼承了此類.AbstractApplicationContext可以說啟到承上啟下的作用.

從繼承圖我們看, AbstractApplicationContext實現了大部分的介面方法.
其中refresh()方法的實現.為ApplicationContext提供了載入配置的能力.

載入的什麼配置呢?
其實:所謂載入的配置大部分都是載入Bean

ApplicationContext與BeanFactory關係

上節分析了BeanFactory儲存BeanDefinition與Bean. 並且BeanFactory的createBean()方法可以將BeanDefinition建立成Bean.

要想從BeanFactory中獲取Bean,就得先有BeanDefinition. 有了BeanDefinition,還要觸發BeanDefinition到Bean的建立.

這裡就產生了兩個問題:

  • BeanDefinition從哪裡來?
  • 建立過程在哪裡觸發的?

ApplicationContext扮演的角色也就顯而易見了.

ApplicationContext初始化的核心工作是將散落在各個目錄下的各種配置形式的Bean定義,蒐集起來解析成BeanDefinition併入庫到BeanFactory.然後觸發BeanDefinition建立成Bean,存到BeanFactory中

至此: 整個spring啟動的脈絡就也清晰了. 兩大塊:Bean定義的蒐集+Bean的建立

.

[開發人員]--標註-->[Bean定義] --蒐集--> [BeanDefinition] --建立-->[Bean]

ApplicationContext重要工作

開發人員常用的標註Bean定義的方式有.

  • xml檔案標註Bean定義
  • 註解標註Bean定義

ApplicationContext將這些Bean定義轉為BeanDefinition並不是那麼容易.

第一步蒐集:需要把散落的Bean定義的載體找到.蒐集起來.(注意,ApplicationContext蒐集Bean定義的過程其實也是通過呼叫工具來執行的)

  • XML對應的有XmlBeanDefinitionReader 蒐集器
  • 註解JavaConfig對應的有ClassPathBeanDefinitionScanner收集器

第二步解析.將XML或者JavaConfig中的標註了Bean定義的轉為BeanDefinition

第三步:擴充套件點.BeanFactoryPostProcessor.實現了此介面的類可以在BeanDefinition入庫到BeanFactory的這個階段中,修改BeanDefinition資訊.這也是spring留下的擴充套件點。

BeanDefinitionRegistryPostProcessor與BeanFactoryPostProcessor與BeanPostProcessor區別:

  • BeanFactoryPostProcessor:可以修改BeanDefinition。發生在BeanDefinition入庫到BeanFactory階段.
  • BeanDefinitionRegistryPostProcessor繼承與BeanFactoryPostProcessor:單從名字上看,我們可以看出,這個PostProcessor跟BeanDefinition註冊有關。他發生的階段比BeanFactoryPostProcessor更早,他用來註冊BeanDefinition用。實現了此介面的可以看作一個BeanDefinition掃描註冊器。
  • BeanPostProcessor: 發生在BeanDefinition建立Bean階段。

總結:

BeanDefinition是物料
Bean是成品
BeanFactory 儲存物料,儲存成品.
ApplicationContext初始化: 蒐集物料,入庫到BeanFactory, 並觸發非懶載入成品的建立.
歡迎大家關注我的公眾號【原始碼行動】,最新個人理解及時奉送。

相關推薦

spring原始碼分析系列4:ApplicationContext研究

ApplicationContext介面 首先看一下一個最基本的上下文應該是什麼樣子 ApplicationContext介面的註釋裡寫的很清楚: 一個基本applicationContext應該提供: 訪問Bean的能力 提供載入資源的能力 釋出事件的能力 解析訊息、支援國際化的能力 Abstrac

Spring原始碼分析系列ApplicationContext 相關介面架構分析

在使用Spring的時候,我們經常需要先得到一個ApplicationContext物件,然後從該物件中獲取我們配置的Bean物件

spring原始碼分析系列5:ApplicationContext的初始化與Bean生命週期

回顧Bean與BeanDefinition的關係. BeanFactory容器. ApplicationContext上下文. 首先總結下: 開發人員定義Bean資訊:分為XML形式定義;註解式定義 ApplicationContext蒐集Bean的定義;儲存到BeabFactory容器的中。 BeanFa

spring原始碼分析系列3:BeanFactory核心容器的研究

目錄 @(spring原始碼分析系列3:核心容器的研究) 在講容器之前,再明確一下知識點。 BeanDefinition是Bean在容器的描述。BeanDefinition與Bean不是一個東西。 Bean是根據BeanDefinition創建出來的。也即是

Spring原始碼分析4】-Spring掃描basePackages註解

org.springframework.beans.factory.support.DefaultListableBeanFactory 重要資料結構 /** Map of bean definition objects, keyed by bean name */ p

spring原始碼分析系列 (2) spring拓展介面BeanPostProcessor

主要分析內容: 一、BeanPostProcessor簡述與demo示例 二、BeanPostProcessor原始碼分析:註冊時機和觸發點   一、BeanPostProcessor簡述與demo示例 BeanPostProcessor是spring非常重要的拓展介面,例如aop通過拓展

Spring原始碼分析4)---BeanFactoryPostProcessor(看見的不一定是真的)

在第二編對BeanFactory的分析中,我們老能看見BeanFactoyPostProcessor的身影,那麼在這一節中,我們來詳細的討論一下BeanFactoryPostProcessor的程式碼結構,從中學習他的優秀之處;BeanFactoryPostProcessor

spring原始碼分析系列2:Bean與BeanDefinition關係

介面表示一種能力,實現了一個介面,即擁有一種能力。 BeanDefinition與Bean的關係, 就好比類與物件的關係. 類在spring的資料結構就是BeanDefinition.根據BeanDefinition得到的物件就是我們需要的Bean. 我認為理解Bean與BeanDefinition是理解

Spring5原始碼分析系列(九)Spring事務原理詳解

終於等到了B站的薪資溝通電話,美滋滋,本節開始進入Spring資料訪問篇,講解spring事務,文章參考自Tom老師視訊。 事務基本概念 事務(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。 特點: 事務是恢復和併發控制的基

Spring-Cloud-Gateway原始碼分析系列| Spring-Cloud-Gateway初始化

推薦 Spring Boot/Cloud 視訊: Spring-Cloud專案使用EnableAutoConfiguration註解自動 初始化配置資訊,Spring-Cloud-Gateway同樣,Spring-Cloud-Gateway下的spring.f

Spring-Cloud-Gateway原始碼分析系列 | Spring-Cloud-Gateway之GatewayProperties初始化載入

推薦 Spring Boot/Cloud 視訊: 在Spring-Cloud-Gateway初始化時我們在GatewayAutoConfiguration配置中看到了有初始化載入GatewayProperties例項的配置,接下來學習下GatewayPrope

Spring原理與原始碼分析系列(七)- Spring AOP實現過程與實戰

二、Spring AOP 1、什麼是Spring AOP Spring AOP是Spring核心框架的重要組成部分,採用Java作為AOP的實現語言。與AspectJ實現AOP方式不同之處在於,Spring AOP僅支援方法級別的攔截。 2、

Spring原始碼分析4spring bean建立和初始化

1 介紹 建立並初始化spring容器中,refresh()方法中解析xml配置檔案,註冊容器後處理器,bean後處理器,初始化MessageSource,ApplicationEventMulticaster廣播器,註冊完ApplicationListene

Glide 系列-2:主流程原始碼分析4.8.0)

Glide 是 Android 端比較常用的圖片載入框架,這裡我們就不再介紹它的基礎的使用方式。你可以通過檢視其官方文件學習其基礎使用。這裡,我們給出一個 Glide 的最基本的使用示例,並以此來研究這個整個過程發生了什麼: Glide.with(fragment).load(myU

4Spring原始碼分析4之初始化Bean

1、記錄建立bean的ObjectFactory,目的是為了解決迴圈依賴 if (instanceWrapper == null)

算法分析| 系列4(解決遞推)

關系 height class pan 一個 bre series 循環 都是 在前一篇文章中,我們討論了循環的分析。許多算法本質上是遞歸的。當我們分析它們時,我們得到時間復雜度的遞歸關系。我們得到的運行時間是大小為n的輸入作為n的函數,以及較小大小的輸入的運行時間。例如在

Mybatis原始碼分析4)—— Mapper的建立和獲取

Mybatis我們一般都是和Spring一起使用的,它們是怎麼融合到一起的,又各自發揮了什麼作用? 就拿這個Mapper來說,我們定義了一個介面,聲明瞭一個方法,然後對應的xml寫了這個sql語句, 它怎麼就執行成功了?這傢伙是怎麼實現的,帶著這個好奇心,我一步步跟蹤,慢慢揭開了它的

Spring原始碼分析——除錯環境搭建(可能是最省事的構建方法)

1. 依賴工具 idea git jdk 1.8 + Gradle 2. 獲取原始碼   從github https://github.com/spring-projects/spring-framework 上 Fork 出屬於自己的倉庫。如果懶得這麼做也可以

[Mybatis原始碼分析系列]]03 TypeAliasRegistry

TypeAliasRegistry 負責註冊,儲存,獲取MyBatis別名的類 typeAliases(別名介紹) 類型別名是為 Java 型別設定一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減少類完全限定名的冗餘。例如: <typeAliases>

[Mybatis原始碼分析系列] 01 解析mybatis-config.xml配製檔案並返回SqlSessionFactory的類SqlSessionFactoryBuilder

前言 公司一直在使用Jpa + Hibernate那一套東西,但是這套技術封裝的太過後重。不利於開發人員掌握,而在優化sql方面也是蛋疼的很。所以在後臺不是特別重要的專案中引入了MyBatis。當然光會使用,是滿足不了本吊絲的胃口,所以走上了分析MyBatis原始碼的道路,並有了這一系列