网上有很多关于Dagger2的文章,但是我觉得很多地方解释起来都是比较拗口不便于理解,以下全文是我的理解。
Dagger2:是依赖注入,主要用于模块间的解耦,比如一个类在多处被new出来,假如它的构造方法改了,那么这个类所有被实例化的地方都要改,那么Dagger2就可以派上用场了。
了解Dagger2 必然要关注@Component 、@Module、@Inject
一、@Inject 用于通知Dagger2需要被依赖注入的类

二、@Module Modules类提供通过@Inject标识要实例化类所需的参数,通过@Module标识,通过@Provides对外提供;modules的一个重要特征是它们设计为分区并组合在一起(说人话就是在我们的app中可以有多个组成在一起的modules);第一张图是可以直接实例化,第二张图是不能直接实例化的用过构造方法传进来。

三、@Component Component是一个接口作为Module和Inject的桥梁,是将Module提供的参数,注入到@Inject标注的对象中

如果真正消耗依赖的地方是子类,那么上面的参数就不能写父类。因为Dagger2在编译时生成依赖注入的代码,会到inject方法的参数类型中寻找通过@inject标识的引用,如果没有找到Dagger2会认为没有需要注入的对象。
了解以上三个类就能基本的使用Dagger2啦,当然Dagger2还有其他的标识。
@ Socpe 用于自定义注解限定注解作用域
步骤一:首先我这边通过@Scope定义一个@interface ActivityScope注解。

步骤二: 运用的话可以放在Module处或者Component处,这两处也可以配合使用(@Singleton也一样)。

但是如果Component依赖的Module的@Provide有@Scope,则@Component也必须要有,否则编译会报错(@Singleton也一样)例如:


@Singleton 标识当前的对象或方法是单例模式

至此你可以在项目中使用Dagger2啦
网友评论