spring 启动主要流程

public void refresh() throws BeansException, IllegalStateException {

        synchronized (this.startupShutdownMonitor) {

            // Prepare this context for refreshing.

            //spring没用实现任何东西,主要是进行扩展,在加载前做一些其他事情

            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.

            //初始化BeanFactory,并解析xml

            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.

            //对BeanFactory进行功能填充

            prepareBeanFactory(beanFactory);

            try {

                // Allows post-processing of the bean factory in context subclasses.

                //子类覆盖方法做额外的处理

                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.

                //激活各种BeanFactory处理器。

                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.

                //注册拦截Bean创建Bean处理器,这里进行注册,真正的调用在getObject中

                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.

                //为上下文初始化Message源,国际化处理

                initMessageSource();

                // Initialize event multicaster for this context.

                //初始化消息广播器,

                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.

                //留给子类初始化其他的Bean

                onRefresh();

                // Check for listener beans and register them.

                //在所有的bean中查找Listenerbean 注册到消息广播器中

                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.

                //初始化剩下的单实例,非懒惰式

                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.

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

                finishRefresh();

            }

            catch (BeansException ex) {

                // Destroy already created singletons to avoid dangling resources.

                destroyBeans();

                // Reset 'active' flag.

                cancelRefresh(ex);

                // Propagate exception to caller.

                throw ex;

            }

        }

    }

最核心的在finishBeanFactoryInitialization(beanFactory);加载bean就是在此处完成。

这个方法循环遍历所有已知的bean进行加载注入。

1.获取由前面解析好的xml封装成的RootBeanDefinition=getMergedLocalBeanDefinition(beanName); 

2.判断方法是否为抽象类&&是否为单例&&是否配置懒加载,如果不通过再次循环!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()

3.判断bean是否为工厂类,为工厂类则进行一下安全检查。

4.然后调用AbstractBeanFactory的getBean方法进行bean的初始化。getBean有三个重载方法。实际的加载在doGetBean

1.获取beannanme

2.检查检查缓存中或者实例工厂中是否有对应的实例。为什么首先会使用这段代码呢,因为在创建单例 bean 的时候会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,Spring 创建 bean 的原则是不等 bean 创建完成就会将创建的 bean 的 ObjectFactory 提前曝光,也就是将 ObjectFactory 加入 缓存中,一旦下个 bean 创建时候需要依赖上个 bean 则直接使用 ObjectFactory

3.如果为不为空,则直接生成bean的实例(getObjectForBeanInstance 后面讲)

4.如果为空,判断是否是原型,如果是原型,直接抛异常。只有在单例情况才会尝试解决依赖循环,set模式进行尝试,构造器模式不行。原型模型情况,如果存在A 中有 B 的属性,B 中有 A 的属性,那么当依赖注入的时候,就会产生当 A 还未创建完的时候因为对于 B 的创建再次返回创建 ,造成依赖循环。

5.获取父类Beanfactory并查询是否存在beanname。如果存在返回父类beanfactory中的bean。

6.如果不是仅仅做类型检查而是创建 bean,要进行记录。防止重复创建

7.将BeanDefinition转换为RootBeanDefinition

8.若存在依赖则需要递归实例化依赖的 bean

9.判断bean实例是什么类型(单例、原型和自定义。默认单例)

10.检查需要的类型是否符合 bean 的实际类型

以单例模式进行查看

调用DefaultSingletonBeanRegistry的getSingleton方法。

1.检查缓存中是否存在,存在直接返回

2.如果不存在

 2.1 如果此 bean 正在被销毁,如果正在处理直接抛出异常

 2.2 调用beforeSingletonCreation进行bean创建前处理检查bean正在被创建。如果正在被创建直接抛出异常

2.3 调用入参传入bean的实际beanfactory获取object

2.4 调用afterSingletonCreation进行bean创建后处理检查bean是否还在被创建。如果还在被创建的map中直接抛异常

2.4.调用addSingleton将实例bean放到缓存中,删除beanfactory中的bean、注册的bean、earlySingletonObjects

singletonObjects: 用于保存 BeanName 和创建 bean 实例之间的关系,beanName -> beanInstance

singletonFactories:用于保存 BeanName 和创建 bean 的工厂之间的关系,beanName -> ObjectFactory

earlySingletonObjects:也是保存 BeanName 和创建 bean 实例之间的关系,与singletonObjects的不同之处在于,当一个单例bean被放到这里面后,那么当bean还在创建过程中,就可以通过getBean方法获取到了,其目的是用来检测循环引用。

registeredSingletons:用来保存当前所有已注册的bean。

 

然后调用AbstractAutowireCapableBeanFactory的createBean

1.锁定 class,根据设置的 class 属性或者根据 className 来解析 Class

2.验证及准备覆盖的方法

3.给 BeanPostProcessors 一个机会来返回代理来替代真正的实例

最后调用AbstractAutowireCapableBeanFactory的doCreateBean

1. 如果是单例则需要首先清楚缓存

2. 实例化bean,将BeanDefinition转换为BeanWrapper。

转换是一个复杂的过程,但是我们可以尝试概括大致的功能:

如果存在工厂方法,则使用工厂方法进行初始化。

一个类有多个构造函数,每个构造函数都有不同的参数,所以需要根据参数锁定构造函数并进行初始化。

如果既不存在工厂方法也不存在带有参数的构造函数,则使用默认的构造函数进行bean的实例化。

3. MergedBeanDefinitionPostProcessor的应用。

bean合并后的处理,Autowired注解正是通过此方法实现诸如类型的预解析。

4. 依赖处理

在Spring中会有循环依赖的情况,例如A->B&B->A。如果此时A与B都是单例的,那么在Spring中的处理方式就是当创建B的时候,涉及自动注入A步骤时,并不是直接去再次创建A,而是通过放入缓存的ObjectFactory来创建实例,这样就解决了循环依赖的问题。

5. 属性填充

将所有属性填充至bean的实例中。

6. 循环依赖检查

之前提到过,在Spring中解决循环依赖只对单例有效,而对于prototype的bean,Spring没有好的解决办法,唯一要做的就是抛出异常。在这个步骤中会检测已经加载的Bean是否已经出现了依赖循环,并判断是否需要抛出异常。

7. 注册DisposableBean。

如果配置了destory-method,这里需要注册以便在销毁的时候调用。

8. 完成创建并返回

可以看到上面的步骤非常繁琐,每一步骤都使用了大量的代码来完成其功能,最复杂也是最难以理解的当属循环依赖的处理,在真正进入doCreateBean前我们是有必要先了解这个循环依赖的。

 

通过initializeBean方法看一下初始化bean都干了什么

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {

        // 首先执行Aware接口的方法

        // 这里涉及的Aware接口有BeanFactoryAware、BeanClassLoaderAware和BeanNameAware

        if (System.getSecurityManager() != null) {

            AccessController.doPrivileged(new PrivilegedAction<Object>() {

                @Override

                public Object run() {

                    invokeAwareMethods(beanName, bean);

                    return null;

                }

            }, getAccessControlContext());

        } else {

            invokeAwareMethods(beanName, bean);

        }

 

        Object wrappedBean = bean;

        if (mbd == null || !mbd.isSynthetic()) {

            // 执行bean后处理器的postProcessBeforeInitialization方法

            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

        }

 

        try {

            // 执行实现自InitializingBean接口的afterPropertiesSet()方法

            // 执行bean的init-method方法

            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()) {

            // 执行bean后处理器的postProcessAfterInitialization方法 此处获取aop拦截器

            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

        }

        return wrappedBean;

    }

这个方法比较重要,特别是前处理和后处理。是面向切面生成调用动态代理。

 

 

以mybatis的MapperScannerConfigurer为例

MapperScannerConfigurer主要是将所有mapper进行扫描并放到Configuration中。

AbstractApplicationContext.refresh().finishBeanFactoryInitialization -> AbstractApplicationContext.finishBeanFactoryInitialization().beanFactory.preInstantiateSingletons();->AbstractBeanFactory.getBean()->DefaultSingletonBeanRegistry.getSingleton()->AbstractBeanFactory.doGetBean()->AbstractAutowireCapableBeanFactory.createBean()->

->AbstractAutowireCapableBeanFactory.doCreateBean()

->AbstractAutowireCapableBeanFactory.initializeBean()

AbstractAutowireCapableBeanFactory.invokeInitMethods()

由于MapperFactoryBean<-SqlSessionDaoSupport<-DaoSupport<-InitializingBean,在DaoSupport中重写了InitializingBean的afterPropertiesSet并且在方法中调用了checkDaoConfig进行扩展

->MapperFactoryBean.checkDaoConfig()

>Configuration.addMapper()->MapperRegistry.addMapper()将mapper的代理类加载进去

 

通过分析spring的IOC和AOP。对比dubbo核心的逻辑都是通过动态代理对bean进行包装,通过相应的拦截器进行前置后置处理,拦截器都是使用责任链模式进行调用。

 

https://gavinzhang1.gitbooks.io/spring/content/chuang_jian_bean.html

 

 

 

 

spring aop

  • createAopProxy:102, ProxyCreatorSupport {org.springframework.aop.framework}

  • getProxy:109, ProxyFactory {org.springframework.aop.framework}

  • createProxy:477, AbstractAutoProxyCreator {org.springframework.aop.framework.autoproxy}

  • wrapIfNecessary:362, AbstractAutoProxyCreator {org.springframework.aop.framework.autoproxy}

  • postProcessAfterInitialization:322, AbstractAutoProxyCreator {org.springframework.aop.framework.autoproxy}

  • applyBeanPostProcessorsAfterInitialization:409, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • initializeBean:1518, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • doCreateBean:521, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • createBean:458, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • getObject:296, AbstractBeanFactory$1 {org.springframework.beans.factory.support}

  • getSingleton:223, DefaultSingletonBeanRegistry {org.springframework.beans.factory.support}

  • doGetBean:293, AbstractBeanFactory {org.springframework.beans.factory.support}

  • getBean:198, AbstractBeanFactory {org.springframework.beans.factory.support}

  • autowireResource:445, CommonAnnotationBeanPostProcessor {org.springframework.context.annotation}

  • getResource:419, CommonAnnotationBeanPostProcessor {org.springframework.context.annotation}

  • getResourceToInject:547, CommonAnnotationBeanPostProcessor$ResourceElement {org.springframework.context.annotation}

  • inject:155, InjectionMetadata$InjectedElement {org.springframework.beans.factory.annotation}

  • inject:87, InjectionMetadata {org.springframework.beans.factory.annotation}

  • postProcessPropertyValues:304, CommonAnnotationBeanPostProcessor {org.springframework.context.annotation}

  • populateBean:1146, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • doCreateBean:519, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • createBean:458, AbstractAutowireCapableBeanFactory {org.springframework.beans.factory.support}

  • getObject:296, AbstractBeanFactory$1 {org.springframework.beans.factory.support}

  • getSingleton:223, DefaultSingletonBeanRegistry {org.springframework.beans.factory.support}

  • doGetBean:293, AbstractBeanFactory {org.springframework.beans.factory.support}

  • getBean:194, AbstractBeanFactory {org.springframework.beans.factory.support}

  • preInstantiateSingletons:633, DefaultListableBeanFactory {org.springframework.beans.factory.support}

  • finishBeanFactoryInitialization:932, AbstractApplicationContext {org.springframework.context.support}

  • refresh:479, AbstractApplicationContext {org.springframework.context.support}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值