[Alibaba-ARouter] 新版本解读与控制反转在移动端的应用

ARouter近期迎来了第一次大版本更新,完整提供了依赖注入、依赖查找两种控制反转(IOC)思想的实现,支持对Intent参数与自定义服务的自动装配

如果还没有了解过ARouter,可以参考上一篇:[Alibaba-ARouter] 简单好用的Android页面路由框架

前言

如果接触过服务端开发,肯定用到Spring这个框架,而Spring框架提供的能力中较为常见的就是控制反转(DI)与面向切面编程(AOP)的支持,这两种思想的引入,大大减轻了开发工作量,给程序员带来了便利的同时,也解决了业务代码与逻辑的耦合等问题。而这两种思想在移动端也有较多的运用,比方说Dagger2框架,就是一款较为常用的依赖注入框架

先说说控制反转

控制反转是一种思想,而依赖注入和依赖查找则是针对这种思想的实践,依赖注入机制降低了组件之间的依赖关系,同时也大大提高了组件的可复用性,在ARouter的应用中,把本来由用户控制的参数与服务的赋值,移交给了框架,对参数与服务赋值的控制进行了反转,从而解决了业务代码直接依赖服务实现的问题,如果没有这方面知识的积累,仅仅通过文字解释比较晦涩,请看下面部分的代码(通过控制反转的思想对业务代码进行解耦)

// 这部分是没有经过控制反转的逻辑

import xxxxxxx  // 依赖了N多个乱七八糟的库
import xxxxxxx
public class Hello {
    public static void sayHello() {
        // ... 执行了100行各种业务逻辑
       
    }
}

public class Business {
    public static void main(String[]args) {
        Hello hello = new Hello(); 
         // 这里的hello实例是由用户new的,所以控制权还在用户手中,
        // 但是用户需要自己去new各种各样的功能组件,需要用户自己
        // 来管理hello的生命周期,这时就带来了单例、销毁等,各种问题
        hello.sayHello();
    }
}

我们稍稍对过程进行改写,完成Hello中复杂的业务实现与Business类的解耦(通过依赖查找)

public interface HelloService extends IProvider {
    void sayHello();
}

@Route(path = "/service/hello")
public class Hello implements HelloService {
    public static void sayHello() {
        // ... 执行了100行各种业务逻辑
       
    }
}

public class Business {
    public static void main(String[]args) {
        HelloService hello = ARouter.getInstance().navigation(HelloService.class);
        // 这种情况下,就实现了Business和Hello的解耦,通过接口来调用,由ARouter来连接接口与实现,hello实例原本由用户来控制创建,变成了ARouter来管理,实现了控制的反转,这种控制反转的实践就是 依赖查找,虽然由框架来创建,但是还是用户来找到这个类的实例,在1.0.4版本中已经支持这种用法
        hello.sayHello();
    }
}

下面我们看看最新版本中ARouter对控制反转的支持(通过依赖注入)

// 和之前唯一的不同,就是在使用上的区别,这时候我们仅仅修改Buiness类即可
public class Business {
    @Autowired
    HelloService helloService;
    public static void main(String[]args) {
        ARouter.getInstance().inject(this);    // 用来关联框架与this,可以通过基类的其他形式
   
         // 这种情况下,在用户面来看,就是控制反转的另一种实现,
         // 依赖注入,用户只需要声明该字段,并使用注解标注,在
         // 运行期间,ARouter会自动给该字段赋值,用户不需要去给
         // 该字段赋值,也不需要去查找该字段的值,直接使用即可,
         // HelloService的具体实现类会在运行期由ARouter框架来指
         // 定并赋值,是不是变得更简单更方便了
        hello.sayHello(); 
    }
}

新版本更新

ARouter日前发布了1.0.5版本,在原有的路由功能基础上,完善了对Intent参数与自定义服务的自动装配,目前通过URL直接导航到具体Native页面之后,URL中带有参数可以自动注入到目标页面的对应字段中,自定义Service同样支持,一般情况下,使用自定义服务的时候,只需要声明该字段,并使用 @Autowired注解标注,即可直接使用该字段,解放双手

// 目前支持的几种标注方式

// 1. 自定义服务
@Autowired
HelloService helloService;  // 标准的标注,默认进行byType服务查找

@Autowired(required = true)
HelloService helloService;  // 指定required为true之后,运行中该值获取不到的时候会触发Crash,方便开发中调试

@Autowired(name = "/service/hello")
HelloService helloService;  // 指定name的sevice,会按照byName的方式进行服务查找,适用于同一个接口有多种实现的情况

// 2. intent 字段
// https://m.aliyun.com/test/activity1?name=老王&age=23&boy=true&high=180
// 对应参数的值会自动注入到对应属性之中,无需getIntent().getXxxx(),支持Fragment中使用
@Autowired
String name;

@Autowired
int age;

@Autowired(name = "boy")
boolean girl;

private long high;

@Autowired
String url;

后记

技术选型,比较重要的就是是否足够稳定、健壮、长期有人维护,目前ARouter提供了针对页面路由,App组件化,依赖注入等相关功能的一站式解决方案,一个SDK解决以上诸多问题,欢迎选用。

ARouter Github地址,欢迎Star与MR,大家共建

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 被色彩折服,为摄影而生,华为mate9。 自从夜景拍得这两张照片后,我就念念不忘的想拍夜景。今天科目二考试死里逃生...
    枫林上学阅读 409评论 0 0
  • 屋檐春雨几缕,小湖寂寞涟漪。 垂柳可解心意,伊人倚窗不语。 点点星辰日月,悠悠千载圆缺。 ...
    冰川映彩虹阅读 139评论 0 0