一、概述
简单的说,就是一个工厂模式,由Dagger负责创建工厂,帮忙生产instance。遵从Java规范JSR 330,可以使用这些注解。现在不研究Dagger2是如何根据注解去生成工厂的,先来看看工厂是什么东西,理解为什么可以实现了DI(Dependency Injection),如何创建IoC(Inverse of Control)容器。
二、获取实例逻辑
Dagger2是通过依赖注入完成类的初始化,这个过程需要三部分:
1.依赖提供方(生产者)
2.依赖注入容器(桥梁)
3.依赖需求方(消费者)
image.png
三、文档及源码
google文档:https://dagger.dev/api/latest/
github地址:https://github.com/google/dagger
实验源码:https://github.com/stormdzh/DaggerTest
四、实践
1.生产方的实现,也就是被调用的类
/**
* @Description: AUtil 简单的工具类
* @Author: dzh
* @CreateDate: 2019-12-14 14:18
*/
public class AUtil {
/**
* 弹出提示
*
* @param context 上下文
* @param text 文本信息
*/
public void toast(Context context, String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
}
2.构建生产方实例对象的Module
/**
* @Description: UtilModule
* @Author: dzh
* @CreateDate: 2019-12-14 14:17
*/
@Module //第一步:添加@Module 注解
public class UtilModule {
@Provides
//第二步:使用Provider 注解 实例化对象
AUtil providerAUtil() {
return new AUtil();
}
}
3.创建一个Component
/**
* @Description: UtilComponent
* @Author: dzh
* @CreateDate: 2019-12-14 14:21
*/
@Component(modules = {UtilModule.class})//第一步 添加@Component 和 module
public interface UtilComponent {
//第二步:写一个方法 绑定Activity /Fragment
void inject(MainActivity activity);
}
4.调用方式
public class MainActivity extends AppCompatActivity {
@Inject
AUtil aUtil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//方式一
DaggerUtilComponent.create().inject(this);
//方式二
//DaggerUtilComponent.builder().build().inject(this);
//在触发了inject之后,就已经帮我们实例化好了AUtil对象
aUtil.toast(this, "我是有dagger构建对象,在弹出的提示");
}
}
五、简单看看实例是如何产生的
1.从MainActivity入手,可以看看DaggerUtilComponent.create().inject(this)方法的实现。
image.png
image.png
image.png
相当于是使用MainActivity.providerAUtil()
image.png
上面的很多类我们并没有创建但是怎么就有了尼?
image.png
其实这些都是利用java的apt生成的文件。
6、常用注解
@Inject
用来注入对象,例如:
@Module
注解类,负责管理依赖。
@Provides
注解@Module 类中的方法,在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component
一般用来注解接口,负责在@Inject和@Module之间建立连接。
也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。
@Scope
Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
@Qualifier
当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。
网友评论