六、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",
就直接替换为对应的属性
++++++++++++++++++++++++++++++++++++++++++++++++++++