Spring MVC传统两个applicationContext的继承关系
1.springmvc的上下文容器
springmvc项目中web.xml中可以定义两种参数:
一个是全局参数(ServletContext),通过<context-param></context-param>声明,在servlet里面可以通过getServletContext().getInitParameter("context/param")得到
一个是servlet参数,通过在servlet中声明 <init-param></init-param> ,在servlet的init()方法中通过this.getInitParameter("param1")取得
全局参数(ServletContext) 即根applicationContext是通过listener初始化的;servlet参数 即孩子ApplicationContext是通过servlet初始化的。
springMvc项目启动流程:
- 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
- 容器创建一个ServletContext(上下文)。在该应用内全局共享。
- 容器将<context-param></context-param>转化为键值对,并交给ServletContext.
- 容器创建<listener></listener>中的类实例,即创建监听.该监听器必须实现自ServletContextListener接口
以上操作在WEB项目完全启动之前被执行。
2.spring上下文容器配置
spring提供了实现ServletContextListener接口的上下文初始化监听器:org.springframework.web.context.ContextLoaderListener
spring需要我们指定容器的配置文件,然后由该监听器初始化并创建该容器。要求你指定配置文件的地址及文件名称,一定要使用:contextConfigLocation作为参数名称
spring配置时:在applicationContext.xml负责扫描非controller的类 ,而在spring-mvc.xml中只负责扫描controller的类
-
在applicationContext.xml中扫描非contorller的类
- 在spring-mvc.xml中只负责扫描controller的类
启动流程:
- servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext
- 容器调用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文环境。
- 容器初始化web.xml中配置的servlet即DispatcherServlet ,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。
作用范围:在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。
3.Spring mvc里分有两个WebApplicationContext,导致各种重复构造bean,各种bean无法注入的问题。 如何只产生一个 WebApplicationContext?
如下配置可以让spring只创建一个spring上下文。
父亲WebApplicationContext扫描所有的bean,包括controller,即都在applicationContext.xml里加载,而servlet-context.xml里配置为空即可。