在 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 加载到两个上下文中。我认为这个想法是在上下文之间保持清晰的分离。谁可以给我解释一下这个?
问问题
1514 次
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 和配置文件)
于 2013-02-02T06:52:41.493 回答