开篇

前面已经讲到了:

Dubbo SPI 的使用方法(一)- 扩展点自动包装

Dubbo SPI 使用方法(二)- 扩展点自适应

本文来讲下 Dubbo SPI - 扩展点自动装配, 即 Dubbo 实现的 IOC , 用一段简单代码来解释下:

当实例化 A 时, 发现 A 依赖了 B, 并且有对应的 set 注入方法, 那么 Dubbo 就会顺便把 B 也实例化, 并注入到 A 对象中.

public class A {
    
    private B b;
    
    public void setB(B b) {
        this.b = b;
    }
    
}

正文

1. 概念

上面简单的介绍了 IOC, 那么接下来看看 Dubbo SPI - 扩展点自动装配是如何做的.

引用官网的一段介绍

加载扩展点时,自动注入依赖的扩展点。

加载扩展点时,扩展点实现类的成员如果为其它扩展点类型,ExtensionLoader 在会自动注入依赖的扩展点。

ExtensionLoader 通过扫描扩展点实现类的所有 setter 方法来判定其成员。即 ExtensionLoader 会执行扩展点的拼装操作。

2. 使用

2.1 定义扩展接口

interface ServiceA {
    void sayA();
}

2.2 定义扩展接口实现类

// 实现类
public class ServiceAImpl implements ServiceA {
    
    private ServiceB serviceB;
    
    public void setB(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
    
    public void sayA() {
        System.out.println("service A")
        serviceB.sayB();
    }
}

// 需要注入的类
public class ServiceB {
    public void sayB(){
        System.out.println("service B")
    }
}

2.3 MATA-INF/dubbo/com.nimo.spi.IA

serviceA=com.nimo.spi.ServiceAImpl

2.4 启动函数

ExtensionLoader<ServiceA> extensionLoader = 
            ExtensionLoader.getExtensionLoader(ServiceA.class);
ServiceA serviceA = extensionLoader.getExtension("serviceA");
serviceA.sayA();

2.5 运行结果

打印如下:

service A
service B

总结

Dubbo SPI - 扩展点自动装配(Dubbo IOC), 实现了类似 Spring IOC 的功能, 也就是在加载扩展实现类 (比如 ServiceA) 时, 如果检测到该类依赖了其他类 (ServiceB), Dubbo 就会把依赖类进行实例化, 并且通过 set 方法注入到该对象中(ServiceA).


nimo10050
0 声望0 粉丝

猥琐发育的后端菜鸟