spring源码剖析系列3:BeanFactory中心容器的研讨

spring源码剖析系列3:BeanFactory中心容器的研讨

@TOC 在讲容器之前,再明白一下知识点。

  • BeanDefinition是Bean在容器的形貌。BeanDefinition与Bean不是一个东西。
  • Bean是依据BeanDefinition建立出来的。也等于我们所说的对象。

BeanDefinition物料须要有处所存储,Bean制品须要有处所存。本日我们讲讲堆栈。

BeanFactory家属

此图是默许容器DefaultListableBeanFactory的继续,完成关联图.我们从右向左来剖析下.

  1. BeanFactory接口: 容器顶级接口,供应了容器最基本的才能,包括猎取bean,是不是包括bean,是不是单例,猎取bean范例,Bean的别号等要领。

  2. ListableBeanFactory接口: BeanFactory的子接口;具有批量猎取Bean的才能

  3. HierarchicalBeanFactory接口:具有接见父容器的才能。有条理的BeanFactory。

  4. AutowireCapableBeanFactory接口:继续BeanFactory,扩大了自动装配才能。这个接口更多的作用是用于于与其他框架集成,把不在spring容器中的Bean加入到Spring容器生命周期治理中来。此接口很罕用

  5. ConfigurableBeanFactory:定义了BeanFactory的设置。继续HierarchicalBeanFactory和SingletonBeanRegistry接口。完成了此接口的容器,具有条理,单例BeanDefinition注册功用。

  6. ConfigurableListableBeanFactory: 大融会接口,除了具有上述接口的能外,还具有:类加载器,范例转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处置惩罚bean依靠关联, bean烧毁等功用。

  7. SingletonBeanRegistry接口: 具有Bean的操纵才能.注册,查询,猎取Bean数目等才能. 注重此处的Bean是实例.区分于BeanDefinition.

  8. SimpleAliasRegistry:Bean的别号操纵类,完成了AliasRegistry.具有存储Bean别号,注册Bean别号,猎取Bean别号的功用.aliasMap属性存储Bean别号

  9. DefaultSingletonBeanRegistry:除了继续了SimpleAliasRegistry的功用外. 最主要的是完成了SingletonBeanRegistry接口.具有存储Bean实例,注册Bean,猎取Bean的才能.我们定义的被Spring治理的Class类的实例对象,以及实例的之间的相互依靠关联都是存储在此类中.默许经常运用的容器DefaultListableBeanFactory的Bean的相干才能.就是经由历程间接继续此类来完成的.

	/** Disposable bean instances: bean name --> disposable instance */
	private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();

	/** Map between containing bean names: bean name --> Set of bean names that the bean contains */
	private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);

	/** Map between dependent bean names: bean name --> Set of dependent bean names */
	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);

	/** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64)
  1. FactoryBeanRegistrySupport: 供应多工场Bean的支撑.FactoryBean经由历程其名字我也能够看出是临盆Bean的Bean.
  2. AbstractBeanFactory抽象类: 承先启后.从图中我们看出. AbstractBeanFactory.经由历程继续关联,继续FactoryBeanRegistrySupport种种才能.而且完成了右侧部份接口.已然是比较完整的Bean容器了.AbstractBeanFactory还经由历程模板形式定义了猎取Bean的算法骨架,
  3. AbstractAutowireCapableBeanFactory: .具有大部份的才能. 完成了AbstractBeanFactory定义的模板要领.个中doCreateBean要领逻辑是把一个BeanDefinition变成Bean的历程.这个要领非常主要.一般我们运用类建立对象.直接new出来. spring把BeanDefinition到Bean的历程模板化,留下了许多扩大点. 留给运用者能够在差别的时候自定义BeanDefition建立Bean的历程.
  4. DefaultListableBeanFactory经常运用的默许容器完成,也是spring最常运用的容器类.看左侧DefaultListableBeanFactory完成了BeanDefinitionRegistry接口. 这申明什么?申明DefaultListableBeanFactory具有存储BeanDefinition,操纵BeanDefinition的才能.DefaultListableBeanFactory经由历程继续关联也具有了Bean的存储操纵功用.

小结:

  1. BeanFactory系统,接口清楚,圆满的表现了接口星散准绳。
  2. BeanFactory系统中有两种存储,一种是BeanDefinition的存储,另一个是Bean的存储.
  3. DefaultListableBeanFactory作为最经常运用的容器类.不只具有BeanDefinition的存储操纵功用,而且经由历程继续具有Bean的存储操纵功用.DefaultListableBeanFactory把存储的BeanDefinition经由历程肯定算法建立Bean并存储起来.

BeanDefinition,BeanFactory,Bean三者关联

经由历程上面的对各个接口,类的熟悉.我们再来看看三者的关联.

我们向BeanFactory容器中注入一个BeanDefinition。BeanFactory帮我们存储起来.当我们想要获得一个Bean时.BeanFactory 帮我们把BeanDefinition建立Bean.并缓存起来.这个建立历程是可介入的.

  • BeanFactory保留了BeanDefiniton与Bean.
  • BeanFactory具有运用BeanDefinition建立Bean的功用
  • BeanFactory许可运用者能够干涉干与BeanDefinition天生Bean的功用.

BeanFactory中的扩大点

设想准绳之开闭准绳说的迥殊好:说一个软件实体应当经由历程扩大来完成变化. 许多优异的框架都有相似的扩大点设想,列如:

  • Tomcat中的Filter
  • Tomcat中的pipline-valve
  • springmvc中的Interceptor

BeanFactory中从BeanDefinition到Bean并非一会儿就完成的.这有一个历程.spring恰是在这个历程当中留下扩大点.来完成BeanDefinition到Bean的历程当中的种种自定义变化.

从上面我们得知:AbstractAutowireCapableBeanFactory中有个doCreateBean()恰是BeanDefinition到Bean的建立要领.接下来我们看看这个要领.有哪些扩大点:

  1. xxxAware接口:使Bean能够获得xxx. 列如完成了BeanFactoryAware接口的类,能够在该Bean被加载的历程当中猎取加载该Bean的BeanFactory
  2. BeanPostProcessor:BeanPostProcessor接口定义的两个要领,分别在bean的初始化要领(InitializingBean接口,或许init-method定义)实行的前后实行
  3. InitializingBean接口: 完成了InitializingBean接口的类,实行afterPropertiesSet
  4. 自定义的init-method要领:

总结:

BeanFactory是物料与制品堆栈,并配临盆线,把BeanDefinition临盆成Bean 。BeanFactory留下许多扩大点, 轻易开发人员能够介入BeanDefinition到Bean的建立历程.

迎接人人关注我的民众号【源码行为】,最新个人明白实时赠送。

Up Next:

魔鬼在细节,明白Java并发底层之AQS完成

魔鬼在细节,明白Java并发底层之AQS完成