在SpringCloud Gateway中有两个不同的过滤器接口,分别是GatewayFilter和GlobalFilter。
在源码中可以看到,两个不同类型的接口,且在没有实现一个公共接口的前提下,能放到同一个combined集合中。这里使用的就是一个适配器模式。
用一个简单的demo记录下对应适配器模式的写法。
更多源码细节,参考gateway源码中的类:org.springframework.cloud.gateway.handler.FilteringWebHandler
public interface GlobalFilter {void filter();
}class GlobalFilter1 implements GlobalFilter{@Overridepublic void filter() {System.out.println("GlobalFilter1");}
}
class GlobalFilter2 implements GlobalFilter{@Overridepublic void filter() {System.out.println("GlobalFilter2");}
}
public interface GatewayFilter {void filter();
}class GatewayFilter1 implements GatewayFilter{@Overridepublic void filter() {System.out.println("GatewayFilter1");}
}class GatewayFilter2 implements GatewayFilter{@Overridepublic void filter() {System.out.println("GatewayFilter2");}
}class GatewayFilter3 implements GatewayFilter{@Overridepublic void filter() {System.out.println("GatewayFilter3");}
}
将GatewayFilter适配成GlobalFilter
public class GlobalFilterAdapter implements GlobalFilter{private GatewayFilter delegate;@Overridepublic void filter() {delegate.filter();}// 待适配的接口作为参数,外部统一调用GlobalFilter的filter方法。// 但是适配之后的接口,则是通过delegate属性调用真实的GatewayFilter的方法public GlobalFilterAdapter(GatewayFilter delegate) {this.delegate = delegate;}
}
public class Test {public static void main(String[] args) {List gatewayFilterList = new ArrayList<>();gatewayFilterList.add(new GatewayFilter1());gatewayFilterList.add(new GatewayFilter2());gatewayFilterList.add(new GatewayFilter3());// 全部的需要执行的数据List globalFilters = new ArrayList<>();globalFilters.add(new GlobalFilter1());globalFilters.add(new GlobalFilter2());List globalFilterAdapters = gatewayFilterList.stream().map(GlobalFilterAdapter::new).collect(Collectors.toList());globalFilters.addAll(globalFilterAdapters);// 调用list中所有的过滤方法for (GlobalFilter globalFilter : globalFilters) {globalFilter.filter();}}
}