【问题标题】:What setting causes ContextLoaderListener's (root context) to be the 'parent' context over DispatcherServlet's context?什么设置导致 ContextLoaderListener(根上下文)成为 DispatcherServlet 上下文的“父”上下文?
【发布时间】:2017-08-01 00:42:13
【问题描述】:

首先遇到这个问题是想知道我应该如何将 ContextLoaderListener 的应用程序上下文中的服务层级 bean 自动装配/注入到 DispatcherServlet 的上下文中的 bean 中。

假设对于一个随机的简单情况,PuppyService 需要在实际资源/控制器级别上自动装配/注入到 PuppyResource 中。 Puppy 服务以及 Puppy 存储库和任何 Puppy 实体将是从 @Configuration 类自动加载到根/ContextLoaderListener 的上下文中的 bean,该类在其他包中进行组件扫描以获取 bean 并加载它们...

同时,Puppy RESOURCE 将更多地处于 webMvc 级别并加载到 DispatcherServlet 的上下文中。

根据我刚刚阅读的内容,现在希望理解,根上下文实际上是 DispatcherServlet 创建的上下文的“父”上下文。这意味着存在于根上下文中的 bean 实际上可以自动装配/注入到存在于由 DispatcherServlet 创建的上下文中的任何 bean 中。我确实刚刚了解了“嵌套”上下文的概念。这准确吗?

如果这是准确的,那么配置在哪里设置以使根上下文成为“父”上下文?目前,当我配置 servlet/listener 时,我是通过 WebApplicationInitializer 的自定义实现来完成的,其中我只需创建两个上下文,分别将它们加载到 DispatcherServlet 实例和 ContextLoaderListener 实例中,然后将它们分别注册到 servlet .我猜在那里的某个地方,ContextLoaderListener 的应用程序上下文会自动设置为“父级”。

有人能简单解释一下吗?谢谢。

【问题讨论】:

    标签: java spring rest spring-mvc servlets


    【解决方案1】:

    该行为内置于DispatcherServlet。 javadoc 定义了根应用程序上下文。

    仅由ContextLoaderListener 加载的根应用程序上下文, 如有,将分享。

    ContextLoaderListener 的 javadoc 也声明了

    启动和关闭 Spring 的根 WebApplicationContext 的引导侦听器。

    并且,假设您使用DispatcherServlet constructor that receives a WebApplicationContext

    如果给定的上下文还没有父级,根 应用程序上下文将被设置为父级

    您将自动获得此行为。

    再次来自 javadoc,

    此构造函数在 Servlet 3.0+ 环境中很有用,其中 servlet 的基于实例的注册可以通过 ServletContext.addServlet(java.lang.String, java.lang.String)API。

    这是常见的AbstractDispatcherServletInitializer 用于设置您的 Spring MVC 应用程序。

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多