Spring:SpringIoC大致流程

一、基础概念

IOC,即控制反转。是Spring的一种设计思想。传统程序设计中,我们创建一个对象是通过 new 关键字,是程序主动去创建依赖对象,而在spring中专门有一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这就是我们经常说到的 IOC 容器
所有类的创建、销毁都由spring来控制。对于某一个具体对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫做控制反转

DI,即依赖注入。可以说IOC和DI是同一概念的不同角度描述。
依赖注入是指组件之间的依赖关系由容器在运行期决定,也就是由容器动态将某个依赖关系注入到组件之中。依赖注入的目的不是为了带来更多的功能,而是为了提升组件重用的频率,通过依赖注入机制,我们只需要简单的配置就可以实现 

简单来说:就是我们将一个个的bean对象交给IoC去管理,他会帮助我们去创建对象实例、填充属性、初始化、添加监听器等过程。 

bean
由spring IOC 容器管理的对象称之为 bean。bean是一个由IOC容器进行实例化、组装和管理的对象。
例如我们经常使用到的 @Service 注解,这个注解就相当于告诉 IOC 容器,这个类需要你帮我创建和管理

BeanDefinition
beanDefinition 就是 bean 的定义信息,用来存储 bean 的所有属性方法定义

BeanFactory 和 ApplicationContext
BeanFactory :它是一个用于访问 IOC 容器的根接口,提供了完整的 IOC 服务支持
ApplicationContext:BeanFactory 的子接口,在 BeanFactory 的所有功能上,还额外新增了其他高级的特性,比如:事件发布、国际化支持、统一资源加载策略等。正常情况下,我们使用的都是 ApplicationContext。
以电话来举例:

我们家里使用的 “座机” 就类似于 BeanFactory,可以进行电话通讯,满足了最基本的需求。

而现在非常普及的智能手机,iPhone、小米等,就类似于 ApplicationContext,除了能进行电话通讯,还有其他很多功能:拍照、地图导航、听歌等。

FactoryBean
一般情况下,我们将 bean 的创建和管理都交给 IOC 容器,spring 会利用反射来实例化bean对象,但是如果我们想自己实现 bean 的创建操作,可以实现吗?肯定可以,FactoryBean就实现了这个需求。
FactoryBean 是一个特殊的 bean ,接口中第一个三个方法 isSingleton()、getObjectType()、getObject() ,它是一个工厂bean,可以自己创建 bena实例,如果一个类实现了 FactoryBean接口,则该类可以自己定义创建实例对象的方法,只需要实现它的 getObject() 方法即可

二、大致过程

三、Spring IOC 的源码解析

Spring IOC的核心方法就在ConfigurableApplicationContext这个类中refresh() 方法,这个方法里面完成了 Spring的初始化、准备bean、实例化bean和扩展功能的实现。

根据注释可以知道,这个方法是用来加载刷新配置,这些配置可能来自java配置、xml文件、properties文件、关系型数据库或者其他格式。
作为一个启动方法,它应当在初始化失败后销毁已经创建的单例,防止占着资源而不使用。也就是说调用这个方法的话,要么所有的单例已经被实例化,要么所有的单例都不存在。
BeansException:bean工厂不能被初始化,抛出BeansException
IllegalStateException:bean工厂已经被初始化了,但是不支持多次刷新,抛IllegalStateException

具体实现

在 AbstractApplicationContext 中进行了实现:

3.1前戏,准备工作----prepareRefresh();

1、设置容器启动时间
2、设置活跃状态为true
3、设置关闭状态为false
4、获取Environment对象,并加载当前系统属性值到Environment对象中
5、准备监听器和事件的集合对象,默认为空集合

3.2创建工厂 obtainFreshBeanFactory(),也就是IOC容器对象

BeanDefinitionConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

1、创建容器对象:默认是DefaultListableBeanFactory用于存放读取的资源文件
2、使用beanDefinitionReader读取XML文件或者注解等Bean的声明方式
3、解析和加载后生成BeanDefinition,把beanDefinition放入beanDefinitionMap中,最后注册到IOC容器中。

refreshBeanFactory() 刷新bean工厂 当存在beanFactory 销毁 保证只有一个bean工厂 

createBeanFactory(),,默认为DefaultListableBeanFactory

loadBeanDefinitions(beanFactory);,这里的beanFactory是对象DefaultListableBeanFactory,这个对象是具体实际干活的类,

这里比较关键的是判断是否是默认的命名空间,如果是默认的命名空间则调用parseDefaultElement方法解析,否则调用parseCustomElement方法解析自定义标签。默认标签有

import,alias,bean,beans

里面的细讲解析这里就不一一列举了,解析完成之后返回对象:AbstractBeanDefinition,最后再包装成包装类BeanDefinitionHolder返回。接下来就是注册beanDefinition了,registerBeanDefinition

3.3prepareBeanFactory(beanFactory)

beanFactory的准备工作,对各种属性进行填充

3.4postProcessBeanFactory(beanFactory) 扩展增强器


覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的 

3.5invokeBeanFactoryPostProcessors(beanFactory)执行增强器

调用各种beanFactory处理器

3.6 registerBeanPostProcessors(beanFactory) 注册

实例化 注册 beanPostProcessors

3.7initMessageSource() 基本国际化功能 不重要
3.8 initApplicationEventMulticaster() 初始化事件监听器 多播器
3.9 onRefresh() 空的 留给子类来初始化其他的bean
3.10 registerListeners() 注册监听器

3.7~3.10和bean没啥太大影响 主要想完成不同阶段处理不同事情

3.11 finishBeanFactoryInitialization(beanFactory) 完成bean实例化

实例化bean配置文件中配置的单例bean

/**
 * 抽象的应用上下文
 */
public abstract class AbstractApplicationContext extends DefaultResourceLoader
        implements ConfigurableApplicationContext {
    /**
     * Finish the initialization of this context's bean factory,
     * initializing all remaining singleton beans.
     */
    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        // 省略部分代码...

        // 注册值解析器
        if (!beanFactory.hasEmbeddedValueResolver()) {
            beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
        }

        // 尽早初始化LoadTimeWeaverAware beans,以便尽早注册它们的转换器。
        String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
        for (String weaverAwareName : weaverAwareNames) {
            getBean(weaverAwareName);
        }
        // 停止使用临时类加载器进行类型匹配。
        beanFactory.setTempClassLoader(null);
        // 允许缓存所有bean定义元数据,不期望进一步的更改。
        beanFactory.freezeConfiguration();

        // 实例化所有剩余的(非惰性初始化)Bean。  重点分析
        beanFactory.preInstantiateSingletons();
    }
}

beanFactory.preInstantiateSingletons();

/**
 * IOC 容器之一  存放所有注册的Bean定义信息
 */
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    @Override
    public void preInstantiateSingletons() throws BeansException {

        // 拿到Bean工厂所有注册的BeanName
        List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

        // 触发所有非惰性单例beans的初始化...
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    // 省略很多代码...  如果是实现了 FactoryBean 的类
                    getBean(beanName);
                }
                else {
                    // 从容器中获取Bean,如果容器没有则创建
                    // 重点分析
                    getBean(beanName);
                }
            }
        }

        // 为所有适用的beans触发初始化后回调...
        for (String beanName : beanNames) {
            Object singletonInstance = getSingleton(beanName);
            if (singletonInstance instanceof SmartInitializingSingleton) {
                // 省略很多代码... 执行 {@link SmartInitializingSingleton} 的后置处理器
                // smartSingleton.afterSingletonsInstantiated();
            }
        }
    }
}

 getBean(beanName);

/**
 * 抽象的Bean工厂
 */
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    @Override
    public Object getBean(String name) throws BeansException {
    	// 核心在这里 doGetBean
        return doGetBean(name, null, null, false);
    }
}

doGetBean()

/**
 * 抽象的Bean工厂
 */
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
                              @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
        // 拿到Bean name
        final String beanName = transformedBeanName(name);
        Object bean;

        // 4.0.1分析:检查是否在三级缓存中有Bean 为了防止循环依赖问题
        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            // 省略日志输出...
            // 获取到Bean的实例
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

        // 如果在缓存中没有获取到
        else {
            // 检查是否有循环依赖
            // this.prototypesCurrentlyInCreation 保存当前正常创建的Bean name
            if (isPrototypeCurrentlyInCreation(beanName)) {
                throw new BeanCurrentlyInCreationException(beanName);
            }

            // 检查是否有 父工厂
            BeanFactory parentBeanFactory = getParentBeanFactory();
            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
                /**
                 * 省略一大推代码....
                 * 父工厂同样是调用 getBean() -> doGetBean()
                 */
            }
           // 将指定的bean标记为已经创建(或即将创建)。这允许bean工厂优化其重复缓存
            if (!typeCheckOnly) {
                markBeanAsCreated(beanName);
            }

            try {
                // 拿到Bean的定义信息
                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                // 检查Bean是否是抽象类
                checkMergedBeanDefinition(mbd, beanName, args);

                // 优先创建 {@link DependsOn} @DependsOn 注解所依赖的Bean
                String[] dependsOn = mbd.getDependsOn();
                if (dependsOn != null) {
                    for (String dep : dependsOn) {
                        // 省略一大推代码...
                        // 同样是调用 getBean(beanName) 创建Bean
                    }
                }

                // 4.0.2:这里是我们重点分析的   创建单实例Bean
                // 是否是单实例
                if (mbd.isSingleton()) {
                    // 4.0.2分析: 重点分析
                    // 获取或创建 Bean单实例,传入一个匿名内部类,供回调使用
                    sharedInstance = getSingleton(beanName, () -> {
                        try {
                        	// 5.0.0 重点分析 
                            // 在获取Bean没有的情况下 创建Bean
                            return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                            // 创建Bean异常,清除掉对此 beanName 的缓存信息
                            destroySingleton(beanName);
                            throw ex;
                        }
                    });
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                }
                // 如果Bean是原型 (多实例)
                else if (mbd.isPrototype()) {
                    // 它是一个原型->创建一个新实例。
                    Object prototypeInstance = null;
                    try {
                        // 缓存当前创建原型实例的信息
                        beforePrototypeCreation(beanName);
                        prototypeInstance = createBean(beanName, mbd, args);
                    }
                    finally {
                        // 清除当前缓存创建原型实例的信息
                        afterPrototypeCreation(beanName);
                    }
                    bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                }

                // 如果不是单实例,不是原型,则检查 Scope 作用域
                else {
                    String scopeName = mbd.getScope();
                    final Scope scope = this.scopes.get(scopeName);
                    if (scope == null) {
                        throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                    }
                    try {
                        Object scopedInstance = scope.get(beanName, () -> {
                            //  缓存当前创建原型实例的信息
                            beforePrototypeCreation(beanName);
                            try {
                                return createBean(beanName, mbd, args);
                            }
                            finally {
                                // 清除当前缓存创建原型实例的信息
                                afterPrototypeCreation(beanName);
                            }
                        });
                        bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                    }
                    catch (IllegalStateException ex) {
                        throw new BeanCreationException(beanName,
                                "Scope '" + scopeName + "' is not active for the current thread; consider " +
                                        "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
                                ex);
                    }
                }
            }
            catch (BeansException ex) {
                cleanupAfterBeanCreationFailure(beanName);
                throw ex;
            }
        }

        // 检查所需类型是否与实际bean实例的类型匹配。
        if (requiredType != null && !requiredType.isInstance(bean)) {
            // 省略大段代码...
        }
        return (T) bean;
    }
}

Object sharedInstance = getSingleton(beanName); 

 先从容器中查找有没有Bean实例,如果没有从当前正在创建Bean的缓存中查找(二级缓存,三级缓存),如果查找到,将不会去执行创建Bean过程,
这里处理了循环依赖的问题

/**
 * IOC容器之一,存放所有创建的单实例Bean
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    @Override
    @Nullable
    /**
     * 获取单实例Bean
     */
    public Object getSingleton(String beanName) {
        return getSingleton(beanName, true);
    }

    /**
     * 返回在给定名称下注册的(原始)单例对象。
     * 检查已经实例化的单件,并允许早期对当前创建的单例的引用(解析循环引用)
     * @param beanName
     * @param allowEarlyReference 在没有查询到已经创建的Bean,是否查找正在创建的Bean
     * @return
     */
    @Nullable
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        // 从容器中获取,已经创建好的单实例Bean        this.singletonObjects 可以说就是IOC的容器
        Object singletonObject = this.singletonObjects.get(beanName);
        /**
         * isSingletonCurrentlyInCreation(beanName)
         * 此 beanName 是否在当前正在创建的单实例集合中
         * 此处 处理循环依赖起到关键作用
         */
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            synchronized (this.singletonObjects) {
                // 从婴儿对象集合中获取  (二级缓存)
                singletonObject = this.earlySingletonObjects.get(beanName);
                if (singletonObject == null && allowEarlyReference) {
                    // 从三级缓存中获取
                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                    // 如果有
                    if (singletonFactory != null) {
                        singletonObject = singletonFactory.getObject();
                        // 放到婴儿对象集合中 (二级缓存)
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        // 从三级缓存移除
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        // bean or null
        return singletonObject;
    }
}

getSingleton(beanName, ObjectFactory)

传入一个匿名内部类,供于回调。回调里面是createBean()创建Bean,及其重要。

		sharedInstance = getSingleton(beanName, () -> {
        try {
        	// 5.0.0 重点分析
            return createBean(beanName, mbd, args);
        }
        catch (BeansException ex) {
            destroySingleton(beanName);
            throw ex;
        }
    });
/**
 * IOC容器之一,存放所有创建的单实例Bean
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    /**
     * 从容器中获取单实例Bean,如果没有,则调用ObjectFactory.getObject(){#singletonFactory}创建新的对象
     * @param beanName the name of the bean
     * @param singletonFactory 对象工厂创建单实例Bean
     * with, if necessary
     * @return the registered singleton object
     */
    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(beanName, "Bean name must not be null");
        synchronized (this.singletonObjects) {
            // 先从容器中获取      this.singletonObjects 所有单实例的缓存集合
            Object singletonObject = this.singletonObjects.get(beanName);
            if (singletonObject == null) {
                if (this.singletonsCurrentlyInDestruction) {
                    // 容器正在销毁  抛出异常    --> 一般创建不会发生这种情况,除非人为
                }
                /**
                 * 创建Bean前的准备工作
                 * this.singletonsCurrentlyInCreation.add(beanName)
                 * 当前正在创建Bean的集合 添加该 beanName
                 */
                beforeSingletonCreation(beanName);
                // 标记Bean是否创建成功
                boolean newSingleton = false;
                boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = new LinkedHashSet<>();
                }
                try {
                    /**
                     * 回调参数中 {#singletonFactory}的获取对象的方法
                     */
                    singletonObject = singletonFactory.getObject();
                    newSingleton = true;
                }
                catch (IllegalStateException ex) {
                    // singleton对象是否同时隐式出现了-->如果是,则继续,因为异常指示该状态。
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        throw ex;
                    }
                }
                catch (BeanCreationException ex) {
                    if (recordSuppressedExceptions) {
                        for (Exception suppressedException : this.suppressedExceptions) {
                            ex.addRelatedCause(suppressedException);
                        }
                    }
                    throw ex;
                }
                finally {
                    if (recordSuppressedExceptions) {
                        this.suppressedExceptions = null;
                    }
                    /**
                     * 创建Bean前的准备工作
                     * this.singletonsCurrentlyInCreation.remove(beanName)
                     * 当前正在创建Bean的集合 移除该 beanName
                     */
                    afterSingletonCreation(beanName);
                }
                /**
                 * 4.0.3
                 * 如果创建Bean成功,则往容器里面添加该Bean
                 */
                if (newSingleton) {
                    // 4.0.3 重点分析
                    addSingleton(beanName, singletonObject);
                }
            }
            return singletonObject;
        }
    }
}

addSingleton(beanName, singletonObject);

Bean创建成功,添加到IOC容器中。

/**
 * IOC容器之一,存放所有创建的单实例Bean
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    /**
     * 将给定的单例对象添加到该工厂的单例缓存中。
     * <p>必需是单实例
     * @param beanName the name of the bean
     * @param singletonObject the singleton object
     */
    protected void addSingleton(String beanName, Object singletonObject) {
        synchronized (this.singletonObjects) {
            // 创建好的Bean缓存  key -> value
            this.singletonObjects.put(beanName, singletonObject);
            // 从三级缓存移除
            this.singletonFactories.remove(beanName);
            // 从二级缓存移除
            this.earlySingletonObjects.remove(beanName);
            // 创建好的BeanName缓存   array
            this.registeredSingletons.add(beanName);
        }
    }
}

createBean()

获取bean的匿名内部类回调。
这里开始创建单实例Bean,也是Bean的生命周期的开始。
重点 重点 重点。其他可以不关注,这里一定要认真,因为将了解到Spring是如何帮我们创建的Bean,创建Bean又经历过什么。

		sharedInstance = getSingleton(beanName, () -> {
        try {
        	// 5.0.0 重点分析
            return createBean(beanName, mbd, args);
        }
        catch (BeansException ex) {
            destroySingleton(beanName);
            throw ex;
        }
    });
/**
 * 创建Bean工作抽象类
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
        implements AutowireCapableBeanFactory {
    /**
     * 这个类的中心方法:创建一个bean实例,
     * 填充bean实例,应用后处理器,等等。
     * @see #doCreateBean
     */
    @Override
    protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
            throws BeanCreationException {

        RootBeanDefinition mbdToUse = mbd;

        // 解析Bean的 class
        Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }

        // 准备方法覆盖
        try {
            mbdToUse.prepareMethodOverrides();
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                    beanName, "Validation of method overrides failed", ex);
        }

        try {
            /** 5.0.1   重点分析
             * 
             * 给bean后置处理器一个机会返回一个代理,而不是目标bean实例。
             * 应用此 InstantiationAwareBeanPostProcessor 后置处理器
             * 如果有返回Bean, 直接 return
             */
             // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                    "BeanPostProcessor before instantiation of bean failed", ex);
        }

        try {
            /**
             * 5.0.2  非常重点分析
             * Spring 真正的开始创建Bean
             */
            Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            // 返回创建的 Bean
            return beanInstance;
        }
        catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
            throw ex;
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
        }
    }
}

resolveBeforeInstantiation(beanName, mbdToUse);

方法名翻译:实例化前解决,
注释翻译:给bean后置处理器一个机会返回一个代理,而不是目标bean实例。
解释:应用InstantiationAwareBeanPostProcessor.后置处理器,如果有返回一个实例对象,则创建Bean过程结束,直接返回此实例对象

/**
 * 创建Bean工作抽象类
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
        implements AutowireCapableBeanFactory {
    /**
     * 在实例化前应用后处理器,解决是否存在指定bean的实例化前快捷方式。
     * @param beanName
     * @param mbd
     * @return
     */
    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
        // 省略了部分代码....  以下为关键代码

        // 拿到要创建Bean的类型
        Class<?> targetType = determineTargetType(beanName, mbd);
        if (targetType != null) {
            /**
             * 应用所有的 {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation}
             * Bean后置处理器
             */
            bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
            if (bean != null) {
                /**
                 * 如果Bean不等于空
                 * 应用所有的 {@link BeanPostProcessor#postProcessAfterInitialization}
                 * Bean后置处理器
                 */
                bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
            }
        }
        return bean;
    }
}

 总结:
从以下代码中看出,在Spring给我们自动创建Bean之前,我们可以实现InstantiationAwareBeanPostProcessor接口,手动的去创建Bean,并且创建成功后,还可以再执行BeanPostProcessor的后置处理方法。

doCreateBean(beanName, mbdToUse, args);

/**
 * 创建Bean工作抽象类
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
        implements AutowireCapableBeanFactory {
    /**
     * 创建Bean
     * @param beanName
     * @param mbd
     * @param args
     * @return
     * @throws BeanCreationException
     */
    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {

        // 实例化bean。.
        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
            /**
             * 从未完成创建的单实例Bean的缓存中移除
             * 解决循环依赖,防止重复创建Bean
             */
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
        }
        if (instanceWrapper == null) {
            /**
             * 5.0.3:重点解析
             * 利用反射创建 Bean的实例   默认调用无参构造函数
             *
             * 注意:如果是有参构造函数 会根据类型,从容器中获取Bean实例,
             * 如果容器中没有,则调用 createBean() 创建Bean,又会走同样的流程
             *
             * instanceWrapper 是一个Bean的包装对象
             */
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        // 拿到Bean的实例
        final Object bean = instanceWrapper.getWrappedInstance();
        // Bean的类型
        Class<?> beanType = instanceWrapper.getWrappedClass();
        if (beanType != NullBean.class) {
            mbd.resolvedTargetType = beanType;
        }

        // 允许后处理器修改合并的bean定义。
        synchronized (mbd.postProcessingLock) {
            if (!mbd.postProcessed) {
                try {
                    /**
                     * 应用所有的 {@link MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition}
                     * 后置处理器
                     */
                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                }
                catch (Throwable ex) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "Post-processing of merged bean definition failed", ex);
                }
                mbd.postProcessed = true;
            }
        }

        // 急切地缓存单例,以便能够解析循环引用
        // 即使是由生命周期接口触发的,比如BeanFactoryAware。
        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                isSingletonCurrentlyInCreation(beanName));
        if (earlySingletonExposure) {
            /**
             * 5.0.4 重点解析
             * 向三级缓存添加当前创建的Bean
             */
            addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
        }

        // 初始化bean实例。
        Object exposedObject = bean;
        try {
            /**
             * 5.0.5:重点解析
             *
             * 为属性赋值 @Autowired @Value @Resource ... 自动注入之类的注解
             */
            populateBean(beanName, mbd, instanceWrapper);

            /**
             * 5.0.6: 重点解析
             *
             * Bean的生命周期开始
             * 执行初始化方法,后置处理器
             */
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
        catch (Throwable ex) {
            if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
                throw (BeanCreationException) ex;
            }
            else {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
            }
        }

        if (earlySingletonExposure) {
            /**
             * 省略一大推代码.....
             * 移除掉缓存Bean   处理循环依赖
             */
        }

        // 如果实现了 {@link DisposableBean} (Spring容器关闭回调销毁方法)
        // 注册到 this.disposableBeans 集合中
        try {
            registerDisposableBeanIfNecessary(beanName, bean, mbd);
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
        }

        return exposedObject;
    }
}

createBeanInstance(beanName, mbd, args);
创建Bean的实例:
利用反射创建 Bean的实例 默认调用无参构造函数。如果是有参构造函数 会根据类型,从容器中获取Bean实例,如果容器中没有,则调用 createBean() 创建Bean,又会走同样的流程。

addSingletonFactory(beanName, ObjectFactory)

向三级缓存添加当前正在创建的Bean,为了处理循环依赖。
已经创建好的Bean实例缓存中 添加当前创建的Bean

/**
 * IOC 容器之一,存放所有的Bean
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    /**
     * 向三级缓存中添加创建的 Bean
     * @param beanName
     * @param singletonFactory
     */
    protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(singletonFactory, "Singleton factory must not be null");
        synchronized (this.singletonObjects) {
            // 如果不存在 已经创建好的Bean缓存中
            // this.singletonObjects 存放所有已经创建好的Bean
            if (!this.singletonObjects.containsKey(beanName)) {
                // 三级缓存中添加当创建的Bean 
                this.singletonFactories.put(beanName, singletonFactory);
                // 二级缓存中移除当前正在创建的Bean
                this.earlySingletonObjects.remove(beanName);
                // 已经创建好的Bean实例缓存中 添加当前创建的Bean
                this.registeredSingletons.add(beanName);
            }
        }
    }
}

populateBean(beanName, mbd, instanceWrapper);


为当前创建的Bean做属性赋值,例如 @Autowired,@Value,@Resource,@Inject …之类的可以自动注入的注解。处理类:AutowiredAnnotationBeanPostProcessor

initializeBean(beanName, exposedObject, mbd);


开始Bean 的生命周期,执行特定的Aware接口回调,Bean的初始化方法,执行所有的BeanPostProcessor后置处理器。

/**
 * 创建Bean工作抽象类
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
        implements AutowireCapableBeanFactory {
    /**
     * 初始化给定的bean实例,应用工厂回调 以及init方法和bean后处理器。
     */
    protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
        // 省略部分代码...
        else {
            /**
             * 执行一系列的 Aware接口 BeanNameAware, BeanClassLoaderAware, BeanFactoryAware
             */
            invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
            /**
             * 应用所有的 {@link BeanPostProcessor#postProcessBeforeInitialization}
             * 初始化方法执行前的 通知方法
             */
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
        }

        try {
            /**
             * 执行初始化方法 例如:
             * @Bean(initMethod = "init()")
             * 实现接口的{@link InitializingBean#afterPropertiesSet()}
             * JSR规范的初始化方法 @PostConstruct
             */
            invokeInitMethods(beanName, wrappedBean, mbd);
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    (mbd != null ? mbd.getResourceDescription() : null),
                    beanName, "Invocation of init method failed", ex);
        }
        if (mbd == null || !mbd.isSynthetic()) {
            /**
             * 应用所有的 {@link BeanPostProcessor#postProcessAfterInitialization}
             *
             * wrappedBean这个Bean会用作 当前创建Bean的存储,所有后置处理器可以修改Bean,或者代理Bean
             */
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }
}

1.执行一系列的 Aware接口回调方法 BeanNameAware, BeanClassLoaderAware, BeanFactoryAware
2 执行所有的 BeanPostProcessor.postProcessAfterInitialization()前置通知方法。
3 执行初始化方法 例如:
@Bean(initMethod = “init()”),
实现接口的{@link InitializingBean#afterPropertiesSet()}
JSR规范的初始化方法 @PostConstruct
4 执行所有的 BeanPostProcessor.postProcessAfterInitialization()置通知方法。

到此Spring创建Bean的流程就结束,接下来总结一下。

创建Bean的时候,会先记录当前创建的Bean,实例化Bean后,先在三级缓存中,保存信息,为了解决循环依赖问题。(A依赖B,B依赖A)
实例化Bean之前,会先创建有@DependsOn注解的Bean
实例化Bean之前,会先执行该InstantiationAwareBeanPostProcessor后置处理器,看看能不能先创建Bean实例,如果可以,则Spring不在创建Bean。
Spring帮我们实例化Bean的时候,反射去调用构造函数,默认是选择无参构造函数,如果没有无参构造函数,那构造函数的参数会根据类型,去IOC容器中获取,IOC容器没有,Spring会创建该类型的Bean。
Spring帮我们实例化Bean后,先执行MergedBeanDefinitionPostProcessor后置处理器。
Spring帮我们实例化Bean后,开始为对象属性赋值,根据类型去IOC容器中获取对象,如果没有则创建。
对于依赖关系的类 例如:A 依赖 B,B会先于A实例化并赋值。
Bean属性赋值完后,先执行BeanNameAware,BeanClassLoaderAware,BeanFactoryAware的回调赋值方法。
预先执行BeanPostProcessor.postProcessBeforeInitialization()初始化方法执行前的前置通知。
再执行初始化方法 @Bean(initMethod = “init()”) InitializingBean实现接口,JSR规范注解 @PostConstruct。
最后执行BeanPostProcessor.postProcessAfterInitialization()初始化方法执行后的后置通知。
BeanPostProcessor后置处理器的通知方法,可以返回Bean对象,返回的Bean对象用于替换当前创建的Bean实例,可以用它做代理对象。

3.12 finishRefresh();

完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值