单例模式
单例模式最重要的一点是:构造方法私有化。所以,我认为 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 是个单例