甜腻的嘴角|Dubbo如何通过SPI提高框架的可扩展性?( 四 )


如果想用JdkCompiler需要做如下配置
Compiler类图如下
甜腻的嘴角|Dubbo如何通过SPI提高框架的可扩展性?@SPI("javassist")public interface Compiler {Class compile(String code, ClassLoader classLoader);}Compiler用@SPI指定了默认实现类为javassist
源码中获取Compiler调用了如下方法
org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();getAdaptiveExtension()会获取自适应扩展类 , 那么这个自适应扩展类是谁呢?
是AdaptiveCompiler , 因为类上有@Adaptive注解
@Adaptivepublic class AdaptiveCompiler implements Compiler {private static volatile String DEFAULT_COMPILER;public static void setDefaultCompiler(String compiler) {DEFAULT_COMPILER = compiler;}/*** 获取对应的Compiler , 并调用compile做编译* 用户设置了compiler , 就用设置了的 , 不然就用默认的*/@Overridepublic Class compile(String code, ClassLoader classLoader) {Compiler compiler;ExtensionLoader loader = ExtensionLoader.getExtensionLoader(Compiler.class);String name = DEFAULT_COMPILER; // copy referenceif (name != null} else {// 用默认的compiler = loader.getDefaultExtension();}return compiler.compile(code, classLoader);}}从compile方法可以看到 , 如果用户设置了编译方式 , 则用用户设置的 , 如果没有设置则用默认的 , 即JavassistCompiler
自动激活使用@Activate注解 , 可以标记对应的扩展点默认被激活使用
@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface Activate {// 所属组 , 例如消费端 , 服务端String[] group() default {};// URL中包含属性名为value的键值对 , 过滤器才处于激活状态String[] value() default {};// 指定执行顺序 , before指定的过滤器在该过滤器之前执行@DeprecatedString[] before() default {};// 指定执行顺序 , after指定的过滤器在该过滤器之后执行@DeprecatedString[] after() default {};// 指定执行顺序 , 值越小 , 越先执行int order() default 0;}可以通过指定group或者value , 在不同条件下获取自动激活的扩展点 。 before , after , order是用来排序的 , 感觉一个order参数就可以搞定排序的功能 , 所以官方把before , after标记为@Deprecated
Dubbo Filter就是基于这个来实现的 。 Dubbo Filter是Dubbo可扩展性的一个体现 , 可以在调用过程中对请求进行进行增强
我写个demo演示一下这个自动激活是怎么工作的
@SPIpublic interface MyFilter {void filter();}consumer组能激活这个filter
@Activate(group = {"consumer"})public class MyConsumerFilter implements MyFilter {@Overridepublic void filter() {}}provider组能激活这个filter
@Activate(group = {"provider"})public class MyProviderFilter implements MyFilter {@Overridepublic void filter() {}}consumer组和provide组都能激活这个filter
@Activate(group = {"consumer", "provider"})public class MyLogFilter implements MyFilter {@Overridepublic void filter() {}}


推荐阅读