【问题标题】:Spring-MVC: What are a "context" and "namespace"?Spring-MVC:什么是“上下文”和“命名空间”?
【发布时间】:2011-11-19 01:29:25
【问题描述】:

来自XmlWebApplicationContextjavadoc:

默认情况下,配置将从“/WEB-INF/applicationContext.xml”获取根上下文,“/WEB-INF/test-servlet.xml”获取命名空间为“test-servlet”的上下文"(就像一个 DispatcherServlet 实例的 servlet 名称为“test”)。

Spring 上下文是什么意思?

什么是根上下文?还有哪些其他类型的 Spring 上下文?

什么是命名空间?

更新:

一些后续问题:

  1. 什么是 Spring ApplicationContext - 它是保存在配置 XML 文件中定义的 bean 的某种“东西”吗?

  2. 查看 ContextLoaderListener 的代码,它看起来像是加载了配置 XML 文件中定义的数据。但是我的 Spring Web 应用程序可以在没有定义此侦听器或任何其他侦听器的情况下工作。怎么可能?

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

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

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    “Spring 上下文”=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. 我不知道有哪一个在我的脑海中。我想如果您的应用中的某些 URL 资源之间需要完全不同的配置,那可能会促使您这样做。
    4. 是的。准确地说,根上下文是为 DispatcherServlet 启动的任何上下文的父上下文。父上下文中的 Bean 可以通过子上下文访问,但反之则不然。

    【讨论】:

    • @rapt:这并不适合很多 cmets。为什么不将这些问题添加到上面的问题中或开始一个新问题?
    • 谢谢,刚刚将我的问题添加到我的原始帖子中。
    • 感谢您的更新,它澄清了我所询问的要点。我还花了一些时间在 Apress 和 Manning 的书中阅读了这一点。似乎最多只有一层子上下文,即根上下文不能有孙上下文。
    • 这是 Spring MVC 中的默认行为,是的。每个 DispatcherServlet 都有自己的上下文,它作为根上下文的子级附加,但没有任何内容成为任何 DispatcherServlet 上下文的子级。但是,不要误以为上下文通常只能有一个级别的子级。任何上下文都可以有子级,包括本身就是子级的上下文。
    • @RyanStewart 你能用另一个类比解释一下上下文的一般含义以及它在春季是如何相关的
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 好吧,有些和我的问题无关。但至于其余的我不明白你想说什么。
    • 我试图解释为什么初始化了两种类型的上下文。一个被称为 root.xml,另一个被称为 test-servlet.xml。恕我直言,我回答了 1,2 和 4 个问题。我的错,如果我能正确解释的话:)
    猜你喜欢
    • 2012-01-01
    • 2011-03-05
    • 2020-07-25
    • 2012-07-13
    • 2011-03-23
    • 2011-04-24
    相关资源
    最近更新 更多