Spring 是不是在容器初始化其过滤器之前设置应用程序上下文?
Posted
技术标签:
【中文标题】Spring 是不是在容器初始化其过滤器之前设置应用程序上下文?【英文标题】:Does Spring setup the application context before the container initializes its filters?Spring 是否在容器初始化其过滤器之前设置应用程序上下文? 【发布时间】:2014-07-30 03:31:51 【问题描述】:我正在使用 Spring 的 DelegatingFilterProxy 将 Spring bean 用作容器过滤器。为了使用 Filter 接口中的 init 和 destroy 方法,我将 targetFilterLifecycle 定义为 true。
Spring 是否确保在容器调用 init 方法时过滤器类中的所有依赖注入 bean 都可用,或者是否存在某些 bean 仍未初始化或至少未注入的风险?
另外,Spring 将 targetFilterLifecycle 默认设置为 false 的原因是什么?
【问题讨论】:
【参考方案1】:Spring 框架始终确保 bean 在使用之前被初始化,它管理的过滤器也不例外。
普通过滤器通过init(和destroy)方法初始化自己,但是Spring bean可以通过依赖注入来初始化。这就是为什么默认情况下 Spring 假设它们被简单地初始化为 bean 并且不依赖 init 方法的原因。
【讨论】:
你能详细说明 spring 是如何确保它的吗?我问过类似的问题***.com/questions/47434743/…【参考方案2】:Spring 通过ContextLoaderListener
加载其应用程序上下文,ServletContextListener
(Servlet API 的一部分)。所有注册的ServletContextListener
和其他侦听器类型都在任何声明的Filter
s 和Servlet
s 之前初始化。
因此,假设您将 targetFilterLifecycle
设置为 false
,当您的 DelegatingFilterProxy
由 Servlet 容器创建时,您的 Filter
bean 已经在应用程序上下文中创建并初始化(这就是它的位置应该声明)。
javadoc 声明了以下关于targetFilterLifecycle
:
默认为“假”;目标bean通常依赖于Spring 用于管理其生命周期的应用程序上下文。将此标志设置为 "true" 表示 servlet 容器将控制 目标过滤器,此代理委托相应的调用。
如果您设置它或将其保留为false
,Spring 将负责初始化对象并执行任何 bean 注入(和/或执行其他生命周期步骤)。如果将其设置为true
,Spring 会在完成自己的初始化后将其交给 Servlet 容器进行自己的初始化。这是通过在启动时调用init
方法和在关闭时调用destroy
方法来完成的。
【讨论】:
谢谢。我想在第二种情况下,“Spring 将把它交给 Servlet 容器进行自己的初始化”总是在先进行自己的初始化(依赖注入等)之后。 @andresp 实际上,它可能会。它还将执行 servlet 初始化步骤。 这是我的疑问。如果我将其设置为 true,Spring 注入的 bean 是否也已加载?从我在您的回答中看到的(在容器过滤器之前初始化应用程序上下文)我希望如此。编辑:好的,谢谢! @andresp 是的,它将被初始化。DelegatingFilterProxy
将检索初始化的bean,检查targetFilterLifecycle
,如果是true
,则调用init
方法。以上是关于Spring 是不是在容器初始化其过滤器之前设置应用程序上下文?的主要内容,如果未能解决你的问题,请参考以下文章