是 Java 过滤器单例吗
Posted
技术标签:
【中文标题】是 Java 过滤器单例吗【英文标题】:Are Java Filter Singleton 【发布时间】:2014-03-10 08:23:09 【问题描述】:我正在实现一个 Java 企业应用程序并为每个请求声明一个过滤器,那么服务器如何跟踪这个请求,它是否为每个请求创建一个新的过滤器对象,或者它们只是一个处理所有请求的过滤器,在其他情况下单词是java web filter singletone?
【问题讨论】:
我不确定,但是 init() 和 destroy() 只被调用一次,但是对于每个请求它都必须通过 doFilter.... 这种行为与 servlet init、destroy 或服务方法。 相关:***.com/q/3106452 【参考方案1】:首先,让我们回顾一下Singleton Pattern(强调我的)的定义:
在软件工程中,单例模式是一种将类的实例化限制为一个对象的设计模式。
当您声明一个实现Filter
接口的类时,它需要一个public
构造函数(通常是默认构造函数),以便应用程序服务器可以实例化它。因此,通过这样做,Filter
不是单例。
请注意,应用程序服务器将维护单个实例每个应用程序上下文,例如每个已部署的 Web 应用程序,但这与拥有单例不同。为什么?因为您或其他程序员可能不小心创建了此类的实例(即使它没有使用该实例)。
【讨论】:
不是单例,而是本质上相当于 CDI 中的“@ApplicationScoped”。【参考方案2】:答案取决于你如何在 web.xml 中定义它。
比如web.xml这个片段,创建一个Filter1的对象
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.surasin.test.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是web.xml的这个框架,创建了Filter1的两个对象
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.surasin.test.Filter1</filter-class>
<init-param>
<param-name>my-param</param-name>
<param-value>my-param-value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.surasin.test.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【讨论】:
以上是关于是 Java 过滤器单例吗的主要内容,如果未能解决你的问题,请参考以下文章