初学Dagger之Hello Dagger(0)

写作背景
这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技术博客学习,发现对于一个未曾使用过类似框架的人来说上手很困难,因此撰 初学Dagger 系列学习笔记,以一名初学者的视角来分享自己的学习经验,希望让大家上手更顺利。本文集将随Winter的学习进度更新。

Hello Dagger

环境配置
我比较喜欢从功能入手来了解一个框架,所以让我们从Hello Dagger开始吧。

用 Android Studio 新建一个项目,选择 Empty Activity

如上图,新建一个项目 Hello Dagger, 选择 Empty Activity 模版。项目创建好后,在build.gradle(Project: HelloDagger)文件中的dependencies内添加

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

在build.gradle(Module: app)文件中最外层的上方添加

apply plugin: 'com.neenbedankt.android-apt'

继续在该文件内的dependencies内添加

// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'

这样,Dagger的环境便配置好了,下面让我们来开心地实现Hello Dagger.

代码实现
官方的例子有点复杂,我表示看起来很吃力,所以,这里我们实现一个最简单的Dagger demo就好了: 点击按钮,获取Dagger注解的一个String,并显示Toast。
首先,在activity_main布局中添加一个按钮, 用于触发事件,如下:

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Say hello"/>

然后创建建一个类文件 AppModule

@Module
public class AppModule {
@Provides
String provideHello() {
return "hello dagger";
}
@Provides
@Named("hi")
String provideHi() {
return "hi dagger";
}
}

@Module : 依赖的提供者,通俗的说就是该类负责提供数据内容;
@Provides : 负责提供值,被注解的方法提供返回参数类型的数据,如果同一个module中多个provides返回参数类型一致,那么必须加@Named("xxx")以进行区分,其实xxx才是该provides的真正名字,方法名没有什么意义。
再来创建一个接口文件 AppComponent

@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}

@Component :依赖的注入者,AppComponent在编译时会自动生成 DaggerAppComponent文件,因为modules = {AppModule.class},所以DaggerAppComponent可以访问AppModule.class内的内容,接口内有方法 void inject(MainActivity activity) ,所以该接口也可以访问MainActivity,因而可以成为MainActivity与AppModule.class之间的桥梁。
先编译一下,使AppComponent生成DaggerAppComponent文件,接着在MainActivity的onCreate()方法内添加以下代码

DaggerAppComponent.builder()
.appModule(new AppModule())
.build()
.inject(this);

这样一来,AppModule内的内容便注入到MainActivity中了,现在我们可以在MainActivity中访问AppModule里面的内容了,访问方式如下,在MainActivity中添加全局变量

@Inject
String hello;
@Inject
@Named("hi")
String hi;

@Inject :需要注入依赖的地方,Dagger 会构造一个该类的实例并满足它所需要的依赖,通俗地说就是该变量被初始化为AppModule中@Provides且同类型同名(@Named相同)的方法的返回值了。
感觉还是挺神奇,这里为了方便把注入写在MainActivity中了,如果在Application中注入,那么仅需初始化一次,该Application下的所有类都能访问了。
好了,为按钮添加点击事件,并showToast看看。
Demo地址如下:
https://github.com/XunMengWinter/HelloDagger

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 dagger2是一个依赖注入的框架,举个例子如果我们不适用dagger注入,我们调用一个对象必须使用构造...
    王学岗阅读 1,745评论 5 21
  • Dagger官网[https://github.com/google/dagger]Dagger Document...
    _九卿_阅读 921评论 0 1
  • V2.16 Summary 在任何应用程序中,最好的类都是那些做事情的类:BarcodeDecoder、Koopa...
    屰沨阅读 309评论 0 0
  • dagger2三年前写项目就一直在用,今天再炒一次剩饭,总结归纳,便于以后复习 dagger2理解 一个很厉害的"...
    奋斗小青年Jerome阅读 548评论 0 6
  • 二 在我小的时候,很喜欢听我姑婆讲故事,她最爱讲的是“小时拿针,长大偷金”的故事。故事讲述的是古代有...
    霰雪1973阅读 230评论 0 1