概念:
Dagger:android依赖注入框架,最早的dagger1是由square公司开发,之后的dagger2 由Google接手开发。
简单的说:dagger是一个通过Java注解手段,省去大量new 对象的代码,达成解耦目的框架,也叫依赖注入框架
作用:依赖注入框架主要用于模块之间的解耦,提高代码的可维护性
注:Dagger是一个基于有向无环图结构的依赖注入库,因此dagger的使用过程中不能出现循环依赖
配置:在项目的gradle文件中加入依赖:
最新版本请在https://github.com/google/dagger上获取。
implementation 'com.google.dagger:dagger:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
Dagger 常用注解有:@Inject、@Model、@Component、@Provides、@Scope、@SubComponent等
@Inject:通常在需要依赖的地方使用这个注解、用它告诉Dagger这个类或者字段需要依赖注入。这样 Dagger就会构造这个类的实例并满足他们的依赖
@Model:Model类里面的方法专门提供依赖,所以定义一个class用@Model注解,Dagger在构造类的实例的时候,知道从哪里找到需要的依赖
@Provides:在models中,定义的方法是用这个注解,以此告诉Dagger想要构造对象并提供这些依赖
@Component:相当于一个注入器,也是连接@Inject和@Model的桥梁,提供了所有定义了的类型的实例,比如我们必须用@Component注解一个接口,然后列出所有的@Models组成该组件,如果缺失任何一块,都会在编译的时候报错,所有的组件都可以通过它的models知道依赖的范围
@Scope:Dagger2可以通过自定义注解限定注解作用域
使用:
1、简单不带model的Inject(构造参数不待参数的情况)
代码如下:
/**
* 第一步:将我们需要注入对象的类,构造参数使用inject标注 ,告诉dagger2 它可以实例化这个类
*/
public class Product {
@Inject
public Product() {
}
}
/**
* 第二步;编写component接口使用@Component标注 里面 void inject() 的参数表示要将赖注入到目标位置
*
* 其次 使用android studio 自带的build菜单编译一下项目 使它自动生成我们编写component 所对应的类,生成类的名字格式为:Dagger+我们所定义component的名字
*/
@Component
public interface MainActivityComponent {
void inject(MainActivity mainActivity);
}
/**
*第三步:在需要注入的类中使用@inject标注要注入的变量,调用自动生成的DaggerMainActivity类的create()或者builder.build() inject到当前类,之后就可以使用@Inject标注的变量了
*
* component是注入者和被注入者之间连接的桥梁,有了它dagger2才知道要把谁注入到什么地方
*/
public class MainActivity extends AppCompatActivity {
@Inject
Product product;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
Toast.makeText(this,"product:"+product.hashCode(),Toast.LENGTH_SHORT).show();
}
}
2、构造参数带参数的情况
- prduct类和MainActivityComponent类的内容保持不变
- 新增factory类
public class Factory {
Product product;
@Inject
public Factory(Product product) {
this.product = product;
}
}
mainActivityComponent类也做了简单的改变
public class MainActivity extends AppCompatActivity {
@Inject
Factory factory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
// DaggerMainActivityComponent.builder().build().inject(this);
Toast.makeText(this,"factory:"+factory.hashCode()+"\n"+"factory.product:"+factory.product.hashCode(),Toast.LENGTH_SHORT).show();
}
}
未完待续。。。。