前一篇 Spring Ioc 概述 中已對(duì) Spring Ioc 做了一些基本的介紹,在文章的最后分別舉了使用 ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext 來(lái)創(chuàng)建 Spring Ioc 容器的例子喉刘。分析這兩個(gè)類的繼承關(guān)系腹殿,他們均為 ApplicationContext 的實(shí)現(xiàn)類科阎,因此就先通過(guò) ClassPathXmlApplicationContext 的繼承關(guān)系來(lái)分析碗淌。
-
ClassPathXmlApplicationContext 類圖
images從類圖中分析 ClassPathXmlApplicationContext 的類繼承關(guān)系
ClassPathXmlApplicationContext -- AbstractXmlApplicationContext -- AbstractRefreshableConfigApplicationContext -- InitializingBean -- BeanNameAware -- AbstractRefreshableApplicationContext -- AbstractApplicationContext -- DefaultResourceLoader -- ConfigurableApplicationContext -- ApplicationContext ApplicationContext -- EnvironmentCapable -- MessageSource -- ApplicationEventPublisher -- ResourcePatternResolver -- ListableBeanFactory -- HierarchicalBeanFactory -- BeanFactory
從類的繼承關(guān)系可以看出掩完,ClassPathXmlApplicationContext 實(shí)現(xiàn)了 ApplicationContext 接口馆截,而 ApplicationContext 接口又是在 BeanFactory 接口的基礎(chǔ)上進(jìn)行了擴(kuò)展充活。因此先從 BeanFactory 及其子接口開(kāi)始分析蜂莉。
BeanFactory
-
BeanFactory 體系結(jié)構(gòu)
imagesBeanFactory 的體系結(jié)構(gòu)圖中,包含了一系列的接口及實(shí)現(xiàn)類
-
接口
-- BeanFactory(一級(jí)接口) 一級(jí)接口混卵,定義了獲取 Bean映穗、BeanType、單例多例的方法 -- ListableBeanFactory(二級(jí)接口) 可列表化的BeanFactory幕随,添加了根據(jù)BeanDefinition相關(guān)的一些操作蚁滋,以及列表化返回結(jié)果的接口 -- HierarchicalBeanFactory(二級(jí)接口) 實(shí)現(xiàn)了工廠的分層,引入父子容器的概念 1. 父子容器是相互隔離的赘淮,他們內(nèi)部可以存在名稱相同的 Bean 2. 子容器可以訪問(wèn)父容器的Bean辕录,父容器不能訪問(wèn)子容器的Bean 3. 調(diào)用子容器的getBean方法,會(huì)沿著當(dāng)前的容器向上層查找梢卸,直到找到對(duì)應(yīng)的Bean為止 4. 子容器可以通過(guò)任何方式注入父容器中的Bean走诞,而父容器無(wú)法注入子容器的Bean -- ConfigurableBeanFactory(三級(jí)接口) 對(duì) HierarchicalBeanFactory 增強(qiáng),同時(shí)繼承了 SingletonBeanRegistry -- AutowireCapableBeanFactory(二級(jí)接口) 1. 對(duì)于想要擁有自動(dòng)裝配能力蛤高,并且想要把這種能力暴露給外部應(yīng)用BeanFactory類需要實(shí)現(xiàn)此接口速梗。 2. 正常情況下不要使用此接口,應(yīng)該更傾向于使用BeanFactory或者ListableBeanFactory接口襟齿。 3. 此接口主要是針對(duì)框架之外姻锁,沒(méi)有向Spring托管的Bean的應(yīng)用。通過(guò)暴露此功能猜欺,Spring框架之外的程序位隶,具有自動(dòng)裝配Spring的功能 4. 需要注意的是ApplicationContext并沒(méi)有實(shí)現(xiàn)此接口。因?yàn)閼?yīng)用代碼很少使用此功能开皿。如果確實(shí)需要的話可以調(diào)用ApplicationContext.getAutowireCapableBeanFactory()的方法涧黄,來(lái)獲取此接口的實(shí)例 5. 如果一個(gè)類實(shí)現(xiàn)了此接口,那么很大程度上它還需要實(shí)現(xiàn)BeanFactoryWare接口赋荆。它可以在應(yīng)用上下文中返回BeanFactory; -- ConfigurableListableBeanFactory(四級(jí)接口)
public interface BeanFactory { /**作用:如果在使用beanName獲取Bean時(shí)笋妥,在BeanName前添加這個(gè)前綴, * 那么使用這個(gè)BeanName獲得的Bean實(shí)例是其所在FactoryBean的實(shí)例窄潭, * 也就是實(shí)現(xiàn) FactoryBean 接口的那個(gè)類的Bean實(shí)例 **/ String FACTORY_BEAN_PREFIX = "&"; // 定義四個(gè)獲取 Bean 的方法 Object getBean(String name) throws BeansException; <T> T getBean(String name, 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; // <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); // 是否包含對(duì)應(yīng)名稱的Bean boolean containsBean(String name); // 單例還是多例 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // Bean 名稱與類型是否匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 獲取 BeanName 對(duì)應(yīng)的 class @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; @Nullable Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException; // 根據(jù)實(shí)例的名字獲取實(shí)例的別名 String[] getAliases(String name); }
-
抽象類
-
AbstractBeanFactory
實(shí)現(xiàn)了 ConfigurableBeanFactory 接口的大部分功能public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory { }
-
AbstractAutowireCapableBeanFactory
繼承自 AbstractBeanFactory 春宣,并額外實(shí)現(xiàn)了二級(jí)接口 AutowireCapableBeanFactorypublic abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory { }
-
-
實(shí)現(xiàn)類
-
DefaultListableBeanFactory
繼承自 AbstractAutowireCapableBeanFactory ,實(shí)現(xiàn)了最強(qiáng)大的四級(jí)接口 ConfigurableListableBeanFactory 嫉你,并實(shí)現(xiàn)了一個(gè)外來(lái)接口 BeanDefinitionRegistry 月帝,它并非抽象類。public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { }
-
XmlBeanFactory
繼承自 DefaultListableBeanFactory 幽污,重寫(xiě)了一些功能嚷辅,使自己更強(qiáng)大。public class XmlBeanFactory extends DefaultListableBeanFactory { }
-
-
額外的接口BeanDefinitionRegistry
這個(gè)接口基本用來(lái)操作定義在工廠內(nèi)部的BeanDefinition的public interface BeanDefinitionRegistry extends AliasRegistry { // 給定bean名稱距误,注冊(cè)一個(gè)新的bean定義 void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException; /* * 根據(jù)指定Bean名移除對(duì)應(yīng)的Bean定義 */ void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /* * 根據(jù)指定bean名得到對(duì)應(yīng)的Bean定義 */ BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /** 查找簸搞,指定的Bean名是否包含Bean定義 */ boolean containsBeanDefinition(String beanName); String[] getBeanDefinitionNames();//返回本容器內(nèi)所有注冊(cè)的Bean定義名稱 int getBeanDefinitionCount();//返回本容器內(nèi)注冊(cè)的Bean定義數(shù)目 boolean isBeanNameInUse(String beanName);//指定Bean名是否被注冊(cè)過(guò)扁位。 }
-
-
BeanDefinition 體系結(jié)構(gòu)
images- AttributeAccessor
// 定義用于附加和訪問(wèn)元數(shù)據(jù)的通用的接口,來(lái)自任意對(duì)象 public interface AttributeAccessor { // 將name的屬性值設(shè)置為value void setAttribute(String name, Object value); // 獲取name的屬性值趁俊,如果該屬性不存在贤牛,則返回Null Object getAttribute(String name); // 刪除name的屬性值,如果找不到Name屬性的值則返回Null Object removeAttribute(String name); // 如果name屬性值存在則返回true则酝,否者返回false boolean hasAttribute(String name); // 返回所有的屬性名稱 String[] attributeNames(); }
- BeanMetadataElement
public interface BeanMetadataElement { /** * Return the configuration source {@code Object} for this metadata element * (may be {@code null}). */ @Nullable Object getSource(); }
至此 BeanFactory 的體系結(jié)構(gòu)便簡(jiǎn)單介紹完了殉簸。BeanFactory 體系中核心主要是:
- BeanFactory:Bean 工廠定義了一系列操作 Bean 的方法
- BeanDefinition: Spring 對(duì) Bean 信息的一個(gè)抽象,其中包含了 Bean 的作用域沽讹、懶加載信息般卑、class、 beanName 等一列 Bean 的元數(shù)據(jù)信息
- BeanDefinitionRegistry: BeanDefinition 的注冊(cè)器爽雄,將 Bean 配置信息轉(zhuǎn)化為 BeanDefinition 對(duì)象