了解Spring MVC中的上下文


问题内容

我刚接触Spring,正在创建一个简单的Web应用程序。我一直在阅读有关Spring MVC中的上下文的信息。

我正在使用STS Eclipse插件。我使用插件创建了一个Spring MVC项目。

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

  1. 在web.xml中,调度程序servlet指向servlet-context.xml,我知道调度程序servlets的工作是创建一个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应用程序上下文?

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

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

有什么想法吗?注释?更正?最佳做法?


问题答案:

该设计的整个思想是在典型的Web应用程序中处理不同的体系结构层,并为跨上下文的bean提供继承/重写机制。Spring中的每种类型的上下文都与不同的体系结构层相关,例如Web层,服务层等。

一个基于Spring的Web应用程序可以配置多个调度程序servlet(尽管在大多数情况下,它是一个servlet-
但是调度程序serlvet仍然是一个servlet,并且在web.xml中可以配置多个)。可以将它们配置为处理不同的URL模式。因此,显然每个都是不同的servlet,因此可以具有不同的Spring
Web Application上下文。这些中的每一个都可以包含Spring
Web层的不同配置,例如控制器,拦截器,视图解析器,语言环境解析器等,因为它们通常属于应用程序的Web层。所有这些配置和bean对每个调度程序servlet都是私有的,因此它们彼此之间不可见。因此,具有单独的spring
Web应用程序上下文对于启用此隐私是有意义的。但是,还有其他一些旨在共享的bean,因此它们属于根上下文。因此,所有可共享的事物都属于根上下文,对于此Web应用程序,可以将其视为全局的。


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