首页 > 其他 > 详细

dubbo 代理和自动注入原理

时间:2020-02-04 11:42:34      阅读:101      评论:0      收藏:0      [点我收藏+]

示例接口如下:

@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;
    }
}

 

dubbo 代理和自动注入原理

原文:https://www.cnblogs.com/zzq-include/p/12258574.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!