Dependencyinjection这种模式(该模式用的不好,这里又不好了)用来解耦应用的各个部分。使应用程序开发更具可扩展性和更易于维护。通过本文您将学习如何使用Dagger2来处理依赖项。简介如果一个对象需要另一个对象来完成一个完整的功能,那么就存在依赖关系。比如悟空要金箍棒三打骨灵,要翻筋斗云才能行千里。悟空对金箍棒和筋斗云有依赖。可以在悟空对象中初始化金箍棒,也可以使用工厂方法批量生产金箍棒。使用依赖注入消除了对专用类来初始化这些依赖对象的需要。这样就实现了解耦。本教程将使用最新的Dagger2(当前版本为2.2)。这是官方网站。您可以在此处找到最新版本。准备AndroidStudio是必须的。其他:1、Dagger2基础注解说明:@Module注解修饰类专门用来提供依赖。在Module类中使用了@Provides注解修饰的方法。@Inject用于注解一个依赖(可以是构造方法、字段或通用Method)@Component连接@Module和注入桥这些名词看起来很抽象。下面我稍微解释一下。依靠反思并没有什么神奇之处。只是需要单独写初始化依赖的地方被其他框架代替了。这个依赖也有我们经常写的代码转移到“配置文件”中。很久以前,依赖注入框架是这样处理依赖注入的:读取配置文件的依赖,然后通过反射的方式初始化依赖对象,赋值给调用依赖的对象。比如我们之前在悟空类中初始化了金箍棒:publicclassWukong{privateJingubangjingubang;publicWukong(){//就靠这个了。格式):悟空使用金箍棒,依赖注入框架自动初始化金箍棒,赋值给悟空。现在使用Dagger2。这是我不得不说我很棒的地方。因为Android中没有后端那么多可用的资源。特别是反射消耗很大!因此,为了满足移动开发节省资源的需求,Dagger没有使用反射来实现依赖注入。而是在编译时生成依赖注入的相关代码。生成代码的基础是上面描述的注解以及使用这些注解的类和接口。一句话概括就是Dagger根据注解自动为你生成你需要在悟空类中编写的金箍棒类的初始化代码!只是生成的代码比使用new的明显初始化方法更复杂。Dagger2开发步骤把大象放在冰箱里分为几个步骤:定义依赖类和依赖对象类,悟空类和金箍棒类。“悟空类”和“金箍棒类”的构造函数都用@Inject注解修饰。定义一个用@Module注解的类,一般称为XXXModule。里面写的@Provides注解修饰的方法。这些@Provides方法返回“WukongClass”和“GoldenCudgelClass”对象。例如@ProvidesWukongprovideWukong(){returnnewWukong();}创建一个接口并用@Component注解装饰它。一般称为XXXComponent。里面写一个注入方法:voidinject(Wukongwk);。这里悟空只是一个例子。任何你要注入的类都可以替换上面参数中的悟空类。在需要注入的地方写上@Inject的字段。***,Dagger会根据上面的内容和***@Component接口生成一个DaggerXXXComponent类型,并使用这个类型来实现注入。上面的步骤1到3可以理解为依赖配置。最新的XXXComponent替代了古老的Reflect方法实现注入。第一步中@Inject修饰的构造函数和@Module的provideXXX方法中的任何一个都可以省略。Dagger可以根据这些配置中的任何一个创建依赖对象。上面写着相当于有双保险。上面多次提到。Dagger2的厉害之处在于这个库完全没有使用反射,而是使用了编译时生成代码实现的依赖注入。在配置AndroidStudio时,此功能会导致一些额外的工作。这假定您已经创建了一个新的Android应用程序项目。接下来打开build.gradle文件,我们一步步完成Dagger2的配置。3.AndroidStudio配置第一步applyplugin:'kotlin-android'//非必须applyplugin:'kotlin-android-extensions'//必须!!!为什么要添加新插件?这是为了以后使用kapt并为此提供支持。Gradle本身不支持这两个操作。第二步buildscript{ext.kotlin_version='1.0.1-2'repositories{mavenCentral()}dependencies{classpath"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"classpath"org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"}}第三步dependencies{//...其他略...compile'c??om.google.dagger:dagger:2.2'kapt'com.google.dagger:dagger-compiler:2.2'provided'javax.annotation:jsr250-api:1.0'}dagger,我们要用的master。dagger-compiler,用于生成代码。java.annotation,提供Dagger意外注解***,同步Gradle。使用Dagger2现在是Dagger大显身手的时候了。首先,我们已经有了悟空和金箍棒。代码如下:悟空:importjavax.inject.Inject;/***Createdbyuncle_charlieon6/4/2016.*/publicclassWukong{@InjectJinGuBangjinGuBang;@InjectpublicWukong(){}publicStringuseJinGuBang(){returnthis.jinGuBang.use();}}金谷榜棒:importjavax.inject.Inject;/***Createdbyuncle_charlieon6/4/2016.*/publicclassJinGuBang{@InjectpublicJinGuBang(){}publicStringuse(){return"userJinggubang";}}悟空对金箍棒有依赖,所以金箍棒属性用@Inject注解装饰。因为这两个类都需要由Dagger创建,所以在构造函数上用@Inject注解。第二步,创建@Module类创建一个用@Module注解的类,并给它添加一个用@Provides注解修饰的方法。这些方法创建依赖对象。importdagger.Module;importdagger.Provides;/***Createdbyuncle_charlieon6/4/2016.*/@ModulepublicclassXiYouModule{@Provides//@SingletonWukongprovideWukong(){returnnewWukong();}@Provides//@SingletonJinGuBangprovideJinGuBang(){returnnew);JinGuBang(}}@Singleton注解表示这个依赖对象在应用的生命周期中只有一个实例,只能写上一步提到的@Provides方法和@Inject注解构造函数中的一个。第三步@Component接口,连接@Module和@Inject@Module和@Provides方法提供依赖对象,@Component接口中出现@Inject的地方,表示需要注入的地方(一般是字段),使用@Component接口连接他们。;voidinject(Activitya);}inject()方法中使用的对象就是需要注入的对象,包含@Inject的字段。在这个接口中,也可以使用inject()方法代替provideXXX()方法,后面会介绍。注意:@Component接口必须直接指定@Module类型。第四步,使用@Component接口获取对象。经过前面的步骤,依赖和被依赖的对象关系就已经配置好了。让我们获取依赖对象来注入依赖对象。publicclassMainActivityextendsAppCompatActivity{privatestaticfinalStringTAG="##MainActivity";@InjectWukongwukong;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);/1XiYouComponentxiYouComponent=DaggerXiYouComponent.builder()//2.xiYouModule(newXiYouModule()).build();xiYouComponent.inject(this);//3welcomeTextView.setText(wukong.useJinGuBang());}}首先进入属性@注入悟空wukong;已在MainActivity中声明。这里表示一个依赖:这个activity依赖于Wukong,准备注入Wukong对象。Dagger2会在编译器中自动生成依赖注入代码,所以在添加上述代码之前需要编译一下。DaggerXiYouComponent是Dagger基于我们的XiYouModule类生成的代码。在这一步中,将XiYouModule的实例添加到DaggerXiYouComponent的构建器中。如果这个Module只需要使用一个无参数的构造函数,你可以使用一个省略的用法:create()方法。可以简写为:DaggerXiYouComponent.builder()//2//.xiYouModule(newXiYouModule())//.build().create();Component接口的对象调用inject(this)方法后,注入完成。所以可以直接使用@InjectWukongwukong;调用方法的属性:welcomeTextView.setText(wukong.useJinGuBang());***在活动中显示方法返回的文本。运行代码并查看结果。结束语以上内容可以概括为:把依赖的东西放在@Module类中(或者在依赖的地方加上@Inject无参构造函数)。任何具有依赖性(@Inject属性)的东西,将其放入@Component接口的inject()方法参数中。(或者如果有任何@Inject属性,只需在@Component接口中提供任何对象)。这个总结不一定严格,但是基本的用法都包括了。依赖注入非常有用。以上内容只是Dagger2依赖注入的一部分。读者还需要根据官方文档多练习,才能更好的理解依赖注入和Dagger的各种用法。