正文 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