2

在 Eclipse 中使用 STS 创建一个 mvc 项目我注意到 servlet-context.xml 似乎被编写为在根上下文和 dispatcherservlet 上下文中使用。我这样说是因为我注意到里面有 context:component-scan,它通常被加载到根上下文中,但它被加载到了 dispatcherservlet 上下文中。我还注意到一个示例 spring mvc/jpa 项目 - http://duckranger.com/2012/04/spring-mvc-3-x-with-sts-tutorial-part-iii-add-some-jpa/ - 特别是将 servlet-context.xml 加载到两个上下文中。我认为这个想法是在上下文之间保持清晰的分离。谁可以给我解释一下这个?

4

1 回答 1

6

下面的配置是完全错误的

  <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:META-INF\root-context.xml
            classpath:META-INF\servlet-context.xml
            classpath:META-INF\datasource.xml
        </param-value>
    </context-param>

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:META-INF\servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
  • 您的根上下文和 servlet 上下文不应该导入相同的文件,因为Spring中的上下文层次结构,根上下文中的 bean 已经在 servlet 上下文中可用。在不同的上下文中创建它们的副本是没有意义的(特别是因为根上下文中的 bean 将被 servlet 上下文中的那些遮蔽,例如,如果您<tx:annotation-driven>仅在根上下文中声明它不会影响servlet 上下文 bean,这将迫使您更加纠结配置)。
  • 放入 servlet 上下文是非常不合逻辑<jpa:repositories>的,因为您很可能会使用服务层的存储库。
  • 通常,您不应将 MVC 配置以外的任何内容放入 servlet 上下文。它是服务应该存在的根 Web 应用程序上下文。Servlet 上下文提供了控制器与服务的分离,因此当您使用 Spring Test Context 框架测试您的服务时,您不必创建控制器(如果您想测试映射,您应该使用Spring MVC 测试框架)并测试直接应用服务。需要明确的是,如果我们查看 Hexagonal Architecture 文章中的图 在此处输入图像描述

servlet 上下文应该只包含与用户端API 相关的东西,而不是应用程序。是否应该划分根 Web 应用程序上下文的配置并将data-side-api放入单独的配置文件是有争议的,但问题是关于 servlet/根上下文。

只是为了不那么抽象,这里是一些我在配置 Spring 应用程序时通常记住的非正式图表(就 Spring 上下文和 bean 配置文件而言)(当然这都是主观的,它不是一个超级解决方案,实际上有点结束了复杂——我不太可能需要这么多 servlet 和配置文件)

spring 和六边形架构之间的关系 servlet 处理不同类型的传入请求 - 即用于 mvc 的 servlet、用于 gwt 的 servlet、用于 REST 的 servlet 等,而传出请求是从根应用程序上下文启动的

于 2013-02-02T06:52:41.493 回答