spring源码分析系列3:BeanFactory核心容器的研究

@TOC 在讲容器以前,再明确一下知识点。java

  • BeanDefinition是Bean在容器的描述。BeanDefinition与Bean不是一个东西。
  • Bean是根据BeanDefinition建立出来的。也便是咱们所说的对象。

BeanDefinition物料须要有地方存储,Bean成品须要有地方存。今天咱们讲讲仓库。算法

BeanFactory家族

在这里插入图片描述
此图是默认容器DefaultListableBeanFactory的继承,实现关系图.咱们从右向左来分析下.

  1. BeanFactory接口: 容器顶级接口,提供了容器最基本的能力,包括获取bean,是否包含bean,是否单例,获取bean类型,Bean的别名等方法。spring

  2. ListableBeanFactory接口: BeanFactory的子接口;具备批量获取Bean的能力缓存

  3. HierarchicalBeanFactory接口:具备访问父容器的能力。有层次的BeanFactory。mvc

  4. AutowireCapableBeanFactory接口:继承BeanFactory,扩展了自动装配能力。这个接口更多的做用是用于于与其余框架集成,把不在spring容器中的Bean加入到Spring容器生命周期管理中来。此接口不多用框架

  5. ConfigurableBeanFactory:定义了BeanFactory的配置。继承HierarchicalBeanFactory和SingletonBeanRegistry接口。实现了此接口的容器,具备层次,单例BeanDefinition注册功能。编辑器

  6. ConfigurableListableBeanFactory: 大融合接口,除了具备上述接口的能外,还具备:类加载器,类型转化,属性编辑器,BeanPostProcessor,做用域,bean定义,处理bean依赖关系, bean销毁等功能。spa

  7. SingletonBeanRegistry接口: 具备Bean的操做能力.注册,查询,获取Bean数量等能力. 注意此处的Bean是实例.区别于BeanDefinition.设计

  8. SimpleAliasRegistry:Bean的别名操做类,实现了AliasRegistry.具备存储Bean别名,注册Bean别名,获取Bean别名的功能.aliasMap属性存储Bean别名3d

  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的建立过程.

欢迎你们关注个人公众号【源码行动】,最新我的理解及时奉送。

在这里插入图片描述
相关文章
相关标签/搜索