导语
上一篇我们了解对于beanPostProcessor和BeanFactoryPostProcessor,spring为我们设置一些由我们自由控制的时机。接下来我们继续我们的refresh方法分析
refresh的initMessageSource
这个方法就相对简单,对beanFactory进行处理,分析如下
-
如果包含有messageSource就从beanfactory中获取且判断这个messageSource是否是HierarchicalMessageSource,如果是,就这时其父级messageSource
-
如果没有,则新建DelegatingMessageSource作为messageSource的bean
refresh的initApplicationEventMulticaster
此方法也相对简单与initResource也很相似,分析如下:
- 如果beanFactory中是否包含applicationEventMulticaster,就从beanFactory获取applicationEventMulticaser
- 若没有,新建作为单例的SimpleApplicationEventMulticaster
我们进入SimpleApplicationEventMulticaster
我们关注muticastEvent看看,从其父类根据ApplicationEvent获取所有的applicationListeners,循环遍历onApplicationEvent,从这里我们可以类比观察者模式,结合AbstractApplicationEventMulticaster,我们可以了解到保存所有的listener
refresh的onRefresh
此方法是空实现,是提供的可重写以添加上下文特定刷新工作的模板方法,在初始化特殊bean时调用,在实例化单例之前
refresh的registerListeners
从之前的EventMulticaster中,我们知道spring的替我们初始化了一个事件处理器,而register就是向事件处理器中添加所有实现了ApplicationListener接口的类的观察listener
refresh的finishBeanFactoryInitialization
从其注释我们知道此方法是用于实例化所有非懒加载的所有bean
-
首先查看是否有ConversionService在beanFactory中,如果有就向beanFactory中存放ConversionService
public interface ConversionService { boolean canConvert(Class<?> var1, Class<?> var2); boolean canConvert(TypeDescriptor var1, TypeDescriptor var2); <T> T convert(Object var1, Class<T> var2); Object convert(Object var1, TypeDescriptor var2, TypeDescriptor var3); } 从接口定义上看conversionService是用于一个服务接口用于类型转换,这也是转换系统的入口点
-
从beanFactory中查找所有的LoadTimerWeaverAware,并实例化对应的LoadTimerWeaverAware
-
停止临时的classloader类加载器,然后缓存所有的beanDefinition数据,最后在preInstantiateSingleton中进行实例化non-lazy-init 单例
对于preInstantiateSingleton:
- 首先beanDifinition赋值到一个新的集合中,紧接着进行遍历操作
- 如果不是lazyinit,也不是单例的且还是Abstract的就进行getMergedLocalBeanDefinition操作,获取缓存的BeanDefinition对象并合并其父类和本身的属性
-
接着判断是否为factoryBean,不是的话直接进行getBean进行实例化,若是,获取factoryBean,查看factoryBean是否有额外配置
refresh的finishRefresh
首先官方注释是
publish corresponding event
即:发布所有的应用
- initLifecycleProcessor,LifecycleProcessor实例初始化,LifecycleProcessor是所有Lifecycle实现类的管家,里面包含了对Lifecycle的各种操作
- LifecycleProcessor的onRefresh,通过LifecycleProcessor来执行Lifecycle实现类的start方法
- publishEvent,即Spring中的事件发布机制来发出ContextRefreshedEvent事件
- 最后registerApplicationContext,如果配置了MBeanServer,就完成在MBeanServer上的注册
到这里,整个refresh方法就分析结束了,可能有很多人还是有很多疑问,其实refresh方法是spring对bean操作外置的很多处理机制,后续会继续针对refresh的这些方法,从不同的实例来换一些角度了解整个refresh方法