java - Spring 是否在容器初始化其过滤器之前设置应用程序上下文?

标签 java spring tomcat servlet-filters catalina

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

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

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

最佳答案

Spring 通过 ContextLoaderListener 加载它的应用上下文,这是一个 ServletContextListener(Servlet API 的一部分)。所有已注册的 ServletContextListener 和其他监听器类型都在任何声明的 FilterServlet 之前初始化。

因此,假设您将 targetFilterLifecycle 设置为 false,当您的 DelegatingFilterProxy 由 Servlet 容器创建时,您的 Filter bean 已经在应用程序上下文中创建和初始化(这是它应该声明的地方)。

javadoc 声明了以下有关 targetFilterLifecycle 的内容:

Default is "false"; target beans usually rely on the Spring application context for managing their lifecycle. Setting this flag to "true" means that the servlet container will control the lifecycle of the target Filter, with this proxy delegating the corresponding calls.

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

关于java - Spring 是否在容器初始化其过滤器之前设置应用程序上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122883/

相关文章:

eclipse - 将 CGI-BIN 添加到 Eclipse 上的 Tomcat 7

tomcat - 让在 SAP Netweaver AS 上开发更舒服?

java - Apache Shiro authc.loginUrl 登录后没有重定向到我的 Jersey 服务

java - 无法使用 Jsoup HTML 解析器 Java 实现某些功能

spring - Spring Data REST 是否支持 JPA @Version?

java - org.springframework.web.servlet.PageNotFound noHandlerFound 未找到带有 URI 的 HTTP 请求的映射。我已将项目部署为 Maven 项目

tomcat - Tomcat 上的 WebApplication 上下文文件

java - 错误 :Execution failed for task ':app:dexDebug' . 使用 Facebook Fresco 以非零退出值 2 完成

java - 文本字段是 StretchWithOverflow ="true"吗?

java - 如何在 servlet 过滤器中获取 Spring bean?