Dagger2初步使用

2019-07-19  本文已影响0人  MengkZhang

项目中用到了Dagger2,先抽出来说说具体使用

1,在builde.gradle中先添加依赖

    implementation 'com.google.dagger:dagger:2.13'
    implementation 'com.google.dagger:dagger-android-support:2.13' // if you use the support libraries
    annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.13'

2,添加一个APPComponent

/**
 * Created by zhang on 2019/7/19 0019.
 * Desc:
 */
@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        ConfigModule.class
})
public interface APPComponent extends AndroidInjector<MyApplication> {

    @Component.Builder
    abstract class Builder extends AndroidInjector.Builder<MyApplication> {
        abstract Builder configModule(ConfigModule configModule);

        @Override
        public void seedInstance(MyApplication instance) {
            configModule(new ConfigModule(instance));
        }
    }
}

2.1,添加ConfigModule

@Module
public class ConfigModule {
    private Application application;

    public ConfigModule(Application application) {
        this.application = application;
    }

}

3,添加User对象 并用@Inject注解其构造方法

@Singleton
public class User {
    private String name;

    @Inject
    public User() {

    }

    public String getName() {
        return name;
    }

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

    public void callWork(String name) {
        Log.e("===z",name + "正在学习Dagger");
    }
}

点击Build编译项目,会在AS下生成


image.png

4,在Application中继承DaggerApplication并初始化Dagger

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAPPComponent.builder().create(this);
    }

调用

public class MyApplication extends DaggerApplication {

    @Inject
    User mUser;

    @Override
    public void onCreate() {
        super.onCreate();
        mUser.callWork("MengkZ");
    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAPPComponent.builder().create(this);
    }
}

运行结果:


Dagger2最简单的使用就从项目中抽出来了

二:在Activity中调用
添加有@@Module的ActivityModules

@Module
abstract class ActivityModules {
    @ActivityScope
    @ContributesAndroidInjector
    abstract MainActivity mainActivityInject();
}

在APPComponent中添加该ActivityModules

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        ConfigModule.class,
        ActivityModules.class
})
public interface APPComponent extends AndroidInjector<MyApplication> {
    @Component.Builder
    abstract class Builder extends AndroidInjector.Builder<MyApplication> {
        abstract Builder configModule(ConfigModule configModule);

        @Override
        public void seedInstance(MyApplication instance) {
            configModule(new ConfigModule(instance));
        }
    }

}

在Activity中统一注入,需要在onCreate方法的super之前注入

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //统一注入,要在super之前。
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

调用

    @Inject
    User mUser;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //统一注入,要在super之前。
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mUser.callWork("Activity中Mengk");
    }

结果


原理:

Dagger2再也没有使用反射:图的验证、配置和预先设置都在编译的时候执行。

https://blog.csdn.net/fan_zyf/article/details/71720592

上一篇 下一篇

猜你喜欢

热点阅读