spring5源碼分析系列(二)——spring核心容器體系結構

首先咱們來認識下IOC和DI:spring

  • IOC(Inversion of Control)控制反轉:控制反轉,就是把原先代碼裏面須要實現的對象建立、依賴的代碼,反轉給容器來幫忙實現。因此須要建立一個容器,而且須要一種描述來讓容器知道須要建立的對象與對象的關係。這個描述最具體表現就是可配置的文件。
  • DI(Dependency Injection)依賴注入:指對象是被動接受依賴類而不是本身主動去找,即對象不是從容器中查找它依賴的類,而是在容器實例化對象的時候主動將它依賴的類注入給它。

思考如下問題:安全

  • 對象和對象關係怎麼表示?能夠用xml,properties文件等語義化配置文件表示。
  • 描述對象關係的文件存放在哪裏?classpath,filesystem,servletContext等。
  • 有了配置文件,還須要對配置文件解析。不一樣的配置文件對對象的描述不同,如標準的,自定義聲明式的,如何統一呢?這就須要在內部有一個統一的關於對象的定義,全部外部的描述都必須轉化成統一的描述定義。
  • 如何對不一樣的配置文件進行解析?須要對不一樣的配置文件語法,採用不一樣的解析器。

接下來咱們看Spring是怎麼作到的。 ui

1.BeanFactory spa

Spring使用工廠模式建立Bean,這一系列的Bean工廠,也即IOC 容器,爲開發者管理對象間的依賴關係提供了不少便利和基礎服務。Spring中有許多IOC 容器的實現供選擇和使用,其相互關係以下: code

BeanFactory做爲最頂層的一個接口類,定義了IOC容器的基本功能規範,BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。最終的默認實現類是DefaultListableBeanFactory,他實現了全部的接口。 xml

爲什麼要定義這麼多層次的接口呢?查閱這些接口的源碼和說明發現,每一個接口都有他使用的場合,主要是爲了區分在Spring內部在操做過程當中對象的傳遞和轉化過程當中,對對象的數據訪問所作的限制。例如ListableBeanFactory接口表示這些Bean是可列表的,HierarchicalBeanFactory表示這些 Bean是有繼承關係的,也就是每一個Bean有可能有父Bean。AutowireCapableBeanFactory接口定義 Bean的自動裝配規則。這四個接口共同定義了Bean的集合、Bean之間的關係、Bean的行爲。 對象

咱們看一下BeanFactory源碼裏的方法:blog

public interface BeanFactory {
    // 對FactoryBean的轉義定義,由於若是使用bean的名字檢索FactoryBean獲得的對象是工廠生成的對象,  
    // 若是須要獲得工廠自己,須要轉義  
    String FACTORY_BEAN_PREFIX = "&";
    // 根據bean的名字,獲取在IOC容器中獲得bean實例  
    Object getBean(String name) throws BeansException;  
    // 根據bean的名字和Class類型來獲得bean實例,增長了類型安全驗證機制。  
    <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;  
  
    Object getBean(String name, Object... args) throws BeansException;  
    <T> T getBean(Class<T> requiredType) throws BeansException;  
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;  
  
    // 提供對bean的檢索,看看是否在IOC容器有這個名字的bean  
    boolean containsBean(String name);  
  
    // 根據bean名字獲得bean實例,並同時判斷這個bean是否是單例  
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;  
  
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;  
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;  
    boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;  
  
    // 獲得bean實例的Class類型  
    @Nullable  
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;  
  
    // 獲得bean的別名,若是根據別名檢索,那麼其原名也會被檢索出來  
    String[] getAliases(String name);
}

對於FACTORY_BEAN_PREFIX,這裏解釋如下:與BeanFactory很類似的有一個叫FactoryBean的類,從名字上很容易混淆,BeanFactory首先是Factory,而FactoryBean是bean,是一種特殊的bean, 這種特殊的bean會生產另外一種bean, 對於普通的bean,經過BeanFactory的getBean方法能夠獲取這個bean,而對於FactoryBean來講,經過getBean得到的是FactoryBean生產的bean,而不是FactoryBean自己,若是想要獲取FactoryBean自己,那麼能夠加前綴&,spring就會明白,原來是須要FactoryBean 。 繼承

BeanFactory只對IOC容器的基本行爲做了定義,不用關心Bean是如何定義怎樣加載的。
要知道工廠是如何產生對象的,須要看具體的IOC 容器實現,Spring 提供了許多 IOC 容器的實現。好比XmlBeanFactory,ClasspathXmlApplicationContext 等。其中 XmlBeanFactory是針對最基本的IOC容器的實現,這個IOC 容器能夠讀取XML文件定義的BeanDefinition(XML文件中對bean的描述)。ApplicationContext是Spring提供的一個高級的IOC 容器,它除了可以提供IOC容器的基本功能外,還爲用戶提供瞭如下的附加服務:接口

  • 支持信息源,能夠實現國際化。(實現MessageSource接口)
  • 訪問資源。(實現ResourcePatternResolver接口)
  • 支持應用事件。(實現ApplicationEventPublisher 接口)

2.BeanDefinition

SpringIOC容器管理了咱們定義的各類Bean對象及其相互的關係,Bean對象在Spring實現中是
以BeanDefinition來描述的,其繼承體系以下:

Bean的解析過程很是複雜,功能被分的很細。Bean的解析主要是對Spring配置文件的解析。解析過程主要經過下圖中的類完成:

相關文章
相關標籤/搜索