示例接口如下:
@SPI public interface BallInterface { @Adaptive("ball") String getBall(URL url); }
dubbo的代理有两种情况:
(1)基于构造函数的静态代理(通过简单的包装对象进行操作)
public class ConstructBallInterface implements BallInterface { private BallInterface ballInterface; //通过构造函数进行代理 public ConstructBallInterface(BallInterface ballInterface) { this.ballInterface = ballInterface; } @Override public String getBall(URL url) { System.out.println("start"); String bbb = ballInterface.getBall(url); System.out.println("end"); return bbb; } }
(2)动态代理有两种方式:
(2-1)通过@Adaptive注解的动态代理
@Adaptive//这个注解很关键,如果有了这个注解并实现接口,就不会动态生成代理类型load进行来 public class AnnotationBallInterface implements BallInterface { @Override public String getBall(URL url) { System.out.println("start"); return "1"; } }
(2-2)通过AdaptiveClassCodeGenerator的字节码生成动态代理
在生成动态代理类的过程中,我们看下dubbo的自动注入机制,dubbo的自动注入机制是通过两个关键点:
1.判断是否有set方法
2.判断set方法参数是否为标记了@SPI注解
获取接口实现类:
BallInterface red = service.getExtension("red");
调用injectExtension方法,在这里通过AdaptiveExtensionFactory类的getExtension获取扩展,这里使用了我们上文提到了的基于注解的代理方式。
@Adaptive public class AdaptiveExtensionFactory implements ExtensionFactory { private final List<ExtensionFactory> factories; public AdaptiveExtensionFactory() { ExtensionLoader<ExtensionFactory> loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class); List<ExtensionFactory> list = new ArrayList<ExtensionFactory>(); for (String name : loader.getSupportedExtensions()) { list.add(loader.getExtension(name)); } factories = Collections.unmodifiableList(list); } @Override public <T> T getExtension(Class<T> type, String name) { for (ExtensionFactory factory : factories) { T extension = factory.getExtension(type, name); if (extension != null) { return extension; } } return null; } }
在这里间接获取的ExtensionFactory的SPI实现类是SpiExtensionFactory,而getAdaptiveExtension方法中就是获取动态代理对象
public class SpiExtensionFactory implements ExtensionFactory { @Override public <T> T getExtension(Class<T> type, String name) { if (type.isInterface() && type.isAnnotationPresent(SPI.class)) { ExtensionLoader<T> loader = ExtensionLoader.getExtensionLoader(type); if (!loader.getSupportedExtensions().isEmpty()) { return loader.getAdaptiveExtension(); } } return null; } }
原文:https://www.cnblogs.com/zzq-include/p/12258574.html