首先遇到这个问题是想知道如何将 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/