Spring源碼(1)-Spring中的Bean和BeanDefinition

用過Spring的一定知道,Spring提供了IOC的功能,也就是反轉控制,將對象之間的關係 轉而使用配置來管理,從而提供了
依賴注入的功能。 Spring通過將對象包裝在Bean中,來達到管理對象和進行其他額外操作的目的。

什麼是Bean?

1.Bean的本質還是Java對象,只有這個對象的生命週期由容器來管理。
2.我們不需要爲了創建一個Spring中的Bean而再原來的對象上做任何 額外的操作,因此說 Spring框架是低侵入或者是無侵入的框架。
3.既然沒有改變原來的代碼,我們平常是使用配置文件或者配置類來表示如何 管理這個類。

什麼是BeanDefinition?

在JDK中,是採用Java.lang.class來描述一個對象。而在Spring中,就是通過BeanDefinition這個類來描述Bean的。Spring是通過讀取配置文件或者配置類來生成BeanDefinition對象。
BeanDefinition由哪些屬性?
相比你也很熟悉。
Scope(Singleton,prototype等等)
lazy-init(懶加載-用的時候才加載構造,不用的時候不加載);
singleton默認是非 懶加載,prototype 默認是懶加載。
懶加載 的好處是在使用的再加載節省資源,不利於提前發現錯誤。反之亦然。
primary(如果按照類型來裝配,一個接口 有多個實現類,設置了這個屬性的類會被優先使用)
factoryBean-工廠類的名稱,同等效力的註解是@configuration(根據工廠類生成Bean實例)

  <bean class="com.fuyouj.model.factory.StaticFactory" id="user2" factory-method="getUssr" scope="singleton"></bean>
public class StaticFactory {
    public static User getUssr(){
        return new User();
    }
}

faxtory-Method-工廠方法的名稱,同等效力的註解是@Bean(將某方法返回的類型交給容器管理)

   <bean class="com.fuyouj.model.factory.UserFactory" id="userFactory"></bean>
    <bean id="user3" factory-bean="userFactory" factory-method="getUser" scope="prototype"></bean>
public class UserFactory {
    public User getUser(){
        return new User();
    }
}

不管我們是使用xml配置 文件還是配置類也好,Spring初始化容器都要經歷 以下幾個階段。
1,讀取配置文件或者其他配置類讀取到內存總
2,在內存中,這些配置會被轉換成一個個的Resource的實例
3,將Resource實例解析成BeanDefinition的實例。
4,根據BeanDefinition的指示註冊到容器當中。(容器根據指示創建實例,比如是否是單例,懶加載,ID等等)

BeanDefinition接口

在這裏插入圖片描述
可以看到BeanDefinition繼承了 AttributeAccessor, BeanMetadataElement兩個接口。Spring中有大量的接口,每個類實現了某一個接口也就是承諾了擁有了某種能力。
AttributeAccessor接口定義用於附加和訪問元數據的通用契約的接口(Interface defining a generic contract for attaching and accessing metadata),BeanDefinition繼承這個接口主要是爲了實現類提供獲取本類的屬性和一些設置操作。
在這裏插入圖片描述
而BeanDefinition的定義的方法太多,這裏不貼圖。總結下來就是一些定義Bean的屬性和方法。(sccop,父類名字,延遲加載 ,是否單例,優先加載,工廠名字==)。
BeanMetadataElement接口只定義了了一個getSource方法 ,返回這個元數據元素的配置源。
在這裏插入圖片描述
BeanDefinition繼承了這個接口,是用來返回BeanDefinition本身。

BeanDefinition僅僅是定義了接口,但是他繼承了 AttributeAccessor, BeanMetadataElement兩個接口,就能對BeanDefinition的誰能夠進行操作了。就AttributeAccessorSupport是AttributeAccessor的實現抽象類,提供所有方法的簡單實現。
在這裏插入圖片描述

AbstractBeanDefinition

在這裏插入圖片描述
AbstractBeanDefinition是所有BeanDefinition的實現類的基類。提供了一些操作BeanDefiniton的通用方法的實現,比如一個構造方法設置大量的屬性,比如通過其他BeanDefiniton覆蓋自己的屬性。這裏是值得 借鑑的,我就經常遇到要用其他類的屬性覆蓋自己類,而我就簡單粗暴的新開一個方法,想了想還是我項目太小了的原因吧。如果涉及到有多個實現子類,且實現子類有共同需要實現的邏輯,可以考慮將通用的部分放在抽象類,而繼承抽象類來複用能力。

AbstractBeanDefinition的三個實現類

在這裏插入圖片描述

RootBeanDefinition

RootBeanDefinition可以單獨作爲一個BeanDefinition和其他BeanDefinition的父類,但是不能作爲其他BeanDefiniton的子類,這是怎麼實現的呢?

@Override
	public void setParentName(@Nullable String parentName) {
		if (parentName != null) {
			throw new IllegalArgumentException("Root bean cannot be changed into a child bean with parent reference");
		}
	}

可以看到,如果在 RootBeanDefinition裏面設置Parent屬性,就會拋出異常,我又感覺學到了。可以得出信息,Spring定義的Bean之間的繼承關係,不是通過 關鍵字Implement或者 extends實現的,而時通過設置Parent屬性來確定的。

GenericBeanDefinition

是新版本的實現 ,大部分的實現都用此類,而不是ROOT和Child.
主要區別在於多了一個parent屬性。(ROOT是沒有的)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章