服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

揭秘 TheRouter:解锁跨模块依赖注入的奥秘

日期: 来源:JsonChao收集编辑:徐宜生

这是 JsonChao 的第 346 期分享


本文作者——张涛(货拉拉)

TheRouter用于跨模块通信设计的ServiceProvider,核心设计思想是参考了SOA(面向服务架构)的设计方式。

具体到 Android 侧就是 AIDL 类似的实现。

模块化能力支持项:

  • 支持跨模块依赖注入
  • 支持自定义注入项的创建规则,依赖注入可自定义参数
  • 支持自定义服务拦截,单模块mock调试
  • 支持注入对象缓存,多次注入 只会new一次对象

1.0 依赖注入

用于跨模块通信使用,核心设计思想是参考了SOA(面向服务架构) 的设计方式。具体到 Android 侧就是 AIDL 类似的实现:
例如当前有两个模块:A订单模块、B登录模块,下单需要获取用户信息。
这个业务场景就是,A需要使用获取用户信息的服务,B需要向外提供一个获取用户信息的服务。

1.1 声明接口服务

首先声明一个接口,放入公共依赖层

// 假设当前有一个用户信息获取服务
public interface IUserService {
    String getUserInfo();
}

1.2 服务使用方

也就是上面例子的 A订单模块,他需要使用获取用户信息的服务 A无需关心,IUserService这个接口服务是谁提供的,他只需要知道自己需要使用这样的一个服务就行了。
「注」:如果没有提供服务的提供方,TheRouter.get()可能返回null

TheRouter.get(IUserService::class.java)?.getUserInfo()

1.3 服务提供方

服务提供方需要声明一个提供服务的方法,用@ServiceProvider注解标记。

  • 如果是 java,必须是 public static 修饰
  • 如果是 kotlin,建议写成 top level 的函数
  • 方法名不限
/**
 * 方法名不限定,任意名字都行
 * 返回值必须是服务接口名,如果是实现了服务的子类,需要加上returnType限定(例如下面代码)
 * 方法必须加上 public static 修饰,否则编译期就会报错
 */
@ServiceProvider
public static IUserService test() {
    return new IUserService() {
        @Override
        public String getUserInfo() {
            return "返回用户信息";
        }
    };
}

// 也可以直接返回对象,然后标注这个方法的服名是什么
@ServiceProvider(returnType = IUserService.class)
public static UserServiceImpl test() {
    xxx
}

2.0 自定义服务拦截器

「使用场景」:单模块调试时,可能会有需要 mock 其他模块提供的服务,TheRouter 允许自定义其他模块的实现。

Interceptor interceptor = new Interceptor() {
    @Override
    public <T> T interception(Class<T> clazz, Object... params) {
        if (clazz == IUserService.class) {
            return new IUserService();
        }
        return null;
    }
};
TheRouter.getRouterInject().addInterceptor(interceptor);

3.0 服务缓存

服务提供方运行对提供的服务做配置,对于无状态的服务,尽可能使用缓存方式减少对象创建次数,而有状态的服务,则每次创建新对象保证多次调用不会互相污染状态(例如订单状态管理、商品销售状态等服务)。

声明服务缓存只需要在 @ServiceProvider的方法上新增额外注解即可,例如下面示例代码:

  • 「Singleton」 表示这个对象会被永久缓存,对外部调用方而言相当于这个对象声明成了单例
  • 「NewInstance」 表示每次都会返回新对象

「注」:如果两个注解同时被添加,则只有Singleton会生效。


// 注:如果都不加,默认是LRU+软引用缓存
// 如果两个注解同时被添加,则只有Singleton会生效。
@Singleton // 对外部调用方而言相当于这个对象声明成了单例
@NewInstance  // 每次都会返回新对象
public interface IUserService {
    public String getUserInfo();
}


@ServiceProvider
public static IUserService test() {
    return new IUserService() {
        @Override
        public String getUserInfo() {
            return "返回用户信息";
        }
    };
}



END



往期推荐



为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?

【尊享版】聊聊如何建立深度工作的模式

说回 TheRouter

炫酷!从未见过如此 Q 弹的 Swicher

【尊享版】聊聊职场中最重要的两个核心能力


点击下方卡片关注 JsonChao,为你构建一套

大厂青睐的 T 型人才系统



▲ 点击上方卡片关注 JsonChao,构建一套

大厂青睐的 T 型人才知识体系

欢迎把文章分享到朋友圈


很感谢您阅读这篇文章,希望您能将它分享给您的朋友或技术群,这对我意义重大。

你若喜欢,为 JsonChao 点个哦 

相关阅读

  • TikTok二面:聊聊二维码扫码登录的原理

  • 在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导
  • 可以有,给你的App添加自定义表情!

  • 安卓进阶涨薪训练营,让一部分人先进大厂大家好,我是皇叔,最近开了一个安卓进阶涨薪训练营,可以帮助大家突破技术&职场瓶颈,从而度过难关,进入心仪的公司。详情见文章:没错!皇叔开了
  • 泰山游客爆满!从山脚堵到山顶

  • 3月25日是泰山免门票开放的最后一个周末,吸引了全国各地的游客前来,据报道,景区游客爆满,内部人挤人,工作人员高喊“两棵松树之间往回走”。从现场拍摄的视频看,游客们可谓是摩肩
  • 西域健康丨甲流来袭,这些预防对策要牢记!

  • 近期,全国多个省市流感疫情呈现明显上升趋势,根据国家疾控中心报告,流感活动水平上升主要是由甲型流感病毒中的甲型H1N1亚型所致(摘自2023年3月8日中国疾病预防控制中心发布信
  • “市局的”掏手铐威胁他人?当地回应

  • 近日,有网友发文称,河北保定一男子在路上与人发生冲突后,自称“是市局的人”,还掏出一副手铐威胁对方。25日,保定晚报发文称,警方回应该人系某平台网约车司机,非公职人员,已被公安
  • 课程合集

  • ✔️更新完毕的课程1.《AKShare-初阶-使用教学(第一期) 》-1小时上手AKShare快速搭建起使用环境并成功获取数据。无论是否有 Python 编程经验,通过学习该视频课程,都可以快速上手
  • AKShare-基金数据-香港基金净值及分红配送

  • 作者寄语本次更新香港基金净值及分红配送接口。该接口主要包括 历史净值明细,分红送配详情 等指标的历史数据。相关视频教程已经发布:《AKShare-初阶-使用教学》、《AKShare-
  • 利用Python实现B站自动签到

  • 利用python实现B站自动签到,快速提高你的等级。签到内容包括,登录签到、
    视频观看、5次投币(需消耗5个币)、分享视频(不会发在个人空间动态里)。使用1、浏览器登入哔哩网站2、F12

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • TMT凶猛,该出点货了

  • —— 前言 ——最近伴随着人工智能相关的上涨,TMT也凶猛起来了,上周五成交金额最大的股票中,几乎都是TMT或类TMT股票。当下该板块的交易已开始拥挤,已经直逼2021年的新能源。
  • 揭秘 TheRouter:解锁跨模块依赖注入的奥秘

  • 这是 JsonChao 的第 346 期分享本文作者——张涛(货拉拉)TheRouter用于跨模块通信设计的ServiceProvider,核心设计思想是参考了SOA(面向服务架构)的设计方式。具体到 Android
  • GPT4暂时救不了我的狗屁工作

  • 本文授权转载自公众号:20社作者 | 罗立璇 王晓玲“ GPT 会不会干掉我们这个职业?不知道啊,不过可能会先干掉百度。”在听到我们的问题后,一位朋友开玩笑。可以说,从机器出现开
  • 『加拿大』《龙马精神》超前点映招募

  • 由成龙主演的电影《龙马精神》将于4月7日在北美与中国同步上映,在此为加拿大地区的影迷提供一个超前免费观影的机会!名额有限,观影后需反馈FB、IG、小红书等平台的短评(任选其一
  • 『北京』2023英国电影展

  • 英皇今年的英国电影展从北京站开启,片单以艺术家题材为主线,大部分是近年的作品,我个人推荐《最后的肖像》。现已开票