正文 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { // 1. 初始
正文
一、prepareRefresh:初始化前的预处理
1.1初始化属性值初始化方法是个模压方法,由子类重写
Web容器GenericWebApplicationContext重写了此方法
最终由StandardServletEnvironment进行初始化
把 Servlet 的一些初始化参数放入IOC容器中
1.2属性校验通过占位符解析器校验资源集合
这里的解析器作为常量在环境被实例化时就被创建出来的,PropertySourcesPropertyResolver是占位符解析器,将数据源中占位符替换成目标值 校验是否有需要被占位符修饰的属性,如果有但是资源中找不到对应属性的key就会抛出异常
案例: 资源文件
测试代码
输出结果
二、obtainFreshBeanFactory:刷新Bean工厂
将容器刷新标识改为true,并且设置了工厂序列化id
三、prepareBeanFactory:Bean工厂预处理
3.1 ApplicationContextDProcessor:Aware执行器ApplicationContextDProcessor实现了BeanPostProcessor的postProcessBeforeInitialization接口,在所有Bean初始化前会执行当前方法
如果当前Bean是Aware的子类,那么将Bean强转成Aware类型,通过回调将信息设置到Bean中
3.2 registerResolvableDependency:自动注入的支持如果过容器中有多个相同接口的实现类,那么在自动注入的时候会注入注册的实现类
3.3 添加监听器执行器ApplicationListenerDetector主要作用是添加和销毁监听器,实现了BeanPostProcessor的postProcessAfterInitialization(Bean实例化之后)方法和DestructionAwareBeanPostProcessor的postProcessBeforeDestruction(Bean销毁之前)方法 详情:https://www.jb51.net/article/277948.htm 四、BeanFactory的后置处理这是个模压方法,由子类AnnotationConfigServletWebServerApplicationContext实现
AnnotationConfigServletWebServerApplicationContext首先调了父类 ServletWebServerApplicationContext 的 postProcessBeanFactory 方法
4.1 后置处理bean工厂父类ServletWebServerApplicationContext首先向Bean工厂中注入了一个执行器
4.1.1 WebApplicationContextServletContextAwareProcessorWebApplicationContextServletContextAwareProcessor继承了ServletContextAwareProcessor ServletContextAwareProcessor继承了BeanPostProcessor实现了postProcessBeforeInitialization(Bean初始化前执行)
4.1.2 registerWebApplicationScopes 注册web的应用域
ExistingWebApplicationScopes是ServletWebServerApplicationContext类中的一个静态类 源码如下:
WebApplicationContextUtils.registerWebApplicationScopes(),这个方法就是向beanFactory注册web的scope了,源码如下
|
2021-06-05
2021-05-27
2021-05-26
2021-06-05
2021-05-16