dagger2 注解含义总结
Dagger
dagger 是什么?
是一个依赖注入框架,butterknife也是一个依赖注入框架。不过butterknife,最多叫奶油刀,Dagger2被叫做利器啊,他的主要作用,就是对象的管理,其目的是为了降低程序耦合。
属性名称 | 基本介绍 |
---|---|
dependencies | 实现继承注入 |
modules | 模块 |
includes | Module依赖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);
}
@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 使用详解及源码分析(很详细的使用讲解)