来自XmlWebApplicationContext javadoc:
默认情况下,配置将从“/WEB-INF/applicationContext.xml”获取根上下文,而“/WEB-INF/test-servlet.xml”获取具有命名空间“test-servlet”的上下文“(对于具有servlet-name”test“的DispatcherServlet实例)。
Spring的背景是什么意思?
什么是根背景?还有哪些其他类型的Spring语境?
什么是命名空间?
更新
一些后续问题:
什么是Spring ApplicationContext - 它是否包含配置XML文件中定义的bean的“东西”?
查看ContextLoaderListener的代码,看起来它加载了配置XML文件中定义的数据。但我的Spring Web应用程序无需定义此侦听器或任何其他侦听器。怎么会这样?
在什么情况下有多个Spring的DispatcherServlet实例是有意义的?
根上下文(来自applicationContext.xml的数据)是否适用于DispatcherServlet的每个实例,而其他上下文(例如来自test-servlet.xml的数据)是否仅适用于相关的DispatcherServlet(即测试)?
答案 0 :(得分:24)
“Spring context”= Spring ApplicationContext。
“根上下文”,就Web应用程序而言,是指由webapp加载和使用的主要上下文。通常,您将使用ContextLoaderListener启动根上下文。
根上下文实际上并不是一种“类型”的上下文。它只是一个上下文所扮演的角色。您在webapp中有一个根上下文。其他上下文不是根本上下文。他们通常是根本背景的孩子。
此处的命名空间是指Spring的DispatcherServlet实例的范围。所有它说的是,如果你在web.xml中命名你的servlet“test”,那么按照惯例,Spring将寻找一个名为“test-servlet.xml”的文件作为调度程序的上下文。顺便提一下,为调度程序创建的每个上下文都成为根上下文的子项。
编辑:要回答您的新问题:
答案 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都可以在子代中引用,并且可以覆盖但不反之亦然