java - 什么设置导致 ContextLoaderListener(根上下文)成为 DispatcherServlet 上下文上的 'parent' 上下文?

标签 java spring rest spring-mvc servlets

首先遇到这个问题是想知道如何将 ContextLoaderListener 的应用程序上下文中的服务层级别 bean Autowiring /注入(inject)到 DispatcherServlet 的上下文中的 bean 中。

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

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

根据我刚刚读到的内容,现在希望能够理解,根上下文实际上是 DispatcherServlet 创建的上下文的“父”上下文。这意味着根上下文中的 Bean 实际上可以 Autowiring /注入(inject)到由 DispatcherServlet 创建的上下文中的任何 Bean 中。我实际上刚刚了解了“嵌套”上下文的概念。这准确吗?

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

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

最佳答案

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

Only the root application context as loaded by ContextLoaderListener, if any, will be shared.

ContextLoaderListener 的 javadoc还指出

Bootstrap listener to start up and shut down Spring's root WebApplicationContext.

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

If the given context does not already have a parent, the root application context will be set as the parent.

您将自动获得此行为。

再次来自 javadoc,

This constructor is useful in Servlet 3.0+ environments where instance-based registration of servlets is possible through the ServletContext.addServlet(java.lang.String, java.lang.String) API.

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

关于java - 什么设置导致 ContextLoaderListener(根上下文)成为 DispatcherServlet 上下文上的 'parent' 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42722299/

相关文章:

Spring REST DELETE 示例错误

java - 不合逻辑的空指针异常

rest - 为我们在 Apiary.io 中的每个响应指定描述

java - Netbeans java Swing jRadioButton setIcon 和 setSelectedIcon

java - HashMap 到 txt 文件 - 在 Java OOP 中写入键和值

java - 使用EntityManager的Spring数据: NullPointerException

java - 使用实体管理器时,没有为该名称定义查询

java - 如何延迟注册 Spring 'bean definitions' 以缩短启动时间?

java - 无法在 Mac OS X Yosemite (10.10) 上运行 java 桌面应用程序

java - 在 Android 中从 SQLite 中检索数据计数