WMRouter源码分析(3)-路由节点的动态加载

本文深入分析了WMRouter框架中ServiceLoader的使用,包括WMRouterPlugin的作用,ServiceInit_xx类的生成以及UriAnnotationInit_xx1.init的调用时机。文章揭示了框架如何在运行时动态加载接口实现,实现跨模块的路由节点注册。同时,介绍了@RouterService简化SPI机制的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章我们了解到:框架会在编译时动态扫描@RouterUri注解并生成注册UriHandlUriAnnotationHandler中的代码。那这些代码在运行时如何调用呢?

先了解一下ServiceLoader这个概念。WMRouter中的ServiceLoader类似于java spi

ServiceLoader

它的基本功能是:

  1. 保存接口与实现类的对应关系。 这个关系是一对多。
  2. 可以实例化一个实现类,返回给调用方使用。

那在WMRouter中,SerciceLoader保存的接口与实现类的关系是哪些呢? 我们看一下ServiceLoader的初始化方法:

    void doInit() {
       Class.forName(“com.sankuai.waimai.router.generated.ServiceLoaderInit”).getMethod("init").invoke(null);
    }

即初始化的时候反射调用了ServiceLoaderInit.init()方法。我全局搜索了一下这个类并没有发现它的声明。
最后发现这个类是使用Gradle Transform APIams库动态生成的。

接下来我们就来研究一下这个类是怎么生成的,先来看一下WMRouter的gradle transform插件是如何生成ServiceLoaderInit这个类的。

WMRouterPlugin

官方是这样描述它的作用的 : 将注解生成器生成的初始化类汇总到ServiceLoader.init,运行时直接调用ServiceLoader.init。 从而完成SerciceLoader的初始化。

这里我大致描述一下这个插件的工作逻辑:

  1. 扫描编译生成的class文件夹或者jar包的指定目录 : com/sankuai/waimai/router/generated/service, 收集目录下的类并保存起来 (这个类其实就是ServiceInit_xxx1这种类)
  2. 使用asm生成ServiceLoaderInit类class文件,这个class文件调用前面扫描到的类的init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值