1 ContextLoaderListener extends ContextLoader implements ServletContextListener 中的init方法中 创建WebApplicationContext。
2 加载对应的spring配置文件中的Bean。
3 将WebApplicationContext放入ServletContext(Java Web的全局变量)中。
4 AbstractApplicationContext的refresh方法
1 refresh方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
//1 刷新前的预处理;
prepareRefresh();
//2 获取BeanFactory;默认实现是DefaultListableBeanFactory,在创建容器的时候创建的
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//3 BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器,BeanPostProcessor和XXXAware自动装配等)
prepareBeanFactory(beanFactory);
try {
//4 BeanFactory准备工作完成后进行的后置处理工作
postProcessBeanFactory(beanFactory);
//5 执行BeanFactoryPostProcessor的方法;
invokeBeanFactoryPostProcessors(beanFactory);
//6 注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执行
registerBeanPostProcessors(beanFactory);
//7 初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
initMessageSource();
//8 初始化事件派发器
initApplicationEventMulticaster();
//11 子类重写这个方法,在容器刷新的时候可以自定义逻辑;如创建Tomcat,Jetty等WEB服务器
onRefresh();
//11 注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的
registerListeners();
//12 初始化所有剩下的非懒加载的单例bean
finishBeanFactoryInitialization(beanFactory);
// 13 完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)
finishRefresh();
}
}
1 prepareRefresh方法
表示在真正做refresh操作之前需要准备做的事情:
1 设置Spring容器的启动时间,
2 开启活跃状态,撤销关闭状态,。
3 初始化context environment(上下文环境)中的占位符属性来源。
4 验证环境信息里一些必须存在的属性
2 obtainFreshBeanFactory
让这个类(AbstractApplicationContext)的子类刷新内部bean工厂。
AbstractRefreshableApplicationContext容器:实际上就是重新创建一个bean工厂,并设置工厂的一些属性。
GenericApplicationContext容器:获取创建容器的就创建的bean工厂,并且设置工厂的ID.
3 prepareBeanFactory方法
已经把工厂建好了,但是还不能投入使用,因为工厂里什么都没有, 配置这个工厂的标准环境,比如context的类加载器和post-processors后处理器。
1 类加载器
2 bean工厂级别的 post-processors后处理器。
4 定制不同ApplicationContext的 bean工厂级别的post processors
bean工厂进行了许多配置,现在需要对bean工厂进行一些处理。不同的Spring容器做不同的操作。比如GenericWebApplicationContext容器的操作会在BeanFactory中添加ServletContextAwareProcessor用于处理ServletContextAware类型的bean初始化的时候调用setServletContext或者setServletConfig方法(跟ApplicationContextAwareProcessor原理一样)
5 invokeBeanFactoryPostProcessors方法
主动调用
6 registerBeanPostProcessors 注册bean 级别的post process
7 initMessageSource 初始化国际化
8 initApplicationEventMulticaster方法
在Spring容器中初始化事件广播器,事件广播器用于事件的发布。
9 onRefresh方法
一个模板方法,不同的Spring容器做不同的事情。
比如web程序的容器ServletWebServerApplicationContext中会调用createWebServer方法去创建内置的Servlet容器。
目前SpringBoot只支持3种内置的Servlet容器:
Tomcat
Jetty
Undertow
10 registerListeners方法
注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器
11 finishBeanFactoryInitialization 实例化非惰性bean
实例化BeanFactory中已经被注册但是未实例化的所有实例(懒加载的不需要实例化)。
比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。
实例化的过程各种BeanPostProcessor开始起作用。
后面在详细分析此步骤
12 finishRefresh方法
refresh做完之后需要做的其他事情。
1 初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
2 调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
3 发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作
4 如果是web容器ServletWebServerApplicationContext还会启动web服务和发布消息
参考
1 https://www.cnblogs.com/grasp/p/11942735.html