为什么需要依赖注入 - Xiasm/EasyRouter GitHub Wiki
上节我们讲过了如何实现路由的跳转,接下来要为大家讲解一下如何实现依赖注入。
做过后台的同学都知道Spring有一大利器依赖注入(简称DI),什么是依赖注入呢?
举个例子,假如我们的Presenter层需要用网络的数据或数据库的数据,但presenter本身没有请求网络的功能,那么它要依赖model层去请求网络,所以它就需要持有model层的一个实例,我们可以直接通过new的方式去创建,但是这样会使代码耦合严重,那么我们就可以通过一些解耦的手段去让presenter层持有model的引用,比如通过构造方法注入、set方法注入、配置文件注入、注解注入等等,只要达到我们的目的就是好的。
大家可能会想到,这与我们路由框架有什么关系?诚然,路由的目的就是要实现跳转,但是你有没有想过,两个Activity之间的跳转肯定免不了要传入一些参数,如果我们在跳转后还要通过intent去获取参数,这样岂不是很麻烦,如果可以自动把参数赋给属性多好啊!
如果这个例子不足以说服你,再想一下,组件化中两个module之间可能有一些功能并不需要跳转页面,如支付模块要获取用户模块的用户id,并不需要跳转页面,那么我们就要持有用户模块含有获取用户id功能的类的引用,如果我们在支付模块创建一个用户模块的功能引用,显然就违背了解耦的规则。
这两个问题显然用依赖注入的方式会更好些,如果你用过ARouter,你会发现ARouter中的服务(IProvider)就是通过依赖注入实现的。
在多组件并行开发过程中,因为两个module没有引用关系,所以就不能通过构造方法传入要依赖的类,这个时候怎么办呢?连对方的引用都得不到,如何进行依赖呢?可能你会想到反射,我们先pass这个方案,能不用反射就能做好的前提下,我们最好不要用反射。可能有同学会想到,在基类下沉一个接口功能标准,如上面第二个例子中,我们在base模块定义获取用户id的接口,然后在用户模块实现接口的方法。那么当支付模块需要用到这个功能,就声明这个接口,然后一行注解通过框架为你创建实例,这样用户模块只需要提供功能,并不需要关心谁在用这个功能,这样岂不是大大减小了耦合。
为什么要用注解实现依赖注入,因为我们用了apt啊,那岂不是天生实现依赖注入的利器。如果你去写配置文件或构造方法等等,未免太复杂。最主要的,看着牛逼。