Dagger2

1. Dagger2 基础

注解讲解:

  • @Module这个annotation修饰的类专门用来提供依赖
  • @Provides这个annotation修饰的方法用在Module类里
  • @Inject用来annotation一个依赖(可以是构造方法、field或者一般的方法)
  • @Component连接@Module和注入的桥梁

2.Dagger2 开发步骤

一共分几步:

  1. 定义依赖和被依赖的对象的类,悟空类和金箍棒类。“悟空类”和“金箍棒类”的构造函数用@Inject注解修饰。
  2. 定义一个@Module注解的类,一般叫做XXXModule里面写的@Provides注解修饰的方法这些@Provides方法返回“悟空类”和“金箍棒类”对象。比如@Provides Wukong provideWukong(){ return new Wukong(); }
  3. 创建一个interface,并用@Component注解修饰。一般叫做XXXComponent。里面写一个注入方法:void inject(Wukong wk);。这里Wukong只是一个例子。任何你准备要注入的类都可以代替上面参数的Wukong类。
  4. 在需要注入的地方写@Inject的field。

最后,Dagger会根据上面的内容和最后的@Component接口生成一个DaggerXXXComponent的类型,使用这个类型来实现注入。上面的1到3步可以理解为依赖的配置。最后的XXXComponent代替古老的Reflect方式实现注入。

第一步的@Inject修饰的构造函数和`@Module``provideXXX`方法二者可以省略一个。
Dagger可以根据其中的任意一种配置创建依赖的对象。都写上等于有了双保险。

上文提到过多次。Dagger 2厉害的地方就在于这个库完全不用反射,而是用在编译期生成代码的方式实现的依赖注入。这个特点导致在Android Studio配置的时候需要做一些额外的工作。

这里假设你已经创建了一个新的Android应用项目。下面打开build.gradle文件,我们一步一步的来完成Dagger2的配置。

首先,我们已经有悟空和金箍棒了。代码如下:

悟空:

import javax.inject.Inject;

/**
 * Created by uncle_charlie on 6/4/2016.
 */
public class Wukong {

    @Inject
    JinGuBang jinGuBang;

    @Inject
    public Wukong() {

    }

    public String useJinGuBang() {
        return this.jinGuBang.use();
    }
}

金箍棒:

import javax.inject.Inject;

/**
 * Created by uncle_charlie on 6/4/2016.
 */
public class JinGuBang {

    @Inject
    public JinGuBang() {

    }

    public String use() {
        return "user Jing gu bang";
    }
}
  1. 悟空对金箍棒有依赖,所以金箍棒属性有@Inject注解修饰。
  2. 因为两个类都需要Dagger创建,所以在构造函数上都有@Inject注解。
第二步、创建@Module

创建@Module注解的类,并在其中添加@Provides注解修饰的方法。这些方法创建被依赖的对象。

import dagger.Module;
import dagger.Provides;

/**
 * Created by uncle_charlie on 6/4/2016.
 */
@Module
public class XiYouModule {
    @Provides
//    @Singleton
    Wukong provideWukong() {
        return new Wukong();
    }

    @Provides
//    @Singleton
    JinGuBang provideJinGuBang() {
        return new JinGuBang();
    }
}
  • @Singleton注解表明,这个被依赖的对象在应用的生命周期里只有一个实例。
  • 这个里的@Provides方法和前一步说到的@Inject注解的构造函数两个可以只写一个。
第三步、@Component接口,连接@Module@Inject

@Module@Provides方法提供了被依赖的对象。@Inject@Component接口出现的地方则是指明了需要注入的地方(一般是一个field)。@Component接口就是用来把他们连接起来的。

import android.app.Activity;
import javax.inject.Singleton;
import dagger.Component;

/**
 * Created by uncle_charlie on 6/4/2016.
 */
@Component(modules = {XiYouModule.class})
@Singleton
public interface XiYouComponent {
    void inject(Wukong wk);
    void inject(Activity a);
}

其中inject()方法里使用的对象,就是包含@Injectfield的需要注入的对象。

在这个接口中也可以不用inject()方法,而使用provideXXX()方法后面会有更多介绍。

注意:@Component接口一定要在直接中指明@Module类型
第四步、使用@Component接口获取对象

经过前面的步骤,依赖和被依赖对象关系都已经配置好了。下面就来获取被依赖对象来注入依赖对象。

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "##MainActivity";

    @Inject
    Wukong wukong;

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

        TextView welcomeTextView = (TextView) findViewById(R.id.welcome_textview);
        // 1
        XiYouComponent xiYouComponent = DaggerXiYouComponent
                .builder()
                // 2
                .xiYouModule(new XiYouModule())
                .build();
        xiYouComponent.inject(this);
        // 3
        welcomeTextView.setText(wukong.useJinGuBang());
    }
}

首先主要到属性@Inject Wukong wukong;已经在MainActivity声明了。这里表明一个依赖关系:这个activity依赖于悟空,并准备注入悟空对象。

  1. Dagger2会在编译器自动生成依赖注入的代码,所以在添加上面的代码之前需要编译一下。DaggerXiYouComponent就是Dagger根据我们的XiYouModule类生成的代码。
  2. 在这一步给DaggerXiYouComponentbuilder添加XiYouModule的实例。如果这个Module只需要用到无参构造函数的话可以用一种省略用法:create()方法。可以简写为:

    DaggerXiYouComponent
                .builder()
                // 2
                //.xiYouModule(new XiYouModule())
                //.build()
                .create();
  3. Component接口的对象调用inject(this)方法之后注入即完成。所以可以直接使用@Inject Wukong wukong;属性来调用方法:welcomeTextView.setText(wukong.useJinGuBang());最后在activity中显示方法返回的文字。

运行代码,看看结果吧。

结论

以上内容可以概括为:什么被依赖,就把什么放在@Module类里(或者什么被依赖,就给什么添加@Inject的无参构造函数)。什么有依赖(@Inject属性),就把什么放在@Component接口的inject()方法参数里。(或者有什么@Inject属性,就在@Component接口里provide什么对象)。这个概括不一定严密,但是基本用法全部包括了。

依赖注入是很有用的。以上的内容只是Dagger2依赖注入的一部分。各位读者还需要根据官方文档多加练习才能更好的理解依赖注入和Dagger的各种用法。




注意:@Component接口一定要在直接中指明@Module类型
第四步、使用@Component接口获取对象

经过前面的步骤,依赖和被依赖对象关系都已经配置好了。下面就来获取被依赖对象来注入依赖对象。

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "##MainActivity";

    @Inject
    Wukong wukong;

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

        TextView welcomeTextView = (TextView) findViewById(R.id.welcome_textview);
        // 1
        XiYouComponent xiYouComponent = DaggerXiYouComponent
                .builder()
                // 2
                .xiYouModule(new XiYouModule())
                .build();
        xiYouComponent.inject(this);
        // 3
        welcomeTextView.setText(wukong.useJinGuBang());
    }
}

首先主要到属性@Inject Wukong wukong;已经在MainActivity声明了。这里表明一个依赖关系:这个activity依赖于悟空,并准备注入悟空对象。

  1. Dagger2会在编译器自动生成依赖注入的代码,所以在添加上面的代码之前需要编译一下。DaggerXiYouComponent就是Dagger根据我们的XiYouModule类生成的代码。
  2. 在这一步给DaggerXiYouComponentbuilder添加XiYouModule的实例。如果这个Module只需要用到无参构造函数的话可以用一种省略用法:create()方法。可以简写为:

    DaggerXiYouComponent
                .builder()
                // 2
                //.xiYouModule(new XiYouModule())
                //.build()
                .create();
  3. Component接口的对象调用inject(this)方法之后注入即完成。所以可以直接使用@Inject Wukong wukong;属性来调用方法:welcomeTextView.setText(wukong.useJinGuBang());最后在activity中显示方法返回的文字。

运行代码,看看结果吧。

结论

以上内容可以概括为:什么被依赖,就把什么放在@Module类里(或者什么被依赖,就给什么添加@Inject的无参构造函数)。什么有依赖(@Inject属性),就把什么放在@Component接口的inject()方法参数里。(或者有什么@Inject属性,就在@Component接口里provide什么对象)。这个概括不一定严密,但是基本用法全部包括了。

依赖注入是很有用的。以上的内容只是Dagger2依赖注入的一部分。各位读者还需要根据官方文档多加练习才能更好的理解依赖注入和Dagger的各种用法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值