上篇講解了探索SpringBoot-一塊兒來看看Spring容器加載核心源碼(六),講解到要探索obtainFreshBeanFactory()
函數,可是不瞭解Spring容器
的設計理念是沒有辦法來理解obtainFreshBeanFactory()
函數的,因此今天來看看Spring容器
最最基本的接口設計BeanFactory
。java
接着咱們的探索SpringBoot-一塊兒來看看Spring容器加載核心源碼(六)中的ClassPathXmlApplicationContext
,咱們打開Idea
而且打開這個源代碼文件,而且右鍵依次點擊Diagrams
->show Diagrams
,最後咱們能夠獲得一張很是神奇的圖。(我感受不少人都不知道idea
可以作到這個事情,不知道的舉手,hahah)spring
從上圖中,咱們能夠清晰地看到最中心的接口是ApplicationContext
,最底層的接口是BeanFacotry
。今天暫時先無論ApplicationContext
,由於咱們必須先理解了BeanFactory
以後,才能理解ApplicationContext
。編程
而後,咱們打開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的容器工開發人員使用。其中DefaultListableBeanFactory
是Spring
提供的一個實現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.
*
複製代碼
大意是這是一個實現了ListableBeanFactory
和BeanDefinitionRegistry
的完整的bean
定義的對象。理解就是這是一個最基本的,可是也是可用的BeanFacotry實現。
那麼具體是怎麼實現的呢?且聽下回分解。
之後這裏天天都會寫一篇文章,題材不限,內容不限,字數不限。儘可能把本身天天的思考都放入其中。
若是這篇文章給你帶來了幫助,能請你寫下是哪一個部分嗎?有效的反饋是對我最大的幫助。
我是shane。今天是2019年8月12日。百天寫做計劃的第十九天,19/100。