初识dagger2之学习(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36636969/article/details/81453145

概念:

 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();
    }
}

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/qq_36636969/article/details/81453145
今日推荐