Android Dagger2.0依赖注入详解(实例讲解)

Project 的build.gradle文件:加上如下语句

// annotations processor (used by dagger 2.0)
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
Module 的build.gradle文件:加上如下语句

final DAGGER_VERSION = '2.0'

dependencies {
    compile "com.google.dagger:dagger:${DAGGER_VERSION}"
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

假如我们要在MainActivity中注入一个Test类型的对象,我们需要按照如下步骤做:

首先建立一个最简单的Test类

public class Test {
    
    public Test() {

    }
    public String test(){
        return "This is just a small test";
    }
}
然后在MainActivity中声明注入:

@Inject
Test mTest;
然后MainActivity要怎么获得一个注入对象呢,当然是通过MainActivityComponent:

import com.csr.csrmeshdemo2.Test;
import com.csr.csrmeshdemo2.injector.ActivityScope;
import com.csr.csrmeshdemo2.injector.modules.MainActivityModule;
import com.csr.csrmeshdemo2.ui.activities.MainActivity;

import dagger.Component;

@ActivityScope
@Component(
        modules = MainActivityModule.class
)
public interface MainActivityComponent {

    MainActivity inject(MainActivity mainActivity);
    Test getTest();

}
那么 MainActivityComponent的getTest()方法又从哪里得到一个Test实例呢,当然需要一个提供该实例的方法。该方法在上述代码中的MainActivityModule中,其实MainActivityComponent就相当于一个桥梁,MainActivity中需要注入什么对象只需要通过MainActivityComponent去get(获取),然后这些实例最终都是通过MainActivityModule来provide(提供)

import com.csr.csrmeshdemo2.Test;
import com.csr.csrmeshdemo2.injector.ActivityScope;
import dagger.Module;
import dagger.Provides;

@Module
public class MainActivityModule {
    @Provides
    @ActivityScope
    Test provideTest() {
        return new Test();
    }
}
这样我们就完成了Test的一个实例在MainActivity中的注入。

测试语句可以写在MainActivity的onCreate(....)方法中:

Log.i(TAG,mTest.test());

你可能还会想我想要多级依赖该怎么做呢,比如说我们 经常会用到的数据库管理类,我们希望它是全局唯一的,也就是单例的。那么我们要首先写一个App类继承Application:

public class App extends Application {

    private static AppComponent mAppComponent;

    public static App get(Context context) {
        return (App) context.getApplicationContext();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        initializeInjector();
       
    }

    private void initializeInjector() {

        mAppComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();

    }


    //Just a helper to provide appComponent to local components which depend on it
    static public AppComponent getAppComponent() {
        return mAppComponent;
    }

    public void setComponent(AppComponent appComponent) {
        this.mAppComponent = appComponent;
    }
}
像上一个流程一样我们需要写一个AppModule类还要写一个AppComponent接口:

@Singleton
@Component(
        modules = AppModule.class
)
public interface AppComponent {

    void inject(App app);

    DBManager getDBManager();

}

@Module
public class AppModule {

    @Provides
    @Singleton
    DBManager provideStatusManager(App app) {
        return new DBManager(app);
    }
}
接下来就是我们的关键,我们希望在MainActivity中像注入Test实例一样直接注入DBManager的单例对象。那么我们就要在MainActivityComponent中声明一个外部依赖,也就是AppComponent.这样当MainActivity需要向 MainActivityComponent取一个要注入的对象的时候,MainActivityComponent自己没有,就会像外部依赖AppComponent求助,同理,AppComponent需要AppModule来提供该实例。

我们的MainActivityComponent修改如下:

@ActivityScope
@Component(
        modules = MainActivityModule.class,
        dependencies = AppComponent.class
)
public interface MainActivityComponent {

    MainActivity inject(MainActivity mainActivity);
}

做好上述工作后就可以直接在MainActivity中注入DBManager的实例:

@Inject
DBManager mDBManager;

DBManager类就请读者自己编写,毕竟大家用的数据库表都不一样。Android Dagger2.0依赖注入的大致思路就是这样。希望能够帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值