摘要:为了实现在模块装配的时候,不在模块里写死代码,就需要一种服务发现机制。就提供了这样一种机制为某个接口寻找服务实现,有点类似思想,将装配的控制权移到代码之外。即接口文件的全类名。五示例遵循上述第一条第点,这里为接口文件,其中和为两个实现类。
一、Dubbo内核
Dubbo内核主要包含SPI、AOP、IOC、Compiler。
二、JDK的SPI1.spi的设计目标:
面向对象的设计里,模块之间是基于接口编程,模块质检不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可插拔的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候,不在模块里写死代码,就需要一种服务发现机制。Java SPI就提供了这样一种机制:为某个接口寻找服务实现,有点类似IOC思想,将装配的控制权移到代码之外。
2.JDK的SPI的默认约定
当服务的提供者提供了一个接口的多种实现时,一般会在jar包的META-INF/services目录下,创建该接口的同名文件,文件的内容就是该服务接口的具体实现类的全类名。
三、Dubbo为什么不采用JDK的SPIJDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时。但如果没用上也加载,会很浪费资源。针对这个问题,Dubbo增加了对扩展点IoC和AOP的支持,一个扩展点可以直接setter注入其它扩展点。
四、Dubbo SPI的默认约定1.spi 文件存储路径在META-INFdubbointernal 目录下并且文件名为接口的全路径名。即接口文件的全类名。
2.每个spi 文件里面的格式定义为: 扩展名=具体的类名,例如 dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtoco。使用时通过key加载(如dubbo),可以实现部分加载。
五、SPI示例
遵循上述第一条第2点,这里Command为接口文件,其中StartCommand和ShutdownCommand为两个实现类。需要在resources目录下建META-INF子目录,在META-INF下建services目录,然后以接口全路径作为文件名创建文件,内容为接口实现类的全类型名。
Command.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public interface Command { void execute(); }
StartCommand.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public class StartCommand implements Command { @Override public void execute() { System.out.println("start command."); } }
ShutdownCommand.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public class ShutdownCommand implements Command { @Override public void execute() { System.out.println("ShutdownCommand"); } }
Main类:
package com.dongqiang.soa.spi; import java.util.ServiceLoader; /** * Created by qiangdong on 2018/2/2. */ public class Main { public static void main(String[] args) { ServiceLoaderserviceLoader = ServiceLoader.load(Command.class); for (Command command : serviceLoader) { command.execute(); } } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68501.html
摘要:今天我想聊聊的另一个很棒的特性就是它的可扩展性。的扩展机制在的官网上,描述自己是一个高性能的框架。接下来的章节中我们会慢慢揭开扩展机制的神秘面纱。扩展扩展点的实现类。的定义在配置文件中可以看到文件中定义了个的扩展实现。 摘要: 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 Dubbo的扩展机制 在Dub...
摘要:二注解该注解为了保证在内部调用具体实现的时候不是硬编码来指定引用哪个实现,也就是为了适配一个接口的多种实现,这样做符合模块接口设计的可插拔原则,也增加了整个框架的灵活性,该注解也实现了扩展点自动装配的特性。 Dubbo扩展机制SPI 前一篇文章《dubbo源码解析(一)Hello,Dubbo》是对dubbo整个项目大体的介绍,而从这篇文章开始,我将会从源码来解读dubbo再各个模块的实...
摘要:要构建自适应实例,先要有自适应的实现类,实现类有两种方式一种通过配置文件,一种是通过是字节码的方式动态生成。 SPI机制 SPI,即(service provider interface)机制,有很多组件的实现,如日志、数据库访问等都是采用这样的方式,一般通用组件为了提升可扩展性,基于接口编程,将操作接口形成标准规范,但是可以开放多种扩展实现,这种做法也符合开闭设计原则,使组件具有可插...
摘要:在中配置,以配置为例整个,最先使用的地方从里面读取这个配置使用接口的中获取具体的实现类中有两个值当主线程被外部终止时,会触发,执行的与方法通知下面的锁操作,主线程正常走完代码,并最终停止。 spring是如何启动容器的 常见的一种在本地使用main方法启动spring的方法 public static void main(String[] args) throws Except...
阅读 5197·2021-10-15 09:42
阅读 1605·2021-09-22 16:05
阅读 3260·2021-09-22 15:57
阅读 3395·2019-12-27 12:06
阅读 966·2019-08-29 15:16
阅读 2879·2019-08-26 12:24
阅读 379·2019-08-26 12:02
阅读 1884·2019-08-23 16:00