探索SpringBoot-一塊兒看看Spring核心源碼之BeanFactory(七)

前文回顧

上篇講解了探索SpringBoot-一塊兒來看看Spring容器加載核心源碼(六),講解到要探索obtainFreshBeanFactory()函數,可是不瞭解Spring容器的設計理念是沒有辦法來理解obtainFreshBeanFactory()函數的,因此今天來看看Spring容器最最基本的接口設計BeanFactoryjava

ClassPathXmlApplicationContext引出的類繼承關係

接着咱們的探索SpringBoot-一塊兒來看看Spring容器加載核心源碼(六)中的ClassPathXmlApplicationContext,咱們打開Idea而且打開這個源代碼文件,而且右鍵依次點擊Diagrams->show Diagrams,最後咱們能夠獲得一張很是神奇的圖。(我感受不少人都不知道idea可以作到這個事情,不知道的舉手,hahah)spring

從上圖中,咱們能夠清晰地看到最中心的接口是ApplicationContext,最底層的接口是BeanFacotry今天暫時先無論ApplicationContext,由於咱們必須先理解了BeanFactory以後,才能理解ApplicationContext編程

BeanFactory

而後,咱們打開BeanFactory,翻到源代碼對BeanFactory的註釋。bash

* The root interface for accessing a Spring bean container.
 * This is the basic client view of a bean container;
 * further interfaces such as {@link ListableBeanFactory} and
 * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}
 * are available for specific purposes.
複製代碼

大意爲可以訪問Spring bean 容器的根接口。這個是對於bean容器來講最基本的客戶視圖。像其餘ConfigurableBeanFactory和ListableBeanFactory都是爲了特定的功能提供的ide

在《Spring技術內幕》中也這樣解釋到函數

BeanFactory提供的是最基本的IoC容器的功能,BeanFactory接口定義了IoC容器最基本的形式,而且提供了IoC容器所應該遵照的最基本的服務契約,也是咱們使用IoC容器所應遵照的最底層和最基本的編程規範,這些接口定義勾畫了Ioc的基本輪廓。post

讓咱們來看看BeanFactory的接口定義是什麼樣子的?ui

public interface BeanFactory {

	/** * Used to dereference a {@link FactoryBean} instance and distinguish it from * beans <i>created</i> by the FactoryBean. For example, if the bean named * <code>myJndiObject</code> is a FactoryBean, getting <code>&myJndiObject</code> * will return the factory, not the instance returned by the factory. */
	String FACTORY_BEAN_PREFIX = "&";
	
        //1.從容器中獲取指定的Bean
	Object getBean(String name) throws BeansException;

	Object getBean(String name, Class requiredType) throws BeansException;

	Object getBean(String name, Object[] args) throws BeansException;
        //2.判斷容器是否包含了指定的Bean
	boolean containsBean(String name);
        //3.判斷指定的Bean是不是Singleton的
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
        //4.判斷指定的Bean是不是Prototype的
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
        //5.判斷指定的Bean的Class類型是不是特定的Class類型
	boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;
        //6.獲取指定名字Bean的Class類型
	Class getType(String name) throws NoSuchBeanDefinitionException;
        //7.查詢指定Bean的全部的別名
	String[] getAliases(String name);

}
複製代碼

從詳細的註釋中能夠看到總共定義了7個方法,這些方法勾畫出IoC容器的基本特性。用大白話講就是容器起碼得有這幾個方法才能算是一個基本的,合格的容器。idea

在這個基礎上,Spring還提供了一系列符合Ioc的容器工開發人員使用。其中DefaultListableBeanFactorySpring提供的一個實現Ioc容器的最最基本的實現類。依照慣例,咱們也來看看DefaultListableBeanFactory的繼承類圖。spa

經過上圖,咱們能夠看到DefaultListableBeanFactory一方面是實現了左側以BeanFactory爲根的接口,右側是實現BeanDefinitionRegistry接口。打開該類的源代碼,咱們也能夠看到這麼一段話。

/**
 * Default implementation of the
 * {@link org.springframework.beans.factory.ListableBeanFactory} and
 * {@link BeanDefinitionRegistry} interfaces: a full-fledged bean factory
 * based on bean definition objects.
 *
複製代碼

大意是這是一個實現了ListableBeanFactoryBeanDefinitionRegistry的完整的bean定義的對象。理解就是這是一個最基本的,可是也是可用的BeanFacotry實現

那麼具體是怎麼實現的呢?且聽下回分解。

關於寫做

之後這裏天天都會寫一篇文章,題材不限,內容不限,字數不限。儘可能把本身天天的思考都放入其中。

若是這篇文章給你帶來了幫助,能請你寫下是哪一個部分嗎?有效的反饋是對我最大的幫助。

我是shane。今天是2019年8月12日。百天寫做計劃的第十九天,19/100。

相關文章
相關標籤/搜索