Web工程启动涉及到的内容:
1.当Tomcat启动的时候,通过BootStrap的main方法启动,加载tomcat包下的类,读取包下的配置文件,读取Web.xml配置文件,创建ServletConfig对象,从而创建ServletContext对象,整个web容器的上下文对象,可以初始化参数等
2.配置在web.xml中的监听器ContextLoaderListener继承了ContextLoader类,实现了ServletContextListener接口,当ServetContext对象创建的时候,会执行有ServletContextEvent参数的contextInitialized方法,
创建一个WebApplicationConetxt对象,
采用监听器方式启动,所以最终得到的ApplicationContext对象是ConfigurableWebApplicationContext对象;然后开始配置上下文和刷新上下文对象;
然后定制上下文对象,根据所设置的参数,解析配置,初始化对象
然后开始刷新上下文对象
1.prepareRefresh()方法
设置spring上下文的刷新时间,并将active设为true,初始化一些容器启动必要的资源。
2. obtainFreshBeanFactory()方法;
创建新的bean工厂,并生成bean的定义信息
3. prepareBeanFactory()方法,
配置标准的beanFactory,设置ClassLoader,设置SpEL表达式解析器等;提前注册特殊的单例Bean
4、postProcessBeanFactory(beanFactory);
模板方法,允许在子类中对beanFactory进行后置处理。
5、invokeBeanFactoryPostProcessors(beanFactory);
实例化并调用所有注册的beanFactory后置处理器(实现接口BeanFactoryPostProcessor的bean,在beanFactory标准初始化之后执行)。
6、registerBeanPostProcessors(beanFactory);
实例化和注册beanFactory中扩展了BeanPostProcessor的bean。
7、initMessageSource();
初始化国际化工具类MessageSource
8、initApplicationEventMulticaster();
初始化事件广播,bean的监听器,放入bean工厂中
9、onRefresh();
模板方法,在容器刷新的时候可以自定义逻辑,不同的Spring容器做不同的事情。
10、registerListeners();
注册监听器
11、finishBeanFactoryInitialization(beanFactory);
实例化所有剩余的(非懒加载)单例
比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。
实例化的过程各种BeanPostProcessor开始起作用。
12、finishRefresh();
refresh做完之后需要做的其他事情。
清除上下文资源缓存
初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle接口的bean并执行start()方法)。
发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作
在此期间,如果遇到BeansException则会销毁所有的bean,并将active设置为false;,最后会清除共有变量的缓存;