【发布时间】:2012-02-19 10:17:10
【问题描述】:
一个标准的 Spring Web 应用程序(由 Roo 或“Spring MVC 项目”模板创建)创建一个带有 ContextLoaderListener 和 DispatcherServlet 的 web.xml。 为什么他们不仅使用DispatcherServlet 并使其加载完整的配置?
我知道 ContextLoaderListener 应该用于加载与 Web 无关的内容,而 DispatcherServlet 用于加载与 Web 相关的内容(控制器,...)。这会导致两个上下文:父上下文和子上下文。
背景:
多年来,我一直以这种标准方式进行操作。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Handles Spring requests -->
<servlet>
<servlet-name>roo</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>
这通常会导致两个上下文以及它们之间的依赖关系出现问题。在过去,我总是能够找到解决方案,并且我有强烈的感觉,这使得软件结构/架构总是更好。但现在我面对的是problem with the events of the both contexts。
-- 然而,这让我重新思考这两种上下文模式,我在问自己:我为什么要让自己陷入这个麻烦,为什么不使用一个DispatcherServlet 加载所有弹簧配置文件并完全删除ContextLoaderListener。 (我仍然会有不同的配置文件,但只有一个上下文。)
有什么理由不删除ContextLoaderListener?
【问题讨论】:
-
"这通常会导致两个上下文以及它们之间的依赖关系出现问题。"这是一个很好的例子,我认为依赖注入框架只会让我们的生活比自己动手的依赖注入更难。
-
@Andy - 虽然我对这个观点有些同情,但我不禁注意到您需要两种上下文的用例(在安全过滤器和 servlet 之间共享对象,自动管理事务所以它们在您重定向到的视图完成渲染后关闭)如果没有框架的帮助很难实现。这主要是因为 servlet API 显然根本没有设计为使用依赖注入,如果你尝试自己做,它会积极地对你不利。
-
@PeriataBreatta 我明白了!那么,你认为如果它的设计不同,Spring MVC 会有更好的替代品吗?尽管人们无论如何都可以设计出 Servlet API 的完整替代方案......
-
@PeriataBreatta 有趣的是,在 JS 世界中,我已经使用 Express 路由 HTTP 请求大约一年了,我很少看到任何提及“依赖注入”并且没有类似的东西完全是 Spring 框架。
标签: java spring servlets dependency-injection