0

使用 Spring/MVC,我经常很难确定应该定义哪个上下文 bean,root-context.xml或者servlet-context.xml. 造成混淆的原因是我没有看到关于该主题的任何文档关于将什么放在哪里,在 spring 示例代码中,我经常看到在示例之间的不同上下文中定义了相同的东西。

根据经验,我目前在根上下文中定义了任何服务或组件,并为 web 控制器、拦截器和任何只与 web 真正相关的东西保留了 servlet 上下文。

但是安全呢?我目前已将其定义为根上下文的包含,但这是正确的吗?

我对 Web 上下文实际上是应用程序根上下文的子上下文的理解是否正确?

为什么我们需要将 Web 上下文分开?

几年前我已经阅读了 3.0 的 spring 文档,但不记得任何具体的内容,我还阅读了 Spring in Action,第三版。我会喜欢围绕这个主题的任何材料。

4

3 回答 3

1

默认情况下,它会检查您<servlet-name>.context.xml何时在 web.xml 中指定 DispatcherServlet。如果您指定 contextConfigLocation,则默认情况下检查applicationContext.xml您是否指定参数值,然后检查特定文件。

<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然后它会检查 applicationContext 如果您没有指定任何内容,如果您指定 contextConfigLocation 然后它会检查自定义配置元数据。

于 2012-08-27T13:32:26.833 回答
1

为什么我们需要将 Web 上下文分开?

你没有。事实上,有几个官方的 Spring 示例只是将所有内容组合在一起。

您可能希望将它们分开有几个原因。也许最有效的是可维护性:源文件越小(配置文件就是源文件),就越容易理解。另一个原因是给定的后端可能被多个前端使用。

就个人而言,我喜欢通过分离前端和后端来组合应用程序上下文的想法,并简单地为我正在使用的后端导入上下文。这给您留下了一个“servlet”上下文文件。

于 2012-08-27T13:41:12.850 回答
1

可以而且通常是有区别的。

基本上,您applicationContext.xml是您的根上下文,并且是您的服务和数据层 bean 所在的位置。

*-servlet.xmlwebmvc-config.xml特别之处在于:

  • DispatcherServlet关联
  • 总是WebApplicationContext豆厂
  • 是根上下文的子项(也可以是 a 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,因为您通常只能拥有一个解析器链(视图、区域设置、主题等)。

于 2012-08-29T04:23:14.270 回答