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 和其他侦听器类型都在任何声明的Filters 和Servlets 之前初始化。

因此,假设您将 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 是不是在容器初始化其过滤器之前设置应用程序上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Scope详解。

Spring——scope详解(转载)

Spring中IOC容器初始化过程解析

Spring中IOC容器初始化过程解析

Spring中bean的作用域scope详解

JAVA WEB 过滤器(Filter)中向容器 Spring 注入 bean