ServletContext: 这个是来自于servlet规范里的概念,它是servlet用来与容器间进行交互的接口的组合,也就是说,这个接口定义了一系列的方法,servlet通过这些方法可以很方便地与自己所在的容器进行一些交互,比如通过getMajorVersion与getMinorVersion来获取容器的版本信息等. 从它的定义中也可以看出,在一个应用中(一个JVM),servlet容器可以有多个,而所有的servlet容器共享一个ServletContext。
ServletConfig: 它与ServletContext的区别在于,servletConfig是针对servlet而言的,每个servlet都有它独有的serveltConfig信息,相互之间不共享.
ApplicationContext: 这个类是Spring实现容器功能的核心接口,它也是Spring实现IoC功能中最重要的接口,从它的名字中可以看出,它维护了整个程序运行期间所需要的上下文信息, 注意这里的应用程序并不一定是web程序,也可能是其它类型的应用. 在Spring中允许存在多个applicationContext,这些context相互之间还形成了父与子,继承与被继承的关系,这也是通常我们所说的,在spring中存在两个context,一个是root context,一个是servlet applicationContext的意思. 这点后面会进一步阐述.
WebApplicationContext: 其实这个接口不过是applicationContext接口的一个子接口罢了,只不过说它的应用形式是web罢了. 它在ApplicationContext的基础上,添加了对ServletContext的引用,即getServletContext方法.
ServletContext配置
从前面的论述中可以知道, ServletContext是容器中所有servlet共享的配置,它在应用中是全局的
根据servlet规范的规定,可以通过以下配置来进行配置,其中Context-Param指定了配置文件的位置,ContextLoaderListener定义了context加载时的监听器,因此,在容器启动时,监听器会自动加载配置文件,执行servletContext的初始化操作.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Servlet配置
每个Servlet进行配置就是ServletConfig,因此它的配置是在servlet的配置中,如下所示, 配置使用的是init-param, 它的作用就是在servlet初始化的时候,加载配置信息,完成servlet的初始化操作
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
web.xml加载顺序
1、启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点: 和
2、紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。容器以的name作为键,value作为值,将其转化为键值对,存入ServletContext。
容器创建中的类实例,根据配置的class类路径来创建监听,在监听中会有初始化方法,启动Web应用时,系统调用Listener的该方法 contextInitialized(ServletContextEvent args),在这个方法中获得:
ServletContext application =ServletContextEvent.getServletContext();
context-param的值= application.getInitParameter(“context-param的键”);
得到这个context-param的值之后,你就可以做一些操作了。
3、接着,容器会读取,根据指定的类路径来实例化过滤器。
以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。
所以,Servlet的初始化都要比上面提到的那几个要迟。总的来说,web.xml的加载顺序是: *<context-param>-> <listener> -> <filter> -> <servlet>*
。其中,如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。
更多参考:https://blog.csdn.net/qq_22075041/article/details/78692780