Java过滤器单例模式

9

我正在实现一个Java企业应用程序,并为每个请求声明了一个过滤器,那么服务器如何跟踪这个请求呢?它会为每个请求创建一个新的过滤器对象吗?还是只有一个过滤器处理所有请求,换句话说,Java Web过滤器是单例的吗?


我不确定,但是init()和destroy()只会被调用一次,但对于每个请求,它都必须通过doFilter进行处理...这种行为与servlet的init、destroy或service方法相同。 - AurA
相关链接:https://dev59.com/GnA75IYBdhLWcg3wy8Qi - BalusC
2个回答

19

首先,让我们复习一下单例模式的定义(重点在于“限制一个类只能实例化一个对象”)。

在软件工程中,单例模式是一种设计模式,它限制一个类只能实例化一个对象

当你声明一个实现了Filter接口的类时,它需要一个公共构造函数(通常是默认构造函数),以便应用服务器可以实例化它。因此,这样做的话,Filter不是单例。

请注意,应用服务器将维护每个应用程序上下文的单个实例,例如每个部署的Web应用程序,但这并不等同于拥有单例。为什么?因为你或另一个程序员可能会疏忽地创建此类的实例(即使它不使用该实例)。


5
不是单例,但从实质上等同于CDI中的"@ApplicationScoped"。 - Jonathan S. Fisher

3
答案取决于你在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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接