dagger2 重点笔记

官方架构例子,里面有个dagger2的结合的例子

https://github.com/googlesamples/android-architecture

https://google.github.io/dagger

 

Dagger2 通过注解来生成代码,定义不同的角色,主要的注解有:@Inject、@Module 、@Component 、@Provides 、@Scope 、@SubComponent 等。

  @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
  @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
  @Provides: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
  @Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的   @Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
  @Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没必要让每个对象都去了解如何管理他们的实例。

 

简单地说,通过对象类型传递 对象以来, 通过 module和 provides 提供对象 ,component中 若要注入当前对象 提供个 inject(MainActivity )方法

对于component类 除了inject 其它方法的作用:

1.可以将A模块中(provides注解)的对象给B模块(某个函数的 形参)使用,暴露方法共用,通过component作为中间桥梁

2.component 其方法的返回值 一般来自于 依赖的模块 提供的, make project后,当生成 DaggerComponent之后可供外部调用。

3.若component中的返回类型对象A,从子模块 的provides 提供的注解 没有找到类型一致的对象类型A时,可从A对象的构造函数查找下 应该有个@inject 从外部注入的,里面的形参 肯定可以在 子模块中找到。

4.不允许 @provides 返回的参数 与形参类型一样,这样会死循环,形参 是从 返回的参数那边找来 注入的。

posted on 2017-05-15 21:05  wf110  阅读(207)  评论(0编辑  收藏  举报