【源码分析】Spring IOC 容器创建过程

IOC容器创建

new AnnotationConfigApplicationContext(ExtConfig.class);
构造函数 AnnotationConfigApplicationContext(Class<?>... annotatedClasses)
1、无参构造器:this()
创建:
    AnnotatedBeanDefinitionReader 注解Bean定义的读取器
    ClassPathBeanDefinitionScanner 扫描Bean定义的扫描器
2、注册配置类:register(annotatedClasses)
    AnnotatedBeanDefinitionReader.register(annotatedClasses)
3、刷新容器:AbstractApplicationContext.refresh()
    1)prepareRefresh():容器刷新前的预准备
        设置启动时间,active标志及initPropertySources
        i)initPropertySources:初始化属性资源=》子类自定义个性化的属性设置方法;
        ii)validateRequiredProperties():验证需要的属性合法性
        iii)earlyApplicationEvents = new LinkedHashSet<>():保存容器中早期事件集合

    2)obtainFreshBeanFactory():获取bean工厂,调用子类方法,刷新内部的bean工厂
        i)GenericApplicationContext.refreshBeanFactory():【创建】BeanFactory
            - 创建beanfactory:public GenericApplicationContext() {this.beanFactory = new DefaultListableBeanFactory();}
            - 设置序列化id:setSerializationId()
        ii)GenericApplicationContext.getBeanFactory():获取创建的beanFactory对象
        iii)返回beanFactory【DefaultListableBeanFactory】对象

    3)prepareBeanFactory(beanFactory):BeanFactory的预准备(设置BeanFactory)
        i)设置类加载器:setBeanClassLoader
        ii)设置支持表达式的解析器:setBeanExpressionResolver
        iii)添加属性编辑注册器:addPropertyEditorRegistrar
        iv)添加部分的BeanPostProcessor:addBeanPostProcessor(new ApplicationContextAwareProcessor(this))
        v)设置忽略的自动装配的接口:EnvironmentAware、ApplicationContextAware等
        vi)注册可以解析的自动装配,可以在容器中自动注入(通过autowire注入)
            BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext;
        vii)添加后置处理器:ApplicationListenerDetector
        viii)添加编译时的AspectJ;
        ix)给BeanFactory中注册一些能用的组件;
            - environment【ConfigurableEnvironment】
            - systemProperties【Map<String, Object>】
            - systemEnvironment【Map<String, Object>】

    4)postProcessBeanFactory(beanFactory):BeanFactory准备工作完成后进行的后置处理工作
        - 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
    ***********************以上是BeanFactory的创建及预准备工作*******************
        
    5)invokeBeanFactoryPostProcessors(beanFactory):将BeanFactory的后置处理器注册到容器中
    BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的;
    两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
        i)先执行BeanDefinitionRegistryPostProcessor
            1.beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class)
            先获取所有的BeanDefinitionRegistryPostProcessor
            2.先执行实现PriorityOrdered.class的BeanDefinitionRegistryPostProcessor
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry)
            postProcessor.postProcessBeanDefinitionRegistry(registry);
            3.然后执行实现Ordered.class的BeanDefinitionRegistryPostProcessor
            4.最后执行没有任何优先级或顺序的BeanDefinitionRegistryPostProcessor
        ii)再执行BeanFactoryPostProcessor
            1.beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class)
            先获取所有的BeanFactoryPostProcessor
            2.先执行实现PriorityOrdered.class的BeanFactoryPostProcessor
            invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory)
            postProcessor.postProcessBeanFactory(beanFactory)
            3.然后执行实现Ordered.class的BeanFactoryPostProcessor
            4.最后执行没有任何优先级或顺序的BeanFactoryPostProcessor

    6)registerBeanPostProcessors(beanFactory):注册Bean的后置处理器,拦截Bean的创建过程
    不同接口类型的BeanPostProcessor,在Bean创建前后的执行时机是不一样的;
        - BeanPostProcessor、
        - DestructionAwareBeanPostProcessor、
        - InstantiationAwareBeanPostProcessor、
        - SmartInstantiationAwareBeanPostProcessor、
        - MergedBeanDefinitionPostProcessor【internalPostProcessors】
        i)获取所有的BeanPostProcessor(后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级)
        ii)先注册实现PriorityOrdered.class接口的BeanPostProcessor
        iii)再注册实现Ordered.class接口的BeanPostProcessor
        iv)然后执行没有任何优先级或顺序的BeanPostProcessor
        v)然后注册MergedBeanDefinitionPostProcessor(internalPostProcessors)
        vi)最后注册一个ApplicationListenerDetector(用来在Bean创建完成后检查是否是ApplicationListener,
        如果是applicationContext.addApplicationListener((ApplicationListener<?>) bean);
        - postProcessAfterInitialization() 后置处理
        - if (bean instanceof ApplicationListener) {applicationContext.addApplicationListener((ApplicationListener<?>) bean)}
    7)initMessageSource():初始化MessageSource组件(国际化功能;消息绑定,消息解析)
        i)获取BeanFactory
        ii)判断容器中有id=messageSource且类型为MessageSource.class的bean
            MessageSource.class:取出国际化配置文件中的某个key的值;能按照区域信息获取;
            - 有:赋值给messageSource
            - 无:自己创建一个DelegatingMessageSource
        iii)把创建好的messageSource注册到容器中,可以自动注入
        beanFactory.registerSingleton("messageSource", this.messageSource)
    
    8)initApplicationEventMulticaster():初始化事件派发器
        i)获取BeanFactory
        ii)判断容器中是否有applicationEventMulticaster 且 ApplicationEventMulticaster.class 类型的bean
            - 有:赋值给applicationEventMulticaster
            - 无:创建一个SimpleApplicationEventMulticaster
        iii)把创建的applicationEventMulticaster注册到容器中,可以自动注入
        beanFactory.registerSingleton("applicationEventMulticaster", this.applicationEventMulticaster);
    
    9)onRefresh():留给子容器(子类),初始化其他指定的bean
        i)子类重写这个方法,在容器刷新的时候自定义逻辑;

    10)registerListeners():给容器中将所有项目里面的ApplicationListener注册进来
        i)获取所有ApplicationListener
        getBeanNamesForType(ApplicationListener.class)
        ii)将事件监听器添加到事件派发器中
        getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
        iii)派发之前步骤产生的事件
        getApplicationEventMulticaster().multicastEvent(earlyApplicationEvents);

    11)finishBeanFactoryInitialization(beanFactory):初始化所有剩下的非懒加载的单例bean
        i)初始化后剩下的单实例bean
        beanFactory.preInstantiateSingletons()
            1.获取容器中的所有bean,循环遍历依次进行初始化和创建对象
            2.获取Bean的定义信息;RootBeanDefinition
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName)
            3.Bean不是抽象的,是单实例的,是懒加载;if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
            a)判断是FactoryBean(是否是实现FactoryBean接口的Bean):调用FactoryBean.getObject()方法创建bean
            b)不是FactoryBean:getBean(beanName);创建Bean
                i)getBean(beanName);
                ii)doGetBean(name, null, null, false);
                iii)先获取缓存中的单实例bean,如果能获取说明bean已经被创建过(所有创建过的单实例Bean都会被缓存起来)
                private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
                iv)缓存中获取不到,开始Bean的创建对象流程;
                v)标记当前bean已经被创建,markBeanAsCreated(beanName):放置多线程创建非单实例
                vi)获取bean 的定义信息 RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName)
                vii)获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来:String[] dependsOn = mbd.getDependsOn()
                viii)启动单实例Bean的创建流程:createBean()
                    1-createBean()
                    2-先拦截返回代理对象:Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor
                    InstantiationAwareBeanPostProcessor:提前执行
                    先触发:postProcessBeforeInstantiation()
                    如果有返回值:触发postProcessAfterInitialization()
                    3-如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;继续;
                    4-创建bean:Object beanInstance = doCreateBean(beanName, mbdToUse, args);
                    > 创建Bean实例:createBeanInstance(beanName, mbd, args),利用工厂方法或者对象的构造器创建出Bean实例
                    > MergedBeanDefinitionPostProcessor后置处理:applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName),执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName)
                    > Bean属性赋值:populateBean(beanName, mbd, instanceWrapper)
                        >> 获取InstantiationAwareBeanPostProcessor,调用postProcessAfterInstantiation()
                        >> 获取InstantiationAwareBeanPostProcessor,调用postProcessProperties()
                        >> 应用Bean属性的值,为属性利用setter方法等进行赋值,applyPropertyValues(beanName, mbd, bw, pvs);
                    > Bean初始化:initializeBean(beanName, exposedObject, mbd)
                        >> 执行Aware接口方法:invokeAwareMethods(beanName, bean) 【BeanNameAware、BeanClassLoaderAware、BeanFactoryAware】
                        >> 调用后置处理器初始化之前的方法:applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                            BeanPostProcessor.postProcessBeforeInitialization()
                        >> 执行初始化方法:invokeInitMethods(beanName, wrappedBean, mbd)
                            >>> [是]InitializingBean:按照接口规定进行初始化
                            >>> [是]自定义初始化方法执行:invokeCustomInitMethod(beanName, bean, mbd)
                        >> 调用后置处理器初始化之后的方法:applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
                            BeanPostProcessor.postProcessAfterInitialization()
                    > 注册Bean的销毁方法:registerDisposableBeanIfNecessary(beanName, bean, mbd)
                    5-将创建的bean添加到缓存中(singletonObjects):addSingleton(beanName, singletonObject);
                        IOC容器就是这些Map,很多Map中保存着单例Bean,环境信息等
            4.所有bean通过getBean()创建完成后,遍历所有bean,检查是否SmartInitializingSingleton接口的;
            - 是:执行SmartInitializingSingleton.afterSingletonsInstantiated()

    12)finishRefresh():完成BeanFactory的初始化创建工作,IOC容器就创建完成
        1.clearResourceCaches()
        2.初始化和生命周期有关的后置处理器:initLifecycleProcessor()-LifecycleProcessor
            默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】
            - 否:new DefaultLifecycleProcessor() 加入容器,可以自动注入;
        3.拿到LifecycleProcessor,生命周期处理器(BeanFactory),回调onRefresh():getLifecycleProcessor().onRefresh();
        4.发布容器刷新完成事件:publishEvent(new ContextRefreshedEvent(this))
        5.Participate in LiveBeansView MBean, if active:liveBeansView.registerApplicationContext(this)

总结

  1. Spring容器启动过程中,会先将所有注册进来bean信息保存起来。
    1. xml 配置文件的方式:<bean>
    2. 注解的方式:@Component、@Repository、@Service、@Controller、@Bean 等
  2. Spring 容器在适当的时机创建这些Bean
    1. 通过getBean方法,先从缓存中尝试获取,如果获取不到则创建,创建完成,如果是单实例,则放入缓存,以便下次调用使用。
    2. 通过finishBeanFactoryInitialization() 方法统一创建剩下的所有Bean
  3. BeanPostProcessor :后置处理器,充斥在Spring容器创建的过程中。
    1. 每一个Bean的创建过程中,会被多种后置处理器处理增强
      1. AutowiredAnnotationBeanPostProcessor:处理自动注入
      2. AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
      3. ...
  4. 事件驱动模型
    ApplicationListener 事件监听器
    ApplicationEventMulticaster 事件派发器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值