beanfactory的实现类_Spring核心接口和类的介绍

Spring重要接口详解BeanFactory继承体系体系结构图这是BeanFactory基本的类体系结构,这里没有包括强大的ApplicationContext体系,ApplicationContext单独搞一个。四级接口继承体系:1. BeanFactory 作为一个主接口不继承任何接口,暂且称为一级接口。2. AutowireCapableBeanFactory、Hierarchi...
摘要由CSDN通过智能技术生成

Spring重要接口详解

  1. BeanFactory继承体系

    1. 体系结构图

      1e0e439c7e3cb9ed63e71339e8a8baac.png

      d3a85c19252a5fd2128336b8ae2d10f7.png这是BeanFactory基本的类体系结构,这里没有包括强大的ApplicationContext体系,ApplicationContext单独搞一个。

      四级接口继承体系:

      1. BeanFactory 作为一个主接口不继承任何接口,暂且称为一级接口。

      2. AutowireCapableBeanFactory、HierarchicalBeanFactory、ListableBeanFactory 3个子接口继承了它,进行功能上的增强。这3个子接口称为二级接口。

      3. ConfigurableBeanFactory 可以被称为三级接口,对二级接口 HierarchicalBeanFactory 进行了再次增强,它还继承了另一个外来的接口 SingletonBeanRegistry

      4. ConfigurableListableBeanFactory 是一个更强大的接口,继承了上述的所有接口,无所不包,称为四级接口。

      总结:

      |-- BeanFactory 是Spring bean容器的根接口.提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的api.
      |-- -- AutowireCapableBeanFactory 提供工厂的装配功能。
      |-- -- HierarchicalBeanFactory 提供父容器的访问功能
      |-- -- -- ConfigurableBeanFactory 如名,提供factory的配置功能
      |-- -- -- -- ConfigurableListableBeanFactory 集大成者,提供解析,修改bean定义,并初始化单例.
      |-- -- ListableBeanFactory 提供容器内bean实例的枚举功能.这边不会考虑父容器内的实例.看到这边,我们是不是想起了设计模式原则里的接口隔离原则。

      下面是继承关系的2个抽象类和2个实现类:

      1. AbstractBeanFactory 作为一个抽象类,实现了三级接口 ConfigurableBeanFactory 大部分功能。

      2. AbstractAutowireCapableBeanFactory 同样是抽象类,继承自 AbstractBeanFactory ,并额外实现了二级接口 AutowireCapableBeanFactory 。

      3. DefaultListableBeanFactory 继承自 AbstractAutowireCapableBeanFactory ,实现了最强大的四级接口 ConfigurableListableBeanFactory ,并实现了一个外来接口BeanDefinitionRegistry ,它并非抽象类。

      4. 最后是最强大的 XmlBeanFactory ,继承自 DefaultListableBeanFactory ,重写了一些功能,使自己更强大。

      总结:

      BeanFactory的类体系结构看似繁杂混乱,实际上由上而下井井有条,非常容易理解。
    2. BeanFactory

      package org.springframework.beans.factory;import org.springframework.beans.BeansException;public interface BeanFactory {
                  //用来引用一个实例,或把它和工厂产生的Bean区分开    // 就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory String FACTORY_BEAN_PREFIX = "&";    /**     * 四个不同形式的getBean方法,获取实例     */    Object getBean(String name) throws BeansException;    T getBean(String name, Class requiredType) throws BeansException;    T getBean(Class requiredType) throws BeansException;    Object getBean(String name, Object... args) throws BeansException;    // 是否存在    boolean containsBean(String name);    // 是否为单实例    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;    // 是否为原型(多实例)    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;    // 名称、类型是否匹配    boolean isTypeMatch(String name, Class> targetType) throws NoSuchBeanDefinitionException;    // 获取类型    Class> getType(String name) throws NoSuchBeanDefinitionException;    // 根据实例的名字获取实例的别名    String[] getAliases(String name);}

源码说明:

    4个获取实例的方法。getBean的重载方法。

    4个判断的方法。判断是否存在,是否为单例、原型,名称类型是否匹配。

    1个获取类型的方法、1个获取别名的方法。根据名称获取类型、根据名称获取别名。

总结:    

这10个方法,很明显,这是一个典型的工厂模式的工厂接口。

ListableBeanFactory

可将Bean逐一列出的工厂

public interface ListableBeanFactory extends BeanFactory {
        // 对于给定的名字是否含有    boolean containsBeanDefinition(String beanName);    // 返回工厂的BeanDefinition总数    int getBeanDefinitionCount();    // 返回工厂中所有Bean的名字    String[] getBeanDefinitionNames();    // 返回对于指定类型Bean(包括子类)的所有名字    String[] getBeanNamesForType((Class> type);    /**     * 返回指定类型的名字     * includeNonSingletons为false表示只取单例Bean,true则不是     * allowEagerInit为true表示立刻加载,false表示延迟加载。     * 注意:FactoryBeans都是立刻加载的。     */    String[] getBeanNamesForType((Class> type, boolean includeNonSingletons, boolean allowEagerInit);    // 根据类型(包括子类)返回指定Bean名和Bean的Map     Map<String, T> getBeansOfType(Classtype) throws BeansException;     Map<String, T> getBeansOfType((Class type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;    // 根据注解类型,查找所有有这个注解的Bean名和Bean的Map    Map<String, Object> getBeansWithAnnotation(Class extends Annotation> annotationType) throws BeansException;    // 根据指定Bean名和注解类型查找指定的Bean    extends Annotation> A findAnnotationOnBean(}

源码说明:

    3个跟BeanDefinition有关的总体操作。包括BeanDefinition的总数、名字的集合、指定类型的名字的集合。

        这里指出,BeanDefinition是Spring中非常重要的一个类,每个BeanDefinition实例都包含一个类在Spring工厂中所有属性。

    2个getBeanNamesForType重载方法。根据指定类型(包括子类)获取其对应的所有Bean名字。

    2个getBeansOfType重载方法。根据类型(包括子类)返回指定Bean名和Bean的Map。

    2个跟注解查找有关的方法。根据注解类型,查找Bean名和Bean的Map。以及根据指定Bean名和注解类型查找指定的Bean。

总结:    

正如这个工厂接口的名字所示,这个工厂接口最大的特点就是可以列出工厂可以生产的所有实例。当然,工厂并没有直接提供返回所有实例的方法,也没这个必要。它可以返回指定类型的所有的实例。而且你可以通过getBeanDefinitionNames()得到工厂所有bean的名字,然后根据这些名字得到所有的Bean。这个工厂接口扩展了BeanFactory的功能,作为上文指出的BeanFactory二级接口,有9个独有的方法,扩展了跟BeanDefinition的功能,提供了BeanDefinition、BeanName、注解有关的各种操作。它可以根据条件返回Bean的集合,这就是它名字的由来——ListableBeanFactory。

HierarchicalBeanFactory

分层的Bean工厂

public interface HierarchicalBeanFactory extends BeanFactory {
        // 返回本Bean工厂的父工厂    BeanFactory getParentBeanFactory();    // 本地工厂是否包含这个Bean    boolean containsLocalBean(String name);}

参数说明:

     第一个方法返回本Bean工厂的父工厂。这个方法实现了工厂的分层。

     第二个方法判断本地工厂是否包含这个Bean(忽略其他所有父工厂)。这也是分层思想的体现。

总结:

这个工厂接口非常简单,实现了Bean工厂的分层。这个工厂接口也是继承自BeanFacotory,也是一个二级接口,相对于父接口,它只扩展了一个重要的功能——工厂分层。

AutowireCapableBeanFactory

自动装配的Bean工厂

public interface AutowireCapableBeanFactory extends BeanFactory {
        // 这个常量表明工厂没有自动装配的Bean    int AUTOWIRE_NO = 0;    // 表明根据名称自动装配    int AUTOWIRE_BY_NAME = 1;    // 表明根据类型自动装配    int AUTOWIRE_BY_TYPE = 2;    // 表明根据构造方法快速装配    int AUTOWIRE_CONSTRUCTOR = 3;    // 表明通过Bean的class的内部来自动装配(有没翻译错...)Spring3.0被弃用。    @Deprecated    int AUTOWIRE_AUTODETECT = 4;    // 根据指定Class创建一个全新的Bean实例    T createBean(Class beanClass) throws BeansException;    // 给定对象,根据注释、后处理器等,进行自动装配    void autowireBean(Object existingBean) throws BeansException;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值