单例模式 之 Zuul FilterProcessor类

单例模式

单例模式最重要的一点是:构造方法私有化。所以,我认为 FilterProcessor类并非严格的单例模式。

public class FilterProcessor {

    static FilterProcessor INSTANCE = new FilterProcessor();

    private FilterUsageNotifier usageNotifier;

    public FilterProcessor() {
        usageNotifier = new BasicFilterUsageNotifier();
    }

    public static FilterProcessor getInstance() {
        return INSTANCE;
    }
	public static void setProcessor(FilterProcessor processor) {
        INSTANCE = processor;
    }
	//省略其他代码
}

通过 new FilterProcessor() 和 getInstance() 得到的对象 内存地址并不一样 但在 ZuulRunner 类中 都是通过 getInstance() 获取的

public class ZuulRunner {

    private boolean bufferRequests;
    
    public ZuulRunner() {
        this.bufferRequests = true;
    }

    public ZuulRunner(boolean bufferRequests) {
        this.bufferRequests = bufferRequests;
    }
    
    public void postRoute() throws ZuulException {
        FilterProcessor.getInstance().postRoute();
    }

    public void route() throws ZuulException {
        FilterProcessor.getInstance().route();
    }

    public void preRoute() throws ZuulException {
        FilterProcessor.getInstance().preRoute();
    }

    public void error() {
        FilterProcessor.getInstance().error();
    }
    //省略其他代码
}

自定义过滤器处理类

现在参与的项目 自定义了一个过滤器处理类 重写了四个过滤器的方法 因为 FilterProcessor 并非严格的单例模式 所以才可以继承 但是 当执行到ZuulRunner 类中 的 FilterProcessor.getInstance() 时 是如何获取的 子类呢?

public class GatewayFilterProcessor extends FilterProcessor {

	/**
	 * post过滤器
	 */
	public void postRoute() throws ZuulException {
	}

	/**
	 * error过滤器
	 */
	public void error() {
	}

	/**
	 * route过滤器
	 */
	public void route() throws ZuulException {
	}

	/**
	 * pre过滤器
	 */
	public void preRoute() throws ZuulException {
	}
	//省略部分代码
}

启动

@Configuration
public class GatewayFilterConfig {

	@Bean
	public GatewayFilterProcessor apiGatewayFilterProcessor(Map<String, GatewayFilter> filters) {
		GatewayFilterProcessor process = new GatewayFilterProcessor();
		FilterProcessor.setProcessor(process);
	}
	//省略其他代码
}

至此 疑惑全解
关于 getInstance() 获取子类这个问题 是卡在了单例模式 错误的认为 FilterProcessor 是个单例 严格单例因私有化的构造方法 是不会被继承的 陷进了这个怪圈 记录一下
BTW:很多帖子都说 FilterProcessor 是个单例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值