IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> TheRouter 的跨模块依赖注入实现原理 -> 正文阅读

[移动开发]TheRouter 的跨模块依赖注入实现原理

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

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


模块化能力支持项: ?

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

### 1.0 依赖注入

用于跨模块通信使用,核心设计思想是参考了[SOA(面向服务架构)](https://baike.baidu.com/item/%E9%9D%A2%E5%90%91%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84/8258990) 的设计方式。
具体到 Android 侧就是 AIDL 类似的实现: ?
例如当前有两个模块:A订单模块、B登录模块,下单需要获取用户信息。 ?
这个业务场景就是,A需要使用获取用户信息的服务,B需要向外提供一个获取用户信息的服务。 ?

?

?

#### 1.1 声明接口服务

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

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

#### 1.2 服务使用方 ?

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

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

#### 1.3 服务提供方 ?

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

- 如果是 java,必须是 public static 修饰
- 如果是 kotlin,建议写成 top level 的函数
- 方法名不限 ?

```java
/**
?* 方法名不限定,任意名字都行
?* 返回值必须是服务接口名,如果是实现了服务的子类,需要加上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 允许自定义其他模块的实现。 ??

```java
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`会生效。* ?

```java

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


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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:09:06  更:2022-10-31 12:12:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:40:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码