1. 程式人生 > >spring原始碼分析系列2:Bean與BeanDefinition關係

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

介面表示一種能力,實現了一個介面,即擁有一種能力。

BeanDefinition與Bean的關係, 就好比類與物件的關係. 類在spring的資料結構就是BeanDefinition.根據BeanDefinition得到的物件就是我們需要的Bean.

我認為理解Bean與BeanDefinition是理解spring的整個架構的基礎與關鍵。我將從Bean與BeanDefinition開始慢慢撥開spring的內幕。

研究bean與BeanDefinition,我認為可以分為兩部分來循序漸進的解析。

  • 一方面從定義入手:研究Bean/BeanDefinition在spring中的定義.
  • 另一方面從動作(操作)入手:研究Bean/BeanDefinition的相關操作。

BeanDefinition

BeanDefinition是bean在spring中的描述,有了BeanDefinition我們就可以建立Bean,BeanDefinition是Bean在spring中的定義形態
接下來我們看看BeanDefinition的相關介面與類.

定義

  • BeanDefinition介面頂級基礎介面,用來描述Bean,裡面存放Bean元資料,比如Bean類名、scope、屬性、建構函式引數列表、依賴的bean、是否是單例類、是否是懶載入等一些列資訊。

向上

  • BeanMetadataElement介面:BeanDefinition元資料,返回該Bean的來源
  • AttributeAccessor介面:提供對BeanDefinition屬性操作能力,

向下

  • AbstractBeanDefinition類:抽象類統一實現了BeanDefinition定義的一部分操作,可以說是定義了BeanDefinition很多預設的屬性。 正是在AbstractBeanDefinition基礎上, Spring衍生出了一些列BeaDefinition。

    這裡我們可以關注下重寫的equals(),hashcode(), toString()方法

    此外initMethodName屬性,destroyMethodName 屬性, 這兩個屬性bean的生命週期有關,此處只提一句,後續講解。

接下來。我們看看從AbstractBeanDefinition上衍生出來的幾個類

  • RootBeanDefinition:
    代表一個xml,java Config來的BeanDefinition

  • ChildBeanDefinition:
    可以讓子BeanDefinition定義擁有從父母哪裡繼承配置的能力

  • GenericBeanDefinition:
    spring2.5後註冊bean首選的是GenericBeanDefinition。GenericBeanDefinition允許動態的設定父bean.GenericBeanDefinition可以作為RootBeanDefinition與ChildBeanDefinition的替代品。

  • AnnotatedBeanDefinition介面:
    表示註解型別BeanDefinition。有兩個重要的屬性,AnnotationMetadata,MethodMetadata分別表示BeanDefinition的註解元資訊和方法元資訊
    實現了此介面的BeanDefinition可以獲取到註解元資料和方法元資料。
  • AnnotatedGenericBeanDefinition類:
    表示@Configuration註解註釋的BeanDefinition類

  • ScannedGenericBeanDefinition類:
    表示@Component、@Service、@Controller等註解註釋的Bean類

操作

動作也可分為兩種:
一種是針對自身的操作: 自提提供給外部的可以操作其本身的動作
另一種是外部對BeanDefinition的操作

  • BeanDefinitionRegistry介面:具有增,查,刪BeanDefinition的能力。一次只能註冊一個BeanDefinition.

    實現類SimpleBeanDefinitionRegistry,DefaultListableBeanFactory,GenericApplicationContext等
    一般實現類裡都都有一個
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap()來儲存BeanDefinition.
  • BeanDefinitionReader介面: 既可以使用BeanDefinitionRegistry構造。也可以通過loadBeanDefinitions把配置載入為多個BeanDefinition並註冊到BeanDefinitionRegistry中。
    可以說是高效版本的BeanDefinitionRegistry.
    實現類有
    XmlBeanDefinitionReader從xml中讀取BeanDefinition;
    PropertiesBeanDefinitionReader從Properties檔案讀取BeanDefinition

  • AnnotatedBeanDefinitionReader類
    對帶有註解的BeanDefinition進行註冊

  • ClassPathBeanDefinitionScanner類:
    可以掃描到@Component @Repository @Service @Controller 的BeanDefinition註冊到容器中。

其他形態

  • BeanDefinitionHolder: BeanDefinition包裝類。

Bean

Bean是我們需要的物件,是我們從spring內得到的結果,也就是物件例項

定義

從定義層面看.Bean其實就是我們需要的物件.

操作

我們來看看Bean在spring有哪些操作相關的介面或類。

  • SingletonBeanRegistry介面:與BeanDefinition的註冊相應的。Bean的操作也有一個類似的介面來操作Bean.SingletonBeanRegistry介面提供了對Bean的註冊,獲取,存在性判斷等功能。
  • InitializingBean:對於實現 InitializingBean的Bean,它將執行 afterPropertiesSet(); 在所有的 bean 屬性被設定之後。
  • InstantiationStrategy:提供 Bean例項化的策略介面,
  • DisposableBean:對於 實現了DisposableBean的Bean ,它將執行 destroy()在 Spring 容器釋放該 bean 之後
  • FactoryBean: 生產Bean的Bean.

其他形態

  • BeanWrapper:
    對Bean的包裝.BeanWrapper可以看作是一個從 BeanDefinition 到 Bean 過程中間的產物,可以稱為”低階 bean“,在一般情況下,我們不會在實際專案中用到它。BeanWrapper 是 Spring 框架中重要的元件類,它就相當於一個代理類,Spring 委託 BeanWrapper 完成 Bean 屬性的填充工作。在 bean 例項被 InstantiatioonStrategy 創建出來後,Spring 容器會將 Bean 例項通過 BeanWrapper 包裹起來,是通過 BeanWrapper.setWrappedInstance() 完成的

總結:

BeanDefinition是物料,Bean是成品,理解BeanDefinition與Bean的關係是理解spring的基礎

下篇分享 物料倉庫,成品倉庫,體現在“存”的操作。
歡迎大家關注我的公眾號【原始碼行動】,最新個人理解及時奉送。

相關推薦

spring原始碼分析系列2:BeanBeanDefinition關係

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

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

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

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

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

Spring原始碼分析2】-Tomcat和Sping的連線點

Tomcat是怎麼呼叫上Spring的呢?需要找到這個連線點。 答案就在org.apache.catalina.startup.ContextConfig的processServletContainerInitializers方法 new WebappServiceLo

分散式訊息佇列RocketMQ原始碼分析2 -- BrokerNameServer心跳機制

我們知道,Kafka是通過ZK的臨時節點來監測Broker的死亡的。當一個Broker掛了之後,ZK上面對應的臨時節點被刪除,同時其他Broker收到通知。 那麼在RocketMQ中,對應的NameServer是如何判斷一個Broker的死亡呢? 有興趣朋友

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

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

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

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

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

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

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

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

spring原始碼分析(二):bean元件賦值

文章目錄 常用註解 @Value和@PropertySource 介紹 使用案例 @AutoWired、@Qulifer 、@Primary 介紹 使用總結

Spring5原始碼分析系列(四)Spring5原始碼分析2

本文緊接上文Spring5原始碼分析1,講解基於XML的依賴注入,文章參考自Tom老師視訊,下一篇文章將介紹基於Annotation的依賴注入。 基於XML的依賴注入 1、依賴注入發生的時間 當SpringIOC容器完成了Bean定義資源的定位、載入和解析註冊以後,IO

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原始碼分析(三)(IoC容器的依賴注入)(2

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { //這裡取得在BeanDefinition中設定的property值,這些property來自對BeanDefini

Spring原始碼分析(二)(IoC容器的實現)(2

IoC容器的初始化過程     簡單來說IoC容器的初始化是由refresh()方法啟動的,這個方法標誌著IoC容器的正式啟動。這個啟動包括BeanDefinition的Resouce定位、載入和註冊三個基本過程。     第一

spring原始碼分析:Aware介面讓你的bean對容器直接操作

相信大家都知道很多其他框架,比如mybatis,shiro等等,spring框架本身有些類會實現ApplicationContextAware,BeanFactoryAware或者等等其他XXXAware,這是用來幹嘛呢? spring容器來管理bean。如果說bean需要知道容器的

spring原始碼分析bean的載入

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

spring原始碼分析bean的載入第二步

從parentBeanFactory中獲取,並且處理迴圈依賴的問題: org.springframework.beans.factory.support.AbstractBeanFactory.java中 doGetBean方法, @SuppressWarnin

spring原始碼分析bean的載入第三步-單例的建立 上篇

在上一篇部落格中有單例建立的如下程式碼: if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(bean