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

时间:2011-09-16 23:24:56

标签: spring spring-mvc

来自XmlWebApplicationContext javadoc:

  

默认情况下,配置将从“/WEB-INF/applicationContext.xml”获取根上下文,而“/WEB-INF/test-servlet.xml”获取具有命名空间“test-servlet”的上下文“(对于具有servlet-name”test“的DispatcherServlet实例)。

Spring的背景是什么意思?

什么是根背景?还有哪些其他类型的Spring语境?

什么是命名空间?

更新

一些后续问题:

  1. 什么是Spring ApplicationContext - 它是否包含配置XML文件中定义的bean的“东西”?

  2. 查看ContextLoaderListener的代码,看起来它加载了配置XML文件中定义的数据。但我的Spring Web应用程序无需定义此侦听器或任何其他侦听器。怎么会这样?

  3. 在什么情况下有多个Spring的DispatcherServlet实例是有意义的?

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

2 个答案:

答案 0 :(得分:24)

“Spring context”= Spring ApplicationContext

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

根上下文实际上并不是一种“类型”的上下文。它只是一个上下文所扮演的角色。您在webapp中有一个根上下文。其他上下文不是根本上下文。他们通常是根本背景的孩子。

此处的命名空间是指Spring的DispatcherServlet实例的范围。所有它说的是,如果你在web.xml中命名你的servlet“test”,那么按照惯例,Spring将寻找一个名为“test-servlet.xml”的文件作为调度程序的上下文。顺便提一下,为调度程序创建的每个上下文都成为根上下文的子项。

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

  1. 按照我的答案第一行中的链接了解ApplicationContext。如果您在那里没有回答问题,我建议发布一个新的SO问题。
  2. 根上下文是可选的。如果您没有定义ContextLoaderListener,那么您就没有根上下文。当您使用DispatcherServlet时,它会启动自己的ApplicationContext,并从那里获取所需的bean。
  3. 我不知道我头顶的一个。我想如果您的应用中的某些网址资源之间需要完全不同的配置,那可能会促使您这样做。
  4. 是。要以正确的术语说明它,根上下文是为DispatcherServlet启动的任何上下文的父上下文。父上下文中的Bean可以通过子上下文访问,但反之则不然。

答案 1 :(得分:8)

在Web应用程序中,体系结构通常分为多层,如流行的MVC结构。 因此,Web应用程序基本上包含处理客户端请求的层,即HTTPRequests 以及为这些请求提供服务的层。

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

现在,下一部分是Service / Dao层,它包含您的业务逻辑。执行此类逻辑的Bean将加载到ApplicationContext对象下。

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

因为,应用程序具有相同的业务逻辑,可以由处理不同协议的多个客户端使用。您可以使用相同的服务层来处理RMI以及HTTP调用。 所以Spring创建了一个父上下文,它作为ApplicationContext启动。然后,如果您的应用程序处理Web请求,您可以创建一个dispathcher servlet,它具有自己的Webapplicationcontext并初始化为父上下文的子级。 因此,所有父bean都可以在子代中引用,并且可以覆盖但不反之亦然