The dispatcherServlet-servlet.xml
is a child context to the one defined byapplicationContext.xml
. The child context can access beans from the parent context, but the opposite is not true. So imagine you have a "web" context, with all controllers and web-related stuff, and a "main" context with everything else
It is advisable to have as few contexts as possible (for the sake of simplicity). But you can define multiple dispatcher servlets, and hence have multiple "child" contexts.
使用applicationContext.xml文件时是需要在web.xml中添加listener的:
???
而这个一般是采用非spring mvc架构,如使用struts之类而又想引入spring才添加的,这个是用来加载Application Context。
如果直接采用SpringMVC,只需要把所有相关配置放到xxx-servlet.xml中就OK了。
applicationContext容器包含dispatcherServlet容器,当同时在这两个配置文件中配置
Spring 官方文档介绍如下:
Spring lets you define multiple contexts in a parent-child hierarchy.
The applicationContext.xml defines the beans for the "root webapp context", i.e. the context associated with the webapp.
The spring-servlet.xml (or whatever else you call it) defines the beans for one servlet's app context. There can be many of these in a webapp, one per Spring servlet (e.g. spring1-servlet.xml for servlet spring1, spring2-servlet.xml for servlet spring2).
Beans in spring-servlet.xml can reference beans in applicationContext.xml, but not vice versa.
All Spring MVC controllers must go in the spring-servlet.xml context.
In most simple cases, the applicationContext.xml context is unnecessary. It is generally used to contain beans that are shared between all servlets in a webapp. If you only have one servlet, then there's not really much point, unless you have a specific use for it.
可见, applicationContext.xml 和 dispatch-servlet.xml形成了两个父子关系的上下文。
1) 一个bean如果在两个文件中都被定义了(比如两个文件中都定义了component scan扫描相同的package), spring会在application context和 servlet context中都生成一个实例,他们处于不同的上下文空间中,他们的行为方式是有可能不一样的。
2) 如果在application context和 servlet context中都存在同一个 @Service 的实例, controller(在servlet context中) 通过 @Resource引用时, 会优先选择servlet context中的实例。
不过最好的方法是:在applicationContext和dispatcher-servlet定义的bean最好不要重复, dispatcher-servlet最好只是定义controller类型的bean。
----------------------------------------------------------------------------------------------------------------------------------------
ApplicationContext.xml 是spring 全局配置文件,用来控制spring 特性的
dispatcher-servlet.xml 是spring mvc里面的,控制器、拦截uri转发view
使用applicationContext.xml文件时是需要在web.xml中添加listener的:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> listener>
翻译过来深入理解:
1.ApplicationContext.xml 是spring 全局配置文件,用来控制spring 特性的
2.dispatcher-servlet.xml 是spring mvc里面的,控制器、拦截uri转发view
3.一个bean如果在两个文件中都被定义了(比如两个文件中都定义了component scan扫描相同的package), spring会在application context和 servlet context中都生成一个实例,他们处于不同的上下文空间中,他们的行为方式是有可能不一样的。4.如果在application context和 servlet context中都存在同一个 @Service 的实例, controller(在servlet context中) 通过 @Resource引用时, 会优先选择servlet context中的实例。
5.根据官网解释servlet context可以引用application context里的实例,反之不可以。
6.多个servlet共享application context里的实例
7.建议使用方法:servlet只扫描@controler;application扫描其它
servlet.xml扫描配置
ApplicationContext.xml 扫描配置
参考:http://www.cnblogs.com/parryyang/p/5783399.html