Spring 的 Ioc 容器其实就是一个 bean 的关系网, 依赖于 core,bean,context 三个组件来构建的在 spring 中最核心的就是对于 bean 的管理而 bean 又依托于我们的容器本文将从顶层分析一下 spring 中 beanFactory 的具体创建过程, 为后续的 bean 的生命周期提供一个基础
BeanFactory 的继承体系
image.png
从上图可以看到, BeanFactory 有三个子类:
- ListableBeanFactory
- HierarchicalBeanFactory
- AutowireCapableBeanFactory
(上述三个类的子类体系小伙伴们可以自己对着源码看下, 实在太多)
看下上图中最底层的 DefaultListableBeanFactory 类的定义:
- public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
- implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable
这个其实就是 BeanFactory 的默认实现类, 它直接或者间接的实现了所有的接口其实在看 spring 源码的时候都会遇到类似的设计模式, 对于某一个具体的功能, 通常都会定义很多层的接口, 层层包装, 层层委托这种做法的好处就是, 对于不同的场合都会有特定的接口; 这样一来就可以在 spring 内部对对象的传递和转化操作都会有一些访问限制
例如 ListableBeanFactory 接口表示这些 Bean 是可列表的, 而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的, 也就是每个 Bean 有可能有父 BeanAutowireCapableBeanFactory 接口定义 Bean 的自动装配规则这四个接口共同定义了 Bean 的集合 Bean 之间的关系以及 Bean 行为
BeanFactory 的创建
在之前的文章中说过了容器的刷新过程 BeanFactory 的创建也在 wac.refresh() 方法中具体看下到底是通过哪些子类来完成的:
- // 通知子类刷新内部的 bean 工厂
- ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
1.AbstractApplicationContext 中的 obtainFreshBeanFactory
下面是 obtainFreshBeanFactory 的方法逻辑:
- protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
- // 这个是具体创建的方法, 由子类实现
- refreshBeanFactory();
- // 获取 BeanFactory 实例对象 (ConfigurableListableBeanFactory 类型的)
- ConfigurableListableBeanFactory beanFactory = getBeanFactory();
- if (logger.isDebugEnabled()) {
- logger.debug("Bean factory for" + getDisplayName() + ":" + beanFactory);
- }
- return beanFactory;
- }
refreshBeanFactory 并未有具体的实现逻辑, 这个方法主要是通过委托给子类的 refreshBeanFactory 方法来实现, 在 AbstractApplicationContext 中 refreshBeanFactory 是一个抽象模板方法:
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
2.refreshBeanFactory 方法 (AbstractRefreshableApplicationContext 类中):
下面只注释与 beanFactory 创建相关的代码
- protected final void refreshBeanFactory() throws BeansException {
- // 是否已经有 BeanFactory 了
- if (hasBeanFactory()) {
- // 销毁原有的 Bean
- destroyBeans();
- // 关闭工厂
- closeBeanFactory();
- }
- try {
- // 创建一个新的 beanFactory
- DefaultListableBeanFactory beanFactory = createBeanFactory();
- beanFactory.setSerializationId(getId());
- customizeBeanFactory(beanFactory);
- loadBeanDefinitions(beanFactory);
- synchronized(this.beanFactoryMonitor) {
- this.beanFactory = beanFactory;
- }
- } catch(IOException ex) {
- throw new ApplicationContextException("I/O error parsing bean definition
- source for " + getDisplayName(), ex);
- }
- }
这个方法是实现执行这个上下文的底层 bean 工厂的实际刷新, 如果有的话之前有 BeanFactory 存在, 则关闭以前的 bean 工厂并为上下文生命周期的下一个阶段初始化一个新鲜的 bean 工厂
3.createBeanFactory(AbstractRefreshableApplicationContext 类中)
- protected DefaultListableBeanFactory createBeanFactory() {
- return new DefaultListableBeanFactory(getInternalParentBeanFactory());
- }
这个方法就是为当前上下文创建一个内部的 bean 工厂每次调用 refresh() 方法是都会创建尝试创建默认实现是创建一个 DefaultListableBeanFactory 并通过 getInternalParentBeanFactory() 获取内部 bean 工厂来作为父级 bean 工厂可以在子类中重写, 例如自定义 DefaultListableBeanFactory 的设置
getInternalParentBeanFactory(AbstractApplicationContext 类中)
- protected BeanFactory getInternalParentBeanFactory() {
- return (getParent() instanceof ConfigurableApplicationContext) ?
- ((ConfigurableApplicationContext) getParent()).getBeanFactory() : getParent();
- }
4.DefaultListableBeanFactory 的构造函数
- /**
- * 通过给定的父类创建一个新的 DefaultListableBeanFactory 容器
- * @param parentBeanFactory the parent BeanFactory
- */
- public DefaultListableBeanFactory(BeanFactory parentBeanFactory) {
- super(parentBeanFactory);
- }
super(parentBeanFactory) 调用的是 AbstractAutowireCapableBeanFactory 的构造函数
- /**
- * 通过给定的父类构建新的 AbstractAutowireCapableBeanFactory
- * @param parentBeanFactory parent bean factory, or {@code null} if none
- */
- public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) {
- this();
- // 设置父工厂
- setParentBeanFactory(parentBeanFactory);
- }
this(), 还是 AbstractAutowireCapableBeanFactory 的构造函数:
- /**
- * 构建一个新的 AbstractAutowireCapableBeanFactory.
- */
- public AbstractAutowireCapableBeanFactory() {
- super();
- ignoreDependencyInterface(BeanNameAware.class);
- ignoreDependencyInterface(BeanFactoryAware.class);
- ignoreDependencyInterface(BeanClassLoaderAware.class);
- }
super() ; AbstractBeanFactory 的构造函数
- /**
- * 构建一个新的 AbstractBeanFactory.
- */
- public AbstractBeanFactory() {
- }
来源: http://www.jianshu.com/p/5b3fa6a72ea7