我正在使用Spring的DelegatingFilterProxy将Spring bean用作容器过滤器。为了使用Filter接口中的init和destroy方法,我将targetFilterLifecycle定义为true。
Spring是否确保在容器调用init方法时,过滤器类中所有依赖注入的bean都可用,或者是否存在某些bean仍未初始化或至少注入的风险?
另外,Spring将targetFilterLifecycle默认为false的原因是什么?
答案 0 :(得分:2)
Spring框架始终确保在使用bean之前初始化bean,并且它管理的过滤器也不例外。
普通过滤器通过init(和destroy)方法初始化自己,但是可以通过依赖注入来初始化Spring bean。这就是为什么Spring默认它们只是初始化为bean并且不依赖于init方法的原因。
答案 1 :(得分:2)
Spring通过ContextLoaderListener
加载其应用程序上下文,ServletContextListener
是ServletContextListener
(Servlet API的一部分)。所有已注册的Filter
和其他侦听器类型在任何已声明的Servlet
和targetFilterLifecycle
之前初始化。
因此,假设您将false
设置为DelegatingFilterProxy
,那么当Servlet容器创建Filter
时,您的targetFilterLifecycle
bean已经创建并初始化在应用程序上下文中(应该声明它)。
javadoc说明了以下false
:
默认为“false”;目标bean通常依赖于Spring 用于管理生命周期的应用程序上下文将此标志设置为 “true”表示servlet容器将控制生命周期 目标过滤器,使用此代理委派相应的调用。
如果设置它或将其保留为true
,Spring将负责初始化对象并执行任何bean注入(和/或执行其他生命周期步骤)。如果将其设置为init
,Spring会将其提供给Servlet容器,以便在完成自己的初始化后进行自己的初始化。这是通过在启动时调用destroy
方法和在关闭时调用{{1}}方法来完成的。