dagger2 注解含义总结

本文深入解析Dagger2依赖注入框架的核心概念与API使用,包括@Component、@Module、@Provides等注解的功能与区别,以及如何通过@Binds、@BindsInstance实现对象管理与参数传递,适合希望掌握Dagger2高级特性的开发者阅读。

Dagger

dagger 是什么?
是一个依赖注入框架,butterknife也是一个依赖注入框架。不过butterknife,最多叫奶油刀,Dagger2被叫做利器啊,他的主要作用,就是对象的管理,其目的是为了降低程序耦合。

属性名称基本介绍
dependencies实现继承注入
modules模块
includesModule依赖Module
@Subcomponent进行继承注入
@Named区分相同类型的,不同初始化对象
@Component标记Component
@Inject声明对象
@Module标记Module
@Provides标记方法,提供实例对象
@Singleton单例
Lazy/Provider声明对象是懒加载还是强制加载
@Scoped用于定义生命周期
@Component.Builder自定义Builder
@Binds抽象moudle中的方法
@Qulifer自定义注解,用于区别
@BindsInstance帮助构造方法输入参数

API详细

@Component

Component是连接注入类和目标类的桥梁

@Module

Modules类里面的方法专门提供依赖,是目标类的位置

@Provides

在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

@Binds

可以理解为关联,
首先它是跟@Provides使用地方是一样的,不同的在于@Provides注解的方法都是有具体实现的,

@Binds修饰的只有方法定义,并没有具体的实现的(类似抽象),此方法有且仅有一个参数,并且此参数的类型一定是返回值类型的子类,
这样创建实体类的地方就不用在Modules 中实现了。
具体的调用会在@Component中调用。

@Module
public abstract class AppModule {
    @Binds
    abstract IAppManager bindAppManager(AppManager appManager);
}

Dagger2 @Provides与@Binds的区别和联系:https://blog.csdn.net/weixin_35691921/article/details/109780281

@BindsInstance

学习地址1:https://my.oschina.net/zzxzzg/blog/1541916

用途:存在一种情况,我们需要注入一个对象,这个对象的构造函数需要提供参数。使用@BindsInstance可以提供参数。

@Inject

它有两个作用,一个是用来标记需要已被注入的变量;

Inject 注入的对象,是包含以下几点:
1、通过@Provides注释的方法
2、该方法必须是public属性
3、该方法的返回值是@Inject修饰对象的类型

二是用来标记被依赖对象的构造函数(CPU的构造函数)。

Dagger 可以通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把实例构造出来,以此为被@Inject标记了的变量提供依赖。

@Lazy/Provider

 @PresentForContext
 @Inject
 Lazy<Present> lazy;
 @PresentForName
 @Inject
 Provider<Present> provider;

提供懒加载和强制加载

@Component.Builder

使用@Component时,自定义 @interface Builder {} 时,需要使用

@ActivityScope
@Component(modules = UserModule.class, dependencies = AppComponent.class)
public interface UserComponent {

    void inject(UserActivity activity);

    @Component.Builder
    interface Builder {
        @BindsInstance
        UserComponent.Builder view(UserContract.View view);

        UserComponent.Builder appComponent(AppComponent appComponent);

        UserComponent build();
    }
}

@Qulifer

参考依赖注入框架 ----Dagger2 使用详解及源码分析

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface QualifilerAmd {
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface QualifilerIntel {
}

通过自定义@Qulifer可以作出区分标记。

@Named

    @Binds
    @Named("ActivityLifecycle")
    abstract Application.ActivityLifecycleCallbacks bindActivityLifecycle(ActivityLifecycle activityLifecycle);

    @Binds
    @Named("ActivityLifecycleForRxLifecycle")
    abstract Application.ActivityLifecycleCallbacks bindActivityLifecycleForRxLifecycle(ActivityLifecycleForRxLifecycle 
    																					activityLifecycleForRxLifecycle);

待续

先了解到这里,以后遇见具体问题,再更新

参考地址:

参考地址:架构进阶,Dagger2的原理及使用详解

参考地址:[Dagger2教程:https://blog.csdn.net/u010961631/category_6931544.html](入门)(https://blog.csdn.net/u010961631/category_6931544.html)
参考地址:Dagger2教程六之Component的组织方法(原) (这篇博客讲的是继承)

参考地址:依赖注入框架 ----Dagger2 使用详解及源码分析(很详细的使用讲解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周都刷火焰猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值