理解Spring MVC中的上下文

时间:2013-10-27 15:04:33

标签: spring tomcat spring-mvc

我是Spring的新手,我正在创建一个简单的Web应用程序。我一直在阅读Spring MVC中的上下文。

我正在使用STS插件进行日食。我创造了一个 使用插件的Spring MVC项目。

现在我在项目中有三个xml文档,web.xml,root-context.xml和servlet-context.xml。这些是由STS为我创建的。

  1. 在web.xml中,调度程序servlet指向servlet-context.xml,我理解调度程序servlet作业是创建一个知道如何解析视图的Web应用程序上下文,并且是控制器bean存在的位置。 我的理解是否正确?如果是这样,那么这个背景下还有什么其他工作呢?

  2. 现在,有一个名为root-context.xml的文件,它在我的项目默认包中有一个组件扫描。我的理解是这个上下文需要有许多servlet可能使用的全局bean。我的理解是否正确?这还有什么作用?使用此文件创建了什么样的上下文?

  3. 现在,我在项目中更进一步,我有几个* -context.xml文件(dao-context.xml,security-context.xml等),它们使用contextLoaderListner加载(在web.xml中) 。这是一个好主意吗?或者一切都应该进入servlet-context.xml?我认为拥有不同的背景是一个好主意,因为它提供了关注的分离。评论?此外,从这些* -context.xml文件创建了什么样的上下文?这些文件的正确文件夹位置是什么?

  4. Web.xml用于servlet容器,如tomcat等,项目中的所有其他xml文件都用于spring容器。那是对的吗?所有这些文件是分开的,以提供关注点分离?

  5. 当前场景中存在多少个应用程序上下文和Web应用程序上下文?

  6. 为什么有人需要多个调度程序servlet?

    为什么有人需要多个应用程序上下文?

    思考?评论?更正?最佳做法?

2 个答案:

答案 0 :(得分:13)

这种设计背后的整个想法是在典型的Web应用程序中处理不同的架构层,并为跨上下文的bean提供继承/覆盖机制。 Spring中的每种类型的上下文都与不同的架构层相关,例如,Web层,服务层等。

基于Spring的Web应用程序可以配置多个调度程序servlet(尽管在大多数情况下它是一个servlet - 但是调度程序serlvet仍然是一个servlet,并且可能在web.xml中配置了多个)。这些可以配置为处理不同的URL模式。显然每个都是一个不同的servlet,因此可以有不同的Spring Web应用程序上下文。这些中的每一个都可以包含Spring Web层的不同配置,如控制器,拦截器,视图解析器,区域设置解析器等,因为它们通常属于应用程序的Web层。所有这些配置和bean都是每个调度程序servlet专用的,因此它们彼此不可见。因此,具有单独的弹簧Web应用程序上下文有助于实现此隐私。但是,还有其他bean被设计为共享,因此属于根上下文。因此,所有可共享的内容都属于根上下文,并且可以将其视为此Web应用程序的全局内容。

每个调度程序servlet都继承根上下文中定义的所有bean。但是需要注意的重要一点是,共享bean可以被相应的调度程序servlet特定bean覆盖。因此,在Web应用程序中,根上下文可以被视为继承但可以被覆盖的内容。

答案 1 :(得分:2)

Well spring并没有强制你以这种方式拥有xml文件,你可以使用一个只有一个xml文件来完成所有工作,这个文件将是servlet-context.xml并且只使用调度程序servlet。通常有不同的文件来定义你的服务bean或dao bean,所以这基本上取决于你的应用程序设计,例如,如果你使用spring安全性,你可能想要添加一个像security-context.xml之类的xml文件正如我所说,这取决于设计。您实际上可以完全消除上下文加载器侦听器,并且仍然可以使用调度程序servlet完成所有操作。 你的问题范围太广了,因为你不熟悉弹簧可能会得到更多关于弹簧容器的细节,并决定什么适合你的要求。 我通常在WEB-INF中使用servlet-context.xml,在classpath中使用service-context.xml等其他配置,这也不是严格的规则,只是它适合我。