Web容器启动Spring

Web工程启动涉及到的内容:

         1.当Tomcat启动的时候,通过BootStrap的main方法启动,加载tomcat包下的类,读取包下的配置文件,读取Web.xml配置文件,创建ServletConfig对象,从而创建ServletContext对象,整个web容器的上下文对象,可以初始化参数等

Web容器启动Spring_第1张图片

2.配置在web.xml中的监听器ContextLoaderListener继承了ContextLoader类,实现了ServletContextListener接口,当ServetContext对象创建的时候,会执行有ServletContextEvent参数的contextInitialized方法,

Web容器启动Spring_第2张图片

创建一个WebApplicationConetxt对象,

 Web容器启动Spring_第3张图片

 

采用监听器方式启动,所以最终得到的ApplicationContext对象是ConfigurableWebApplicationContext对象;然后开始配置上下文和刷新上下文对象;

Web容器启动Spring_第4张图片

然后定制上下文对象,根据所设置的参数,解析配置,初始化对象

Web容器启动Spring_第5张图片

然后开始刷新上下文对象

Web容器启动Spring_第6张图片

Web容器启动Spring_第7张图片

1.prepareRefresh()方法

设置spring上下文的刷新时间,并将active设为true,初始化一些容器启动必要的资源。

Web容器启动Spring_第8张图片

2. obtainFreshBeanFactory()方法;

创建新的bean工厂,并生成bean的定义信息

Web容器启动Spring_第9张图片

3. prepareBeanFactory()方法,

配置标准的beanFactory,设置ClassLoader,设置SpEL表达式解析器等;提前注册特殊的单例Bean

Web容器启动Spring_第10张图片

Web容器启动Spring_第11张图片

4、postProcessBeanFactory(beanFactory);

模板方法,允许在子类中对beanFactory进行后置处理。

5、invokeBeanFactoryPostProcessors(beanFactory);

实例化并调用所有注册的beanFactory后置处理器(实现接口BeanFactoryPostProcessor的bean,在beanFactory标准初始化之后执行)。

Web容器启动Spring_第12张图片

6、registerBeanPostProcessors(beanFactory);

实例化和注册beanFactory中扩展了BeanPostProcessor的bean。Web容器启动Spring_第13张图片

7、initMessageSource();

初始化国际化工具类MessageSource

Web容器启动Spring_第14张图片

8、initApplicationEventMulticaster();

初始化事件广播,bean的监听器,放入bean工厂中

Web容器启动Spring_第15张图片

9、onRefresh();

模板方法,在容器刷新的时候可以自定义逻辑,不同的Spring容器做不同的事情。

10、registerListeners();

注册监听器

Web容器启动Spring_第16张图片

11、finishBeanFactoryInitialization(beanFactory);

实例化所有剩余的(非懒加载)单例
比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。
实例化的过程各种BeanPostProcessor开始起作用。

Web容器启动Spring_第17张图片

12、finishRefresh();

refresh做完之后需要做的其他事情。
清除上下文资源缓存
初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle接口的bean并执行start()方法)。
发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作

Web容器启动Spring_第18张图片

 

在此期间,如果遇到BeansException则会销毁所有的bean,并将active设置为false;,最后会清除共有变量的缓存;

你可能感兴趣的:(Spring)