【Spring源碼分析】一、BeanFactory之XmlBeanFactory

一、源碼切入點

 bf = new XmlBeanFactory(new ClassPathResource("bean.xml"));
 User user = bf.getBean("user", User.class);
 user = bf.getBean("user", User.class);

bean.xml定義

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.gupao.domain.User"/>

</beans>


二、分析XmlBeanFactory的UML圖

我來實現
定義個BeanFactory工廠,然後需要一個解析類,進行解析配置文件,然後需要一個反射工具類,根據clsss反射獲取bean。
首先BeanFactory中有getBean、parseBeanDefinition、CreateBean方法,具體工廠中類中組合解析文件文件接口,根據不同的配置文件傳入不同的解析策略,然後就是反射獲取bean instance。

Sping的實現
利用idea來生成uml圖
在這裏插入圖片描述
看了這個圖才發現spring框架是絕對的面向接口編程,而且spring對封裝和一個對象的單一功能做到了極致。

1. BeanFactory: 這個是最頂層接口,裏面基本只包含 getBean方法。
看到這裏我當時的感覺就是:這就很奇怪,bean工廠是用來產生bean的,但是這個接口沒有如何加載、解析配置文件?
分析:配置文件可能是xml、properties、json等,Bean工廠是用來產生bean的,會用到解析功能,這個解析功能進行了封裝,會組合到具體的bean工廠裏面

2. ListableBeanFactory: 根據各種條件獲取Bean 的配置List。 他不是根據name or id 去獲取單個的bean,而是集合概念。
分析:這個接口中的方法主要用於判斷和統計是否存在bean配置,其他的方法反而ApplicationContext用的更多。

3. HierarchicalBeanFactory: 看名字就是分層次的bean工廠,他有2個方法,一個是設置他的parent 工廠,一個是從containsLocalBean判斷自己工廠的是否含有這個bean
分析:這個使用存在多個工廠嵌套的時候,具有父子層級關係,感覺這個也用不到

4.ConfigurableBeanFactory: 配置factory的方法。,比如設置factory的classloader等(無需考慮繼承SingletonBeanRegistry接口)
分析:接口之間的層次真的很分明,非常值得學習

5.AutowireCapableBeanFactory: 直接繼承BeanFactory,具有創建bean,自動注入bean、初始化bean和初始化bean的後置處理等。
分析:這個子接口算是非常重要了,後續的factory必須實現它,這裏就感覺接口之間的層次真的很分明,非常值得學習

6.ConfigurableListableBeanFactory: 所有factory的大集合。listable、configurable、autowireable

8. AliasRegistry: 別名管理

9. SimpleAliasRegistry: 別名管理的一個簡單實現,主要是用map進行存儲別名

10. SingletonBeanRegistry: 單例接口的註冊和管理(比如根據名字獲取單例,判斷單例map中是否存在instance)。
分析:這個就是針對單例進行的最頂層抽象,對單例進行的統一管理,這種對某一類統一管理的思想值得學習

11.DefaultSingletonBeanRegistry 主要是對接口SingletonBeanRegistry單例管理進行的實現,而且也繼承了SimpleAliasRegistry,具有簡單別名管理。
分析:spring從來都不是在最終的工廠類中對接口進行實現,而是在中間過程就把接口默認實現了一部分,這樣做可以重複利用中間類,而且如果對默認實現不滿足情況,可以在最終工廠類中進行重寫。非常值得借鑑

12.FactoryBeanRegistrySupport: 整合DefaultSingletonBeanRegistry的單例管理功能,還有增加對FactoryBean的處理
分析:不明白這個功能的含義

13.AbstractBeanFactory: 首先繼承FactoryBeanRegistrySupport,那麼他會有單例管理和別稱管理功能。然後實現了ConfigurableBeanFactory接口,他會對ConfigurableBeanFactory進行默認的實現,而且對接口BeanFactory中的getBean方法應用模板方法(調用的createBean方法是抽象的)進行實現,堪稱經典

分析:

  • 繼承後具有單例管理功能和別稱管理功能
  • 對ConfigurableBeanFactory接口中的方法進行默認實現
  • 實現getBean(模板設計模式的經典應用)

14.AbstractAutowireCapableBeanFactory: 這個類是createBean 模板方法的實現類。這裏類的註釋上特殊說明,關於類的定義和類的配置解析等等不在這個類中,而是在BeanDefinitionRegistry進行實現。

15.BeanDefinitionRegistry: 持有bean定義的管理(增刪改查)和註冊功能

16.DefaultListableBeanFactory: 這個算是最重要的類了,首先他實現ConfigurableListableBeanFactory,那麼他必須具有listable、配置工廠、createBean實現類的功能。 繼承了AbstractAutowireCapableBeanFactory,那麼它實現了配置、createBean的功能 ,它有繼承了BeanDefinitionRegistry,他必須實現bean的定義和註冊中心。

  • 必須實現listable
  • 必須實現bean的定義和註冊中心
public DefaultListableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		super(parentBeanFactory);
	}

這個就是實現了工廠的層級關係,這個super會調用AbstractAutowireCapableBeanFactory中的方法。

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