美文网首页
设计模式-代理模式之管中窥豹

设计模式-代理模式之管中窥豹

作者: 喝不醉的Solace | 来源:发表于2020-11-19 12:22 被阅读0次

    代理模式

    从Dubbo-SPI说开去

    在dubbo暴露服务时,ServiceConfig中有这样一行代码

    //
    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
    

    代码大义:即通过SPI机制动态加载Protocol实现类,然后获取自适应实例;

        private Class<?> createAdaptiveExtensionClass() {
            String code = createAdaptiveExtensionClassCode();
            ClassLoader classLoader = findClassLoader();
            com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
            return compiler.compile(code, classLoader);
        }
    

    在构造动态适配类之前,会先扫描META-INF/services/,META-INF/dubbo目录下的service实现类,利用反射机制

    • 构造实例,set注入
    • 构造函数注入
      然后,构造java代码,大致逻辑为,根据URL参数,获取具体要执行的实现类名,然后也是通过调用ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("name")获取实现类;
      代码构造完成后,通过javassist编译java代码,动态加载class类

    动态代理

    • 通过上面的例子,我们可以大致清楚下面几件事
      • 在调用方,我们无需关注具体的类实现
      • 代理类动态给我们提供不同的实现,我们只需按需传参即可

    思考

    在扩展性层面,代理模式带给我们更多可能,我们新增实现,在调用方无感知的情况下,通过动态调整调用参数,即可完成多元化的需求.同时我们也需要去思考,如何去根据不同场景,抽象出一个好的代理接口.

    相关文章

      网友评论

          本文标题:设计模式-代理模式之管中窥豹

          本文链接:https://www.haomeiwen.com/subject/yyskiktx.html