Dagger2入门(二)—— Dagger2的简单使用

目录

Dagger2入门(一)—— Dagger2优点
Dagger2入门(二)—— Dagger2的简单使用
Dagger2入门(三)—— Dagger2的高级用法

环境搭建

Dagger2环境搭建新的Gradle版本上搭建要比原先简单的多。只需要在module目录下的build.gradle文件中添加依赖

dependencies {
    ...

    implementation 'com.google.dagger:dagger-android:2.X'
    implementation 'com.google.dagger:dagger-android-support:2.X'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.X'
}

即可。
注意,有些教程上教的是一些比较旧的方法:
在project目录下的build.gradle文件中添加

  dependencies {
      ...
      classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }

在module目录下的build.gradle文件中添加

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
    //引入Dagger2以及依赖的一些包,因为用到注释所以还需要引用annotation包
    apt 'com.google.dagger:dagger-compiler:2.0'
    compile 'com.google.dagger:dagger:2.0'
    compile 'javax.inject:javax.inject:1'
    compile 'javax.annotation:javax.annotation-api:1.2'
}

在新的Gradle环境下会报出编译时错误:

ERROR: android-apt plugin is incompatible with the Android Gradle plugin.  Please use 'annotationProcessor' configuration instead.
Affected Modules: app

大意是说android-apt以及被包含在Android的工程里了,需要用新的使用方法。

代码实现

  1. 实现需要被注入的类(Demo)和被注入的类(MainActivity)
public class Demo {
    public void work() {
        Log.i("schLog", "Dagger2 正常工作");
    }
}
public class MainActivity extends AppCompatActivity {
    @Inject
    Demo demo;

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

        demo.work();
    }
}
  1. 实现Module和Component
@Module
public class MainActivityModule {
    @Provides
    public Demo provideWatch() {
        return new Demo();
    }
}
@Component(modules = MainActivityModule.class)
public interface MainActivityComponent {
    void inject(Activity activity);
}
  1. 按一下Ctrl和F9键(Make Project)或者点击Rebuild Project生成Dagger2工厂文件,然后将依赖注入到需要注入的地方。
public class MainActivity extends AppCompatActivity {
    @Inject
    Demo demo;

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

        //将依赖注入
        DaggerMainActivityComponent.create().inject(this);

        demo.work();
    }
}

然后我们就可以看到我们的代码可以正常工作了。

Dagger2中的概念

@Inject: 作用于字段,构造方法,方法。
作用于字端是表示被注入的字段。
作用于方法时,在注入时这个方法会被执行。
作用于构造方法则表示通过这个方法被注入(不需要provide)
@Module:作用于类,表示该类用于管理依赖
@Component: 作用于接口,生成一个类用于将依赖注入到需要的地方
@Provide: 作用于方法,在module类中,表示生成依赖的地方。

你可能感兴趣的:(Dagger2入门(二)—— Dagger2的简单使用)