之前一直不理解,为啥项目中的web.xml要配置2个上下文!
即:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>court</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/court-service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
servlet:代表的的容器为spring-mvc的子容器,而DispatcherServlet 是前端控制器,该容器专门为前端监听请求的时候所用,就是说当接收到url请求的时候会引用springmvc容器内的对象来处理。
context-param:代表的容器是spring本身的容器,spring-mvc可以理解为一个继承自该容器的子容器,spring容器是最顶层的父类容器,跟java的继承原理一样,子容器能使用父类的对象,但是父容器不能使用子类的对象。
所以这2个上下文同时出现在web.xml这个配置文件中其实并不冲突,但是要注意2个容器的对象不要重复注入了哈!!!!
初始化的顺序也是父类容器优先级高,当服务器解析web.xml的时候由于listener监听的原因,会优先初始化spring容器,之后才初始化spring-mvc容器。
介绍完基本概念后就说说之前碰到的问题,由于以前一直用url请求的方式来做交互,所以当时也没有去考虑在web.xml配置spring容器,而且如果项目只存在单纯的url请求交互这样的形式,其实可以单纯的一个spring-mvc这个容器来管理对象即可(有些公司为了层次分明,可能把除去controller控制层以外的对象放在父容器中,即在web.xml配置2个容器)。前段时间项目中突然加入了webservice,通过ws来发送请求,而不走前端控制器。所以那个时候发现在webService中无法用注解的形式注入对象,只能以传统的 方式创建spring容器然后创建需要的对象,这样依赖如果依赖的服务很多的话,就得不停的创建对象。这样的场景下spring-mvc容器中的对象其实对于所有的ws请求都是不可调用的,而解决的办法就是在web.xml创建spring容器,在项目启动的时候就将要用的服务对象初始化好,并且让ws的服务实现继承SpringBeanAutowiringSupport这个父类。这样ws在调用的时候就可以直接依赖到spring容器中的对象了!!
如果想深入了解,可以看源码。。。本人表示看的头大!!!- -!