*Spring容器创建原理

1.spring容器的refresh();方法

    1.1 prepareRefresh();刷新前预处理

        1.1.1)initPropertySources();初始化一些属性设置(子类自定义个性化属性方法)

        1.1.2)getEnvironment().validateRequiredProperties();检验属性的合法

        1.1.3)this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的早期事件

    1.2 obtainFreshBeanFactory();获取BeanFactory

        1.2.1)refreshBeanFactory();刷新【设置序列号id】BeanFactory

            1.2.1.1)创建一个DefaultListableBeanFactory beanFactory = createBeanFactory();

        1.2.2)getBeanFactory();返回BeanFactory【DefaultListableBeanFactory】

     1.3 prepareBeanFactory(beanFactory);BeanFactory的预处理工作(初始化值)

        1.3.1 设置类加载器等。。。

        1.3.2 添加BeanPostProcessor【ApplicationContextAwareProcessor】

        1.3.3 设置自动装配的接口,忽略自动装配的接口

        1.3.4 添加BeanPostProcessor【ApplicationListenerDetector】

        1.3.5 给BeanFactory中注册一些能用的组件environment,systemProperties,systemEnvironment

        1.4 postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行后置处理(子类通过重写这个方法实现)

==========================以上是BeanFactory的创建和准备====================

1.invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactory的后置处理器

        BeanFactoryPostProcessors:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的

        1.1 获取所有BeanDefinitionRegistryPostProcessors

        1.2 根据优先级分组,顺序执行postProcessor.postProcessBeanDefinitionRegistry(registry);

        1.3 再执行BeanFactoryPostProcessors

2.registerBeanPostProcessors(beanFactory);注册bean的后置处理器

        2.1 根据优先级注册所有BeanPostProcessor

3.initMessageSource();国际化,消息绑定,解析

        3.1 获取BeanFactory

        3.2 看容器是否有id为messageSource的组件(有就取,没就创建DelegatingMessageSource)注册到容器中

4.initApplicationEventMulticaster();初始化事件派发器

5.onRefresh();(留给子类重写)

6.registerListeners();注册项目所有ApplicationListener

        6.1 注册项目所有ApplicationListener

        6.2 将监听器添加到事件派发器

        6.3 派发之前步骤产生的事件

7.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean

        7.1 启动单实例Bean创建流程

            7.1.2 createBean(beanName,mbd,args);

            7.1.3 如果bean实现了InstantiationAwareBeanPostProcessors,执行postProcessBeforeInstantiation和postProcessAfterInstantiation方法返回代理对象

            7.1.4 如果没有代理对象返回,调用7.1.5

            7.1.5 创建bean

doCreateBean(beanName, mbdToUse, args);

1)创建bean实例instantiateUsingFactoryMethod(beanName, mbd, args);利用工厂方法或对象构造器创建bean实例

2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法

3)执行spring bean的生命周期文章上的第4点(bean初始化赋值,执行bean的后置处理器)

=========================================================

1.finishRefresh();完成BeanFactroy初始化创建,ioc容器创建完成

    1.1 initLifecycleProcessor();初始化和生命周期有关的后置处理器:LifecycleProcessor

            自定义一个LifecycleProcessor的实现类

    1.2 拿到生命周期处理器(BeanFactory)回调getLifecycleProcessor().onRefresh();

    1.3 publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件

    1.4 LiveBeansView.registerApplicationContext(this);

================总结================

1)spring容器启动的时候,会先保存所有注册进来的Bean定义信息

        1.1)xml注册bean

        1.2)注解注册Bean    @Service等

2)spring容器会合适事件创建Bean

        1.1)用这个bean时,利用getBean创建bean,创建好后保存到容器中

        1.2)统一创建剩下所有bean时,finishBeanFactoryInitialization();

3)后置处理器BeanPostProcessor

        3.1)每个bean创建完成,会使用各种后置处理器进行处理,增强bean的功能

4)事件驱动模型

        ApplicationListener:事件监听

        ApplicationEventMulticaster:事件派发(多播器)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容