JavaEE标准规定:在项目启动时,Servlet容器(Tomcat、Jboss等)需要给项目初始化一个ServletContext作为公共环境容器存放公共信息,而ServletContext中的信息都是由容器提供的。启动Web容器,执行流程如下:
1、启动WEB项目时,容器(如:Tomcat)会去读它的配置文件web.xml,读两个节点listener和 context-param的内容;
2、容器创建一个ServletContext(上下文),在该应用内全局共享;
3、容器将转化为键值对,并交给ServletContext;
4、容器创建中的类实例,即创建监听,该监听器必须实现自ServletContextListener接口,如Log4jConfigListener,或者如上自定义实现类(如果不自定义实现,可以使用实现类ContextLoaderListener)
5、Web项目启动中,在监听类中ontextInitialized(ServletContextEvent event)初始化方法会被执行,在该方法中获取到ServletContext和全局参数;
6、得到这个context-param的值之后,你就可以做一些操作了;
7、Web项目结束时,监听类中的contextDestroyed(ServletContextEvent event)方法会被执行。
启动顺序:1、读配置文件节点 –> 2、创建ServletContext –> 3、设置参数到Context中 –> 4、监听listener并执行初始化方法和销毁方法。
ServletContext 是一个 Servlet 对象对应的上下文环境,通常 Servlet 是单实例的,因此当你实现一个 Servlet 时,必须保证其线程安全性;至于 ServletContext ,一个 Servlet 对应的 ServletContext 对象也会一直保持在那里,是不会变的。
一般来说,一个 Web 应用会有多个 Servlet ,而它们的 ServletContext 则是共用的一个。这个是由 Servlet 容器(如 Tomcat 、 Jetty )来决定。
WebApplicationContext,是继承于ApplicationContext的一个接口。扩展了ApplicationContext,是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化。
WebApplicationContext的源码如下,可以看出WebApplicationContext继承ApplicationContext
Spring分别提供了用户启动WebApplicationContext的Servlet和Web容器监听器:
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.ContextLoaderServlet
Spring为我们提供的IOC容器,需要我们指定容器的配置文件,然后由该监听器初始化并创建该容器。指定配置文件的地址及文件名称。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener监听器,默认读取**/WEB-INF/下的applicationContext.xml**文件。但是通过context-param指定配置文件路径后,便会去你指定的路径下读取对应的配置文件,并进行初始化。项目启动时,便会执行类ContextLoaderListener的相关方法,创建WebApplicationContext(Web应用上下文)并以键值对形式存放与ServletContext中。
ApplicationContext 是 **Spring Bean 的上下文环境,**它的创建理论上与 ServletContext 无关,但在 SpringMVC 中,这个创建过程自动化了(具体是由 org.springframework.web.servlet.DispatcherServlet 触发的),并自动绑定到 ServletContext 下。
ApplicationContext 本身当然是线程安全的,而且里面的 bean (就是你写的那些 Controller 和其他的相关类),缺省情况下也必须是线程安全的。
WebApplicationContext 是 SpringMVC 中对 ApplicationContext 的具体实现,每个 ServletContext 下只会有一个 WebApplicationContext ,在应用初始化时就创建出来了,而不是等浏览器请求来了才创建。
参考链接
https://blog.csdn.net/u012385190/article/details/81368172.html
https://www.cnblogs.com/brolanda/p/4265597.html