3

我正在使用 Spring 的 DelegatingFilterProxy 将 Spring bean 用作容器过滤器。为了使用 Filter 接口中的 init 和 destroy 方法,我将 targetFilterLifecycle 定义为 true。

Spring 是否确保在容器调用 init 方法时过滤器类中的所有依赖注入 bean 都可用,或者是否存在某些 bean 仍未初始化或至少未注入的风险?

此外,Spring 将 targetFilterLifecycle 默认设置为 false 的原因是什么?

4

2 回答 2

2

Spring 框架始终确保 bean 在使用之前被初始化,并且它管理的过滤器也不例外。

普通过滤器通过init(和destroy)方法初始化自己,但是Spring bean可以通过依赖注入来初始化。这就是为什么默认情况下 Spring 假设它们被简单地初始化为 bean 并且不依赖于 init 方法的原因。

于 2014-06-09T15:17:59.570 回答
2

Spring 通过ContextLoaderListenerwhich is a ServletContextListener(Servlet API 的一部分)加载其应用程序上下文。所有已注册ServletContextListener和其他侦听器类型在任何声明Filter的 s 和Servlets 之前初始化。

因此,假设您设置targetFilterLifecyclefalse,当您DelegatingFilterProxy由 Servlet 容器创建时,您的Filterbean 已经在应用程序上下文中创建并初始化(这就是它应该声明的地方)。

javadoc 说明以下内容targetFilterLifecycle

默认为“假”;目标 bean 通常依赖 Spring 应用程序上下文来管理它们的生命周期。将此标志设置为“true”意味着 servlet 容器将控制目标过滤器的生命周期,此代理委托相应的调用。

如果您将其设置或保留为false,Spring 将负责初始化对象并执行任何 bean 注入(和/或执行其他生命周期步骤)。如果将其设置为true,Spring 将在完成自己的初始化后将其交给 Servlet 容器进行自己的初始化。这是通过init在启动时调用方法和destroy在关闭时调用方法来完成的。

于 2014-06-09T15:27:25.570 回答