Spring boot 2 源码分析 五 启动流程05

六、refreshContext(context);

      上面已经创建容器context完毕,并且把启动类等加载到了容器,现在就是调用refresh刷新容器

      程序执行入口如下

6.1 调用prepareRefresh进行刷新容器前的准备

    

   6.1.1 clearCache : 清空元数据的缓存

   6.1.2 调用父类prepareRefresh的方法

           (1) 将startupDate设为当前时间,closed 设为false,active 设为true

           (2)  初始化属性文件:servletContext 不为null,属性文件包含写死的servletContextInitParams,也是StubPropertySource,那么就替换成为ServletContextPropertySource;对于servletConfigInitParams的属性,操作也一样

           很明显,这里传入的servletContext, servletConfig都是null,因此不会执行.

           (3) 遍历所有的requiredProperties,如果获取不到,就抛出MissingRequiredPropertiesException异常.

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.2 ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();

     初始化BeanFactory

    

6.2.1 首先设置refreshed为true,如果设置失败了,代表重复设置

6.2.2  为beanFactory设置SerializationId

6.2.3 返回DefaultListableBeanFactory   

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.3 调用prepareBeanFactory, 对初始化好的factory进行准备,做一些设置

     6.3.1 设置classLoader为当前context的classLoader

     6.3.2  设置expressionResolver

     6.3.3  把一些aware添加到忽略自动装配的接口中

     6.3.4 注册一些解析依赖,当bean的属性注入的时候,一旦检测到属性为beanFactory类型便会将beanFactory的实例注入进去

     6.3.5 对系统环境bean完成注册

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.4 执行postProcessBeanFactory

     6.4.1 给beanFactory 添加一个WebApplicationContextServletContextAwareProcessor

     6.4.2 添加一个忽略依赖的接口ServletContextAware

     6.4.3  如果基础包basePackages不为空,就开始scan 扫描;如果annotatedClasses不为空,就注册(都不执行)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.5  this.invokeBeanFactoryPostProcessors(beanFactory); 激活各种BeanFactory的处理器

       遍历beanFactory中的BeanDefinitionNames,获得相应的BeanDefinition,如果FactoryMethodName,FactoryBeanName 都有配置的话,就添加到beans 中

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.6 this.registerBeanPostProcessors(beanFactory);

注册拦截bean创建的bean处理器,遍历postProcessorNames, 注册所有实现PriorityOrdered的BeanPostProcessor.

注册所有实现Ordered的BeanPostProcessor,注册所有无序的BeanPostProcessor,注册所有MergedBeanDefinitionPostProcessor类型的BeanPostProcessor

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.7 this.initMessageSource();

为上下文初始化MessageSource,即国际化处理

6.8 初始化ApplicationEventMulticaster

      6.8.1 如果用户自定义了事件广播器,那么就使用用户自定义的事件广播器

     6.8.2  如果没有自定义事件广播器,那么就使用默认的SimpleApplicationEventMulticaster,并向beanFactory 进行注册,id 为applicationEventMulticaster.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.9  this.onRefresh();    执行刷新容器

6.9.1 调用父类的onfresh() 获取 themeSource

6.9.2 创建一个webServer,如果没有,就从factory获取webserver (tomcat或者jetty) 如果有就调用onStartUp启动容器

        最后再初始化propertySources,还是和之前一样,如果有能匹配 “servletContextInitParams” 和 "servletConfigInitParams",

 就直接替换为对应的属性

     ++++++++++++++++++++++++++++++++++++++++++++++++++++

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值