Spring-MVC:什么是“上下文”和“命名空间”?

从XmlWebApplicationContext javadoc:

默认情况下,configuration将取自“/WEB-INF/applicationContext.xml”作为根上下文,“/WEB-INF/test-servlet.xml”作为命名空间为“test-servlet”的上下文(例如对于servlet名称为“test”的DispatcherServlet实例)。

这是什么意思一个spring的情况?

什么是根环境? 还有什么其他types的spring吗?

什么是命名空间?

更新:

一些后续问题:

  1. 什么是Spring ApplicationContext – 它是否包含在configurationXML文件中定义的Bean的“事情”?

  2. 看着ContextLoaderListener的代码,它看起来像加载configurationXML文件中定义的数据。 但是我的Spring web应用程序没有定义这个监听器或任何其他监听器。 怎么会这样?

  3. Spring的DispatcherServlet有多个实例,在哪些情况下有意义?

  4. 根上下文(来自applicationContext.xml的数据)适用于DispatcherServlet的每个实例,而其他上下文(例如来自test-servlet.xml的数据)仅适用于相关的DispatcherServlet(即testing)?

“Spring context”=一个Spring ApplicationContext 。

就Web应用程序而言,“根上下文”是指Web应用程序加载和使用的主要上下文。 通常,您将使用ContextLoaderListener启动根上下文。

根上下文并不是真正的“上下文”。 这只是一个场景所起的作用。 你有一个web应用程序的根上下文。 其他上下文不是根上下文。 他们通常是根环境下的孩子。

这里的命名空间是指Spring的DispatcherServlet实例的范围。 所有的说法正确的是,如果你在你的web.xml中命名servlet“test”,那么按照约定,Spring会查找一个名为“test-servlet.xml”的文件作为调度器的上下文。 顺便说一下,为调度程序创build的每个上下文都成为根上下文的子节点。

编辑:要回答你的新问题:

  1. 按照我的答案的第一行中的链接了解ApplicationContext。 如果你有问题没有回答那里,我会build议张贴一个新的SO问题。
  2. 根上下文是可选的。 如果您没有定义ContextLoaderListener,那么您只是没有根上下文。 当你使用DispatcherServlet的时候,它会启动自己的ApplicationContext,并从那里获取它需要的bean。
  3. 我不知道我头上有一个。 我猜想,如果您的应用程序中某些URL资源之间需要有大不相同的configuration,那么可能会促使您这样做。
  4. 是。 为了用适当的术语说明,根上下文是为DispatcherServlet启动的任何上下文的父上下文。 在父上下文中的bean可以通过subprocess访问,但是反过来却是不正确的。

在一个Web应用程序中,体系结构通常分为像stream行的MVC结构一样的层。 所以一个Web应用程序基本上包含一个处理客户端请求的层,即HTTPRequests和一个为这些请求提供服务的层。

总结一下:用于处理Http请求的类,即映射到URL的控制器来自test-servlet.xml。 这被称为WebapplicationContext,仅包含主要用于处理客户端请求的bean。

现在下一部分是包含您的业务逻辑的Service / Dao层。 执行这种逻辑的Bean被加载到ApplicationContext对象下。

现在你可能会问为什么他们把这些东西分成文件或两个不同的对象。

因为,一个应用程序具有相同的业务逻辑,可以由不同协议的多个客户端使用。 您可以使用相同的服务层来处理RMI以及HTTP调用。 所以Spring创build了一个以ApplicationContext开头的父上下文。 然后,如果您的应用程序处理Web请求,则可以创build一个具有自己的WebApplicationContext并作为父上下文的子项初始化的dispathcher servlet。 所以所有的父类bean都可以在子类中被引用,并且可以被覆盖而不是相反