Dagger2

  • 1.为什么使用依赖注入

    • 1)其实依赖注入也是为了模块解耦,你会发现一切一切,不论是mvp还是dagger都是为了模块解耦。dagger和mvp结合起来还可以做到把m-v-p之间进一步解耦。所谓耦合就是两个模块联系在了一起,什么意思呢?比如一个模块A里面new了另一个模块B的对象,这时候就说两个模块耦合在了一起,如果现在B模块的构造函数做了修改,那么你还需要去修改模块A里面的代码。而我们希望的是B无论怎么修改都不会影响模块A。(联系mvp模式,无论m层怎么修改,都不会影响v层)而依赖注入可以用两种方法来解决:
      • •1.1)1.传递依赖对象,在构造函数的参数中,传递对象,面向接口编程。

        •1.2)注入依赖。(如dagger框架)
        其实这种解决办法就叫做控制反转(ioc)。把添加依赖的权利给外部,自己不去主动添加依赖关系,好像有人分不大清楚dagger和butterknife有啥区别。。其实区别很大,butterkinfe也是通过注解来实现依赖注入,不过他做的是view的依赖注入。而dagger做的是更高层次的模块之间的依赖注入。【权利外放,分流处理】
    • 2)优先使用方法二:注入器
      而使用注入器可以极大的减少代码量,模块之间的依赖关系也会很清晰。把注入器看作项目的一个模块(inject)专门负责把某些模块注入到他的依赖中去。当然说这些你可能还是不能体会到它的好处,多去写写,看看人家的项目代码才能慢慢体会。(比如我把所有的基础配置以及application的context全部提供在applicaion的module,然后直接把这个module注入到baseactivity或者application中去,然后其他的activity module再去继承这个application module。一行代码就去注入很多的依赖!)
  • 2.具体讲解dagger2

    • 2.1)dagger2就是现在一个比较火的依赖注入器框架。它使用的预编译期间生成代码完成依赖,而不是用的反射。。都知道反射对手机应用开发影响是比较大的。我学习这个框架就把它想成了一个注射器,component是针管,module是注射瓶,里面的依赖对象是注入的药水,build方法是插进患者,inject方法的调用是推动活塞。这样形象的理解还是很容易理解的!!
    • 2.2)dagger需要掌握的就是component, module, scope, provides, singleton.
    • 2.3)Module:是对应实例提供者的概念,当你需要自动把实例注入的时候,你写的是类名,那么这个对应类名的实例,就必须要有提供者,Module提供一个轻量级、可拆解的提供机制
    • 2.4)Component:是连接实例提供者和实例消费者的桥梁,它需要指定一个或多个Module,也可以继承一个已有的Component。
  • 3.对比dagger1

    • 3.1)Square设计的Dagger1,Google接手并且实现了Dagger2,
    • 3.2)Dagger 2最大的好处在于它完全不会和ProGuard冲突。连ButterKnife都要加几行规则,Dagger 2是一行规则都不用加。
  • 4.Demo

    讲解:首先定义一个Module,这里面的两个以provide开头的方法,便是提供类的实类,方法的注解需要有@Provides,这里加上一个@Singleton注解,之后获取到的就会是同一个实例,这里先定义的这个AppModule提供了两个可被注入的实例,一个是Context,还有一个是SharedPreferences。【实例提供者,类似contentProvide】 服务端

    讲解:有了Module但是并不能用,还必须有个Component来做注入的桥梁,这个component也是未来你主要持有的变量,它是一个接口,只需要在上面加上@Component的注解就算定义完成了,注意上面的inject方法里面的参数类型,这个是未来的注入点。中间桥梁端,指定服务端和客户端

    讲解:现在就可以在自己的App类里面把component实例化,并提供接口暴露出去,以供给BaseActivity使用。包装/整合服务端和中间端为一个中体的服务端.上面的DaggerAppComponent实际上是Dagger2自动生成的类,工作是在编译期做,可能需要你ReBuild一下才能看到,它提供一个Build子类,里面可以指定对应的Module实例,这时候我们就可以借机把Application.

    讲解:接下来就可以在BaseActivity.java使用依赖注入了。客户端使用服务端提供的依赖注入服务了,我上面演示的只是一个Application层面的依赖注入,事实上我们可以有很多层面的注入手段,在实际开发当中,我们可以围绕着Activity、Fragment这些注入点来提供component,在比较大的应用上,它可以节省不少的重复代码。
    http://zane96.github.io/2016/01/22/DI理解以及Dagger生成
    代码分析/
    http://google.github.io/dagger/
    https://github.com/google/dagger
    http://zhuanlan.zhihu.com/p/20463624 http://google.github.io/dagger/users-guide

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值