01 June 2016

Dagger 学习笔记


当类中含有@Inject注释的成员变量, 却没有@Inject注释的构造函数时, Dagger将使用类的默认构造函数。若类中缺少@Inject注释, 该类是不能由Dagger创建的。


由于注入对象没有一个提供对象的地方是不可以的,所以引出了@Provides注解, 和 @Module的概念

//由于@Provides要包含在@Module注释的类中,所以只要函数中出现了@Provides就必须要在类上面加上@Module注


@Inject Lazy mCat; //延迟注入 mCat.get().xxxx();


@Singleton 注释对Dagger有效, 也只在一个ObjectGraph中生效。 若是有多个ObjectGraph, 则有多个相应的@Singleton对象。


@Inject Provider providerStudent; // 每次都是新实例


若是这个Module提供的对象绑定, 可能被injects列表中以外的类使用, 可以将改Module标记为library, 以避免出错。


所有的provide注解必须在同一个Module里,即所有的依赖关系最终都在一个Module中,对象图ObjectGraph在Application的onCreate中创建。


dagger2 学习

构造注入 属性注入 方法注入


在Dagger 2中,Scope的实现归结于对Components的一个正确的设置。一般情况下我们有两种方式 - 使用Subcomponent注解或者使用Components依赖。它们两者最大的区别就是对象图表的共享。Subcomponents可以访问它们parent的所有对象图表,而Component依赖只能访问通过Component接口暴露的对象。


直接看generate生成的代码可以更好地理解原理


dagger scope 的好文章啊,好文章啊。

http://blog.piasy.com/2016/04/11/Dagger2-Scope-Instance/

在构造方法上写scope是没用的,生成的代码并不会用ScopeProvider包裹。

Scope方法加在Module上并没有用,需要加载provide方法上。

component 的 inject 函数不要声明基类参数;

Scope 注解必须用在 module 的 provide 方法上,否则并不能达到局部单例的效果;

如果 module 的 provide 方法使用了 scope 注解,那么 component 就必须使用同一个注解,否则编译会失败;

如果 module 的 provide 方法没有使用 scope 注解,那么 component 和 module 是否加注解都无关紧要,可以通过编译,但是没有局部单例效果;

对于直接使用 @Inject 构造函数的依赖,如果把 scope 注解放到它的类上,而不是构造函数上,就能达到局部单例的效果了;

这里的有用没用都是说能不能达到局部单例的效果

总结:scope只有写在类上或者provide方法上才能有局部单例效果。


用clean写了一些业务,觉得直播这个项目不适合android 10的Clean架构,ui层与底层交互频繁,会导致domain层过重,产生许多接口,产生很多usecase,一个use只能做一件事(单一原则)。每次交互层次太深,每次交互都会经过 present–》usecase–》repository–》store–》network的过程,而且每层之间都会有相应业务的mapper和实体类,太麻烦。执行一次请求的过程冗长了很多。

但MVP和使用Observer使各层之前的操作变成数据流动的思想非常好用,要引入。

Presenter层拿着这个接口直接使用 简化流程 只留一个 interactor 层,里面实现业务接口,data层相应的Impl实现这个接口,数据仍然以Observer的形式流动,避免许多回调。只有一层数据mapper



blog comments powered by Disqus