我们知道Dagger是一个依赖注入的框架,那么什么是依赖注入呢?
我们在activity中有可能会用到很多很多的类,这些类要在activity中进行实例化,这样就导致我们的activity非常依赖这么多的类,这样的程序耦合非常严重,不便于维护和扩展,有什么办法可以不去依赖这些类呢,这时候就需要有一个容器(IoC),将这些类放到这个容器里并实例化,我们activity在用到的时候去容器里面取就可以了,我们从依赖类到依赖这个容器,实现了解耦,这就是我所理解的依赖注入,即所谓控制反转;
现在让我们开始学习
首先我们需要掌握两个重点
1)Dragger2环境搭建
2)@Inject和@Component 的含义
第一部分:环境搭建
在app gradle中添加项目依赖
第二部分:注解的使用implementation 'com.google.dagger:dagger:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
在使用之前我想先用自己的话来解释这两个基础注解的含义
@inject:
1)如果放在构造函数上,就是告诉Dragger2如果实例化我的时候,就调用该构造函数
2)如果放在变量上,就是告诉Dragger2我要被使用了,md快点实例化我,生成实例对象
@Component:
一般用在标注接口,有点像办事处,谁需要容器中的实例,首先需要在着进行注册。
备注:在代码编写过程中 我们会发现DaggerActivityComponent会不存在,这是因为注入器是在编译的过程中才生成,所以我们在对注入器编写完成后
实例代码教程:
创建一个组件
创建一个装组件的容器接口public class UserInfo { private String name; /** *告诉Dragger2如果对我进行实例化,就调用这个构造函数 */ @Inject public UserInfo() { } public String getName() { return name; } public void setName(String name) { this.name = name; } }
使用容器中的组件/** * Created by malei on 2018/3/20. */ /** * Component一般用来标注接口,被标注了Component的接口在编译时会产生 * 相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中。 * * 创建一个@Component标注的注入器接口, * 并在注入器中使用 void inject(MainActivity MainActivity); * 来表明哪里要用到注入器; */ @Component public interface ActivityComponent { void inject(MainActivity MainActivity); }
/** * 在MainActivity中对注入器进行初始化DaggerActivityComponent.builder().build().inject(this); * 初始化后该注入器就可以正常使用了; * 在MainActivity中对需要注入的类 UserInfo用@Inject进行标注,表示该类需要被注入,即实例化; * * 注意:在代码编写过程中 我们会发现DaggerActivityComponent会不存在, * 这是因为注入器是在编译的过程中才生成,所以我们在对注入器编写完成后 */ public class MainActivity extends AppCompatActivity { @Inject UserInfo user; //让dragger2提供实例 变量不可以是private类型 private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerActivityComponent.builder().build().inject(this); user.setName("malei"); tv = (TextView)this.findViewById(R.id.tv); tv.setText(user.getName()); } }
这样一个最基础的依赖注入就完成了。我们不需要在activity中创建其他类的实例,我们只需要从容器中获取实例就可以了。