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依赖注入的大致思路就是这样。希望能够帮到大家。