spi 动态加载、卸载_dubbo的spi机制分析和实战案例

文章来源:https://dwz.cn/b0UieE77作者:Java知音java里面提供了一种内置的服务提供和发现机制,可以通过配置让一个程序在运行的时候动态加载该类的具体实现。这样子我们可以在调用某个相应接口的时候,同时达到调用某些具体类的实现功能。具体的代码案例如下所示:首先定义一个接口和两个接口的实现类接口/** * @author idea * @date 2019/5/16 */pub...
摘要由CSDN通过智能技术生成

文章来源:https://dwz.cn/b0UieE77作者:Java知音

java里面提供了一种内置的服务提供和发现机制,可以通过配置让一个程序在运行的时候动态加载该类的具体实现。这样子我们可以在调用某个相应接口的时候,同时达到调用某些具体类的实现功能。

具体的代码案例如下所示:

首先定义一个接口和两个接口的实现类

接口

/** * @author idea * @date 2019/5/16 */public interface PersonAction { void say();}

接口实现类

62de04be4dd6aa5ae5419fe159c51d8d.png

然后我们需要在META-INF/services的文件夹底下配置一份文件:

(ps:这里的配置文件命名方式为类所在包名+类名)

1a5338ea2564be7394266beafaa61031.png

这份文件里面加入以下的配置信息:

(ps:文件里面输入的内容是表示类所在的地址全称,因为java的spi进行类加载的时候需要知道类所在的路径)

com.sise.dubbo.spi.SpiMainTestcom.sise.dubbo.spi.SpiSubTest

接着是编写测试类代码

dbf4b3d95502f50e3bc87fde4fd4b85d.png

当我们执行代码之后,会发现控制台输出了相应的内容:

this is java spithis is a SpiMainTestthis is a SpiSubTest

其实jdk自带的spi功能的实现原理分为了以下几步

1.首先通过java.util.ServiceLoader来加载META-INF/services/文件夹底下的类信息

2.在运行期间需要引用相关类的时候,对加载到内存的类进行搜索和分析,进行实例化调用。

为什么是META-INF/services该文件夹呢?

在ServiceLoader类里面,我们可以通过阅读源码看到它在加载配置的时候会指定默认的加载位置META-INF/services文件夹。

ServiceLoader会将该文件底下的配置类信息全部加载存储到内存中,然后在接口进行实例化的时候提供相应的实现类进行对象的实例化功能。这一点和ioc的思想有点类似,通过一个可插拔式的方式来对类的实例化进行控制。

8acae38c15ff5b2c950d5b10bc9863b3.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值