看了就会用的Dagger2教程

#看了就会用的dagger2教程
之前学习过一段时间dagger2,因为没做笔记过了一段时间又模糊了,现在打算重新复习一遍,顺便写个博客,以免下次又忘记了。

###什么是dagger
dagger2是一个依赖注入框架,dagger是由Square公司维护,后来dagger2由Google来维护了,使用dagger的好处在于我们能够降低代码的耦合性,提升代码的可维护性。

环境搭建

GitHub地址:https://github.com/google/dagger

然后在build.gradle(app)中添加

compile ‘com.google.dagger?2.16’
annotationProcessor ‘com.google.dagger:dagger-compiler:2.16’
这个时候直接编译项目,会出现以下报错,在我个人的开发环境下是出现了,这里顺便做个记录,和解决方法
这里写图片描述

解决办法
这里写图片描述
添加如下两行:
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
multiDexEnabled true

使用

首先先简单介绍一下几个基本的注解
@Inject:
通常在需要依赖的地方使用这个注解。用来告诉Dagger这个类或者字段需要依赖注入。这样Dagger就会构造这个类的实例。
@Module:
Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里找需要的依赖。
@Provide:
在modules中,我们定义的方法是用这个注解,用来告诉Dagger我们想要构造的对象并提供这些依赖。
@Component:
Component从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。

以上这四个注解是最基本的,我们先来写一段简单的代码测试使用一下

//TestBean
public class TestBean1 {

    public TestBean1 () {
    }

    public void sayHello() {
        Log.e("Dagger2Test", "Hello World");
    }
}

//MainActivity
public class MainActivity extends AppCompatActivity {

    @Inject
    TestBean1 testBean1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        DaggerTestComponent.create().inject(this);
        setContentView(R.layout.activity_main);
        testBean1.sayHello();
    }
}
//TestModule
@Module
public class TestModule {

    @Provides
    public TestBean1 provideApiService() {
        return new TestBean1 ();
    }

}

//TestComponent
@Component(modules = TestModule.class)
public interface TestComponent {
    void inject(MainActivity activity);
}

运行项目可以看到控制台打印出了log ,如下图所示:在这里插入图片描述
到此我们已经掌握了Dagger2的简单基本使用。
现在假设一种情况,如果我们的TestBean1 的构造是需要参数的怎么办,如果我们的TestBean1的构造依赖于TestBean2我们应该如何实现,对于这个情况,一般有两种实现方法:

1. 在Module中使用 @Provides注解提供实现方法。
2. 在构造方法上使用@Inject注解。

接下来我们修改一下代码,测试一下刚刚上面的两种方法。

//修改TestModule如下
@Module
public class TestModule {

    @Provides
    public TestBean2 provideTestBean2(){
        return new TestBean2();
    }

    @Provides
    public TestBean1 provideTestBean1(TestBean2 testBean2) {
        return new TestBean1(testBean2);
    }
}

或者

//TestBean2
public class TestBean2 {
    @Inject
    public TestBean2() {
    }
}

以上两种方法都是可行的。

Component在使用时的区别


DaggerTestComponent.create().inject(this);

DaggerTestComponent.builder().testModule(new
    TestModule(this)).build().inject(this);

我们知道在使用的时候,需要通过Component来联系Module和Inject的,那上面这两种方法有什么不同呢,简单来说,当Module的构造函数需要参数时,使用第二种;没有的话就可以直接使用 create() 来实现,代码上也更加简洁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值