是 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 过滤器单例吗的主要内容,如果未能解决你的问题,请参考以下文章

自己写的程序有必要用单例吗

servlet 是单例吗? [复制]

面试官,你的单例模式能保证百分之百单例吗?

我应该使用单例吗?

注入 Guice 的 DAO 应该是单例吗?

moment.js 是单例吗?