AndroidDagger2从入门到再入门

Posted 寒小枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidDagger2从入门到再入门相关的知识,希望对你有一定的参考价值。

一.认识Dagger2

Dagger2 是一个android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。年初的时候就已经接触到dagger2,当时只是看了几篇博文,简单的了解了下,记得当初的感觉也是云里雾里,并未真正的理解dagger,时隔几个月,再次学习它,对dagger有了新的认识,在此作下记录,以便以后查阅,也希望给正在看本文的你有些许帮助;

Dagger2 Github官网网址:https://github.com/google/dagger

Dagger2的主要工作流程分为以下几步:

  • 将依赖需求方实例传入给Component实现类;

  • Component实现类根据依赖需求方实例中依赖声明,来确定该实例需要依赖哪些对象;

  • 确定依赖对象后,Component会在与自己关联的Module类中查找有没有提供这些依赖对象的方法,有的话就将Module类中提供的对象设置到依赖需求方实例中;

二.配置build.gradle

咱们废话少说,下面介绍一下如何使用dagger进行依赖注入;

由于 Dagger 使用 apt 生成代码,给project的build.gradle添加如下配置:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    

moudle的build.gradle引入需要的库(这里只贴出关键代码):

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt' // 注释处理

······

dependencies 
    ······
    compile 'com.google.dagger:dagger:2.0.2'
    compile 'com.google.dagger:dagger-compiler:2.0.2'
    provided 'org.glassfish:javax.annotation:10.0-b28'

三.创建Module

现在的需求是页面上有个按钮,点击按钮后获取student要说的话,Toast显示出来;student的实例的创建咱们就使用dagger的方式来进行注入,页面效果如下:

1.首先创建一个Student学生类

public class Student 

    private String name;

    private String sayStr;

    public Student() 
    

    public Student(String name, String sayStr) 
        this.name = name;
        this.sayStr = sayStr;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getSayStr() 
        return sayStr;
    

    public void setSayStr(String sayStr) 
        this.sayStr = sayStr;
    

2.创建StudentMoudle类,用于提供student对象,module类需要在类上方添加@Module注解,@Provides作用是声明Module类中哪些方法是用来提供依赖对象的,当Component类需要依赖对象时,他就会根据返回值的类型来在有@Provides注解的方法中选择调用哪个方法;

@Module
public class StudentMoudle 

    @Provides
    public Student provideIStudent()
    
        Student student = new Student();
        student.setName("张三");
        student.setSayStr("一天不装逼,浑身难受");
        return student;
    

四.创建Component

@Component注解有modules和dependencies两个属性,这两个属性的类型都是Class数组,modules的作用就是声明该Component含有哪几个Module,当Component需要某个依赖对象时,就会通过这些Module类中对应的方法获取依赖对象,dependencies属性用来标识继承关系的,通过指定dependencies属性,可以继承其他Component;现在我们来创建StudentComponent:

@Component(modules = StudentMoudle.class)
public interface StudentComponent 
    //此处的MainActivity参数是指需要注入到哪个类
    void inject(MainActivity activity);

注:写好module和component类后,Dagger2并不会自动创建对应的类,需要我们点击make poject选项或者make module;编译完成后就会生成DaggerStudentComponent类,命名规则是默认的,Dagger+“你的Component的名字”,然后我们就可以使用如下代码进行注入操作:

DaggerStudentComponent.builder().studentMoudle(new StudentMoudle()).build().inject(this);

五.注入对象,查看结果

在MainActivity中声明Student依赖:

public class MainActivity extends AppCompatActivity 

    private Button btnShow;

    @Inject
    Student student;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initInject();
        initView();
    

    private void initInject() 
        DaggerStudentComponent.builder().studentMoudle(new StudentMoudle()).build().inject(this);
    

    private void initView() 
        btnShow = (Button) findViewById(R.id.btn_show);
        btnShow.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Toast.makeText(MainActivity.this, student.getName()+"说:"+student.getSayStr(), Toast.LENGTH_SHORT).show();
            
        );
    

效果图:上面呢,上面呢,上面呢!!

六.构造函数,直接注入

1.我们新建Teacher类,在构造函数上添加@Inject注解

public class Teacher 

    private String name;

    @Inject
    public Teacher() 
    

    public Teacher(String name) 
        this.name = name;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

2.注入对象,编译后运行

public class MainActivity extends AppCompatActivity 

    private Button btnTeacher;

    @Inject
    Teacher teacher;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    
    private void initView() 
        btnTeacher = (Button) findViewById(R.id.btn_teacher);

        btnTeacher.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Toast.makeText(MainActivity.this, "teacher = "+teacher, Toast.LENGTH_SHORT).show();
            
        );
    

3.结果,对象创建成功

如果我们把@Inject注解放在有参数的构造函数上,如何使用呢?

4.我们来修改下Teacher类,把注解@Inject放在有参数的构造上,此处的参数我们给了个student;

public class Teacher 

    private Student student;

    public Teacher() 
    

    @Inject
    public Teacher(Student student) 
        this.student = student;
    

    public Student getStudent() 
        return student;
    

    public void setStudent(Student student) 
        this.student = student;
    

5.编译,运行,打印Teacher类中的student的name

btnTeacher.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Toast.makeText(MainActivity.this, "teacher student = "+teacher.getStudent().getName(), Toast.LENGTH_SHORT).show();
            
        );

效果如下,同样可以拿到实例,当有参数的时候,dagger会从已有的依赖中注入需要的参数,其实获取student的流程就和上面注入student的例子是一样的;



这一篇先介绍这么多,下一篇将介绍@Singleton,@Scope等其他注解的使用;

参考链接:

1.Dagger2 入门,以初学者角度
2.Dagger2使用初步

以上是关于AndroidDagger2从入门到再入门的主要内容,如果未能解决你的问题,请参考以下文章

Nmap从入门到再入门

❤️‍Spring从入门到大神--AOP从入门到精通

观察者模式(从放弃到入门)

❤️‍Spring全家桶从入门到大神--SpringMVC入门

2021/7/16 学习散射网络第一步-神经网络入门

MyBatis从入门到精通:使用collection标签实现嵌套查询