聊一聊Dagger2

        网上有很多关于Dagger2的文章,但是我觉得很多地方解释起来都是比较拗口不便于理解,以下全文是我的理解。

        Dagger2:是依赖注入,主要用于模块间的解耦,比如一个类在多处被new出来,假如它的构造方法改了,那么这个类所有被实例化的地方都要改,那么Dagger2就可以派上用场了。

        了解Dagger2 必然要关注@Component 、@Module、@Inject

        一、@Inject    用于通知Dagger2需要被依赖注入的类

聊一聊Dagger2_第1张图片
被@Inject标识的类

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

聊一聊Dagger2_第2张图片
被@Module标识的类

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

聊一聊Dagger2_第3张图片
被@Component标识的类

        如果真正消耗依赖的地方是子类,那么上面的参数就不能写父类。因为Dagger2在编译时生成依赖注入的代码,会到inject方法的参数类型中寻找通过@inject标识的引用,如果没有找到Dagger2会认为没有需要注入的对象。

        了解以上三个类就能基本的使用Dagger2啦,当然Dagger2还有其他的标识。

        @ Socpe 用于自定义注解限定注解作用域

步骤一:首先我这边通过@Scope定义一个@interface ActivityScope注解。

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

聊一聊Dagger2_第4张图片

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

聊一聊Dagger2_第5张图片

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

聊一聊Dagger2_第6张图片

        至此你可以在项目中使用Dagger2啦

你可能感兴趣的:(聊一聊Dagger2)