使用Spring / MVC,我常常难以确定应该定义bean的上下文,root-context.xml
或servlet-context.xml
。引起混淆的原因是我没有看到关于该主题的任何文档,在春季示例代码中我经常看到在样本之间的不同上下文中定义的相同内容。
根据经验,我目前在根上下文中定义了任何服务或组件,并为Web控制器,拦截器和任何只与Web真正相关的内容保留了servlet上下文。
但安全呢?我现在将它定义为根上下文的包含,但这是正确的吗?
我是否理解Web上下文实际上是应用程序根上下文的子上下文?
为什么我们需要将Web上下文分开?
几年前我读过3.0的spring文档但是不记得任何特定的东西,我也读过Spring in Action,第三版。我会喜欢围绕这个主题的任何材料。
答案 0 :(得分:1)
默认情况下,当您在web.xml中指定DispatcherServlet时,它会检查<servlet-name>.context.xml
。
如果指定contextConfigLocation,则默认情况下检查applicationContext.xml
如果指定了param值,则检查特定文件。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
您必须首先指定侦听器才能指定<servlet-name>.context.xml
以外的文件,然后如果您指定了contextConfigLocation,则它会检查applicationContext,然后检查自定义配置元数据。
答案 1 :(得分:1)
为什么我们需要将Web上下文分开?
你没有。事实上,有几个官方的Spring例子只是把所有东西都塞进去了。
您可能希望它们分开的原因有几个。也许最有效的是可维护性:源文件越小(并且配置文件是源文件),就越容易理解。另一个原因是多个前端可能会使用给定的后端。
就个人而言,我喜欢通过分离前端和后端来编写应用程序上下文的想法,并简单地导入我正在使用的后端的上下文。这会留下一个“servlet”上下文文件。
答案 2 :(得分:1)
可以,通常是不同的。
基本上,您applicationContext.xml
是您的根上下文,是您的服务和数据层bean所在的位置。
*-servlet.xml
或webmvc-config.xml
的特殊之处在于:
DispatcherServlet
关联WebApplicationContext
bean factory WebApplicationContext
)但人们这样做的最大原因是单元测试,将前端与后端分离,以及单独的视图解析器和/或多个调度程序servlet。
这对于单元测试很有用,因为您正在加载更少的bean来测试服务层。正如我在下面的评论中所述,我通常加载我的真实applicationContext.xml
:
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
另外因为servlet上下文需要一个调度程序servlet,你需要将它注册为servlet,如:
<servlet>
<servlet-name>my-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
因此,虽然您可能能够使用根上下文加载我们的MVC控制器bean,但除非调度程序servlet正在控制该上下文,否则它们并未真正注册。虽然理论上我认为DispatcherServlet
可以在类路径中加载配置,但是contextConfigLocation值不在类路径中。
还有一些人需要多个调度程序servlet,因为一些限制因为你通常只能有一个解析器链(视图,语言环境,主题等等)。