Dagger2原理及使用

小伙伴们,又到周一啦,收拾好心情,准备工作了吗?

今天跟大家一起来聊一聊Dagger2

Dagger2原理及使用

git地址:https://github.com/google/dagger

Dagger,起源于Square的Dagger,Dagger2是由谷歌接手开发;

它是一个完全在编译期间进行的依赖注入框架,完全去除了反射;

Dagger2通过依赖注入,让我们少写很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块;

说到依赖注入,很多小伙伴可能想到Bufferknife,那么他们之间的区别是什么呢?

Buffer knife目的为注入到view,所以能够在非activity里面注入,也能注入到inflate的views;

而Dagger能够注入到任何你想要的对象,只要其在module类中,或者它是构造器。但是缺少对方法和字段的注入支持;

Buffer knife只是避免样板代码,findViewById,仅此而已,所以不能算是一个真正的注入。只是一个view的代言。

Dagger2的优势:

1、全局对象实例的简单访问方式:

和ButterKnife 库定义了view,事件处理以及资源的引用一样,Dagger2 提供全局对象引用的简易访问方式。声明了单例的实例都可以使用@inject进行访问;

2、复杂的依赖关系只需要简单的配置

Dagger2 会通过依赖关系并且生成易懂易分析的代码。以前通过手写的大量模板代码中的对象引用将会由它给你创建并传递到相应对象中。因此你可以更多的关注模块中构建的内容而不是模块中的对象实例的创建顺序。

3、让单元测试和集成测试更加方便

因为依赖关系已经为我们独立出来,所以我们可以轻松的抽取出不同的模块进行测试。

4、作用域实例(Scoped instances)

我们不仅可以轻松的管理全局实例对象,也可以使用Dagger2中的scope定义不同的作用域

接下来,我们看看Dagger2的使用吧:

1、在app目录下的gradle文件中加入:
Dagger2原理及使用

2、创建类Test01:
Dagger2原理及使用

@Inject:注解标识,表明它需要提供依赖

3、新建Component标注的接口
Dagger2原理及使用

@Component:依赖注入的管理类,也是连接依赖(A类)与目标类(MainActivity类)的桥梁;

3、在以上两个步骤完成后,需要build一下工程,会自动生成接口的实现类,命名为DaggerXXX.class,其中XXX为你定义接口的名字:
Dagger2原理及使用

4、最后在MainActivity中使用:
Dagger2原理及使用

假如我们使用第三方库,不能修改源码,无法在构造方法中通过@Inject注解的方式提供依赖,这种情况下,我们该如何处理?

1、假如类名为Per的类为第三方库,不能修改源码
我们首先创建一个可以提供实例的类,类名如叫PerModule:
Dagger2原理及使用

@Module:通过此标注的类,可以另一种方式提供依赖

@Provide:通过此标注注解的方法,需要返回提供依赖的实例

2、把Module加入到Component中,即用@Component标注的接口中:
Dagger2原理及使用

3、在MainActivity中引用与上一种操作一致。

Dagger2确实达到了模块间的解耦,使用Dagger2可以将MVP中的V 层与P层进一步解耦,这样便可以提高代码的健壮性和可维护性;

Dagger2还有很多更加强大的用法......

不说了,我要去啃代码了;文中有误请留言指出,喜欢就动动手指关注我们哦!

Dagger2原理及使用

猜你喜欢

转载自blog.51cto.com/12512729/2144313