TheRouter 的跨模块依赖注入实现原理

Connor 比特币行情 2022-10-26 130 0

点击上方 蓝字关注我期货原理,知识会给你力量

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

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

具体到 Android 侧就是 AIDL 类似的实现期货原理

模块化能力支持项:

支持跨模块依赖注入

支持自定义注入项的创建规则期货原理,依赖注入可自定义参数

支持自定义服务拦截期货原理,单模块mock调试

支持注入对象缓存期货原理,多次注入 只会new一次对象

支持跨模块依赖注入

支持自定义注入项的创建规则期货原理,依赖注入可自定义参数

支持自定义服务拦截期货原理,单模块mock调试

支持注入对象缓存期货原理,多次注入 只会new一次对象

用于跨模块通信使用,核心设计思想是参考了SOA(面向服务架构) 的设计方式期货原理。具体到 Android 侧就是 AIDL 类似的实现:

例如当前有两个模块:A订单模块、B登录模块,下单需要获取用户信息期货原理

这个业务场景就是,A需要使用获取用户信息的服务,B需要向外提供一个获取用户信息的服务期货原理

1.1 声明接口服务

展开全文

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

// 假设当前有一个用户信息获取服务

publicinterfaceIUserService{

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 的函数

方法名不限

如果是 java期货原理,必须是 public static 修饰

如果是 kotlin期货原理,建议写成 top level 的函数

方法名不限

* 方法名不限定期货原理,任意名字都行

* 返回值必须是服务接口名期货原理,如果是实现了服务的子类,需要加上returnType限定(例如下面代码)

* 方法必须加上 public static 修饰期货原理,否则编译期就会报错

@ServiceProvider

publicstaticIUserService test{

returnnewIUserService {

@Override

publicString getUserInfo{

return"返回用户信息";

// 也可以直接返回对象期货原理,然后标注这个方法的服名是什么

@ServiceProvider(returnType = IUserService . class)

publicstaticUserServiceImpltest{

xxx

2.0 自定义服务拦截器

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

Interceptor interceptor = newInterceptor {

@Override

public<T> T interception(Class<T> clazz, Object... params){

if(clazz == IUserService . class) {

returnnewIUserService;

returnnull;

TheRouter.getRouterInject.addInterceptor(interceptor);

3.0 服务缓存

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

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

「Singleton」表示这个对象会被永久缓存期货原理,对外部调用方而言相当于这个对象声明成了单例

「NewInstance」表示每次都会返回新对象

「Singleton」表示这个对象会被永久缓存期货原理,对外部调用方而言相当于这个对象声明成了单例

「NewInstance」表示每次都会返回新对象

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

// 注:如果都不加期货原理,默认是LRU+软引用缓存

// 如果两个注解同时被添加,则只有Singleton会生效期货原理

@Singleton// 对外部调用方而言相当于这个对象声明成期货原理了单例

@NewInstance// 每次都会返回新对象

publicinterfaceIUserService{

publicString getUserInfo;

@ServiceProvider

publicstaticIUserService test{

returnnewIUserService {

@Override

publicString getUserInfo{

return"返回用户信息";

向大家推荐下期货原理我的网站 /点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

往期推荐

Android壁纸还是B站玩得花

说回 TheRouter

货拉拉 Android 模块化路由框架:TheRouter

Android-Widget重装上阵

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载期货原理

< END >

作者:徐宜生

更文不易期货原理,点个“三连”支持一下👇

评论