【问题标题】:spring servlet-context in stssts中的spring servlet上下文
【发布时间】:2013-01-17 07:43:36
【问题描述】:

在 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 加载到两个上下文中。我认为这个想法是在上下文之间保持清晰的分离。谁能给我解释一下?

【问题讨论】:

  • 大声笑我读过你引用的那个博客,但只是浏览了其中的女孩照片。另外请澄清说组件扫描存在于不同的上下文中是什么意思。

标签: spring spring-mvc


【解决方案1】:

以下配置完全错误

  <!-- 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 中的 context hierarchy 导致根上下文中的 bean 已经在 servlet 上下文中可用。在不同的上下文中创建它们的副本是没有意义的(特别是因为根上下文中的 bean 将被 servlet 上下文中的那些遮蔽,例如,如果您仅在根上下文中声明 &lt;tx:annotation-driven&gt; 它不会影响servlet 上下文 bean 的行为,这将迫使您更加纠结配置)。
  • &lt;jpa:repositories&gt; 放入 servlet 上下文非常不合逻辑,因为您很可能会使用服务层的存储库。
  • 通常,除了 MVC 配置之外,您不应将任何内容放入 servlet 上下文。它是服务应该存在的根 Web 应用程序上下文。 Servlet 上下文提供了控制器与服务的分离,因此当您使用 Spring Test Context 框架测试您的服务时,您不必创建控制器(如果您想测试映射,您应该使用 Spring MVC Test framework)并测试应用程序直接服务。 需要明确的是,如果我们检查 the figure from the Hexagonal Architecture article

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

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

【讨论】:

  • 鲍里斯,很棒的回复!远远超出我的预期。
猜你喜欢
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多