最通俗易懂的Dagger2说明书

网上有很多的例子,长篇大论,让=,=我们这些个新手真的胆怯了。我们的读者都是接地气的人,尽量的通俗,会让大家更容易接受。
此文是dagger2入门级说明书,专门给那些 对dagger2还处于传说中的大侠们。
第一次写作,喷的时候请照顾一下我的感受,轻一点。大家耐心看完!

本文通篇采用dagger2 为了方便 简写成dagger了,版本是最新版本 2.11
dagger?理解它的意思,使用起来还是挺简单方便的。

正式开始演讲!坐好
dagger是干什么用的? 此处问题真是精妙啊
第一:使用dagger 可以使你长寿点
第二:使用dagger使你的逼格更高了一点。

嘎嘎==,,算了算了 ,不逗了不逗了,别打我!!
dagger是用来管理实例的创建的(是我把个人理解强加给你们了)
日常举例:
有个User类

image.png

通常我们使用这个类的话是这样做的,直接NEW
image.png

使用dagger 就是让它帮我们做这些事情的:帮你管理项目中实例的创建!
补充一下 dagger的使用方式是采用注解形式的

忘记放依赖了 哈哈哈哈 不要说我粗心


image.png

在dagger 中提供了两个创建实例的方案:
1、使用@Inject + component
2、使用@module + component

① 使用 @Inject + component

我带你看一个简单的例子

public class PojoTest {

        public PojoTest() {

        }


        private String uname;

        public String getUname() {
                return uname;
        }

        public void setUname(String uname) {
                this.uname = uname;
        }
}

以前我们要用这个pojo类 是不是需要new? 对不对? 比如有十个Activity用到了 ,你是不是要在十个地方new?
PojoTest pojoTest = new PojoTest();
现在你用了dagger 那就不用这样了。

public class PojoTest {

        @Inject
        public PojoTest() {

        }


        private String uname;

        public String getUname() {
                return uname;
        }

        public void setUname(String uname) {
                this.uname = uname;
        }
}

有没有看到区别?在构造方法上面添加一个注解@Inject。这个注解代表什么意思呢?哎,这个注解代表此类的构造方法交由dagger 来管理。
我们都知道构造方法是用来new 实例的 嘿嘿,是不是现在你有点恍然大悟了。没错!
就是托管给了dagger来帮你new!

有点口干了,接着来。
然后创建component类,注意有注解@Component

@Component
public interface AppComponent {

    void inject(MainActivity mainActivity);
    
}

这里我先不讲component是干嘛用的,后来会详细的讲清楚。
那么我们就可以使用这个PojoTest类的实例了
rebuild一下,dagger会生成AppComponent的操作类DaggerAppComponent

怎么使用?来看!


image.png

定义PojoTest 类的变量;也要加上 @Inject
这里的注解意思是 取这个pojo类的实例,并赋给变量pojoTest。
最后在onCreate()利用生成的DaggerAppComponent类初始化dagger 。整个过程堪称完美!

②使用@module + component

先来解释一下什么是
module:在我的理解就是 module是统一管理实例的(也是解决管理第三方依赖库中的一些实例的方法,你在无法修改他们的源码添加@Inject的时候,对吧?)
componentcomponent是统一连接moduleactivity(不仅仅是activity啊,你所有需要用实例的地方都可以)的一个纽带。
请看代码!!!

module ----》》》》AppModules

@Module
public class AppModules {

        @Singleton
        @Provides
        public PojoTest2 getPojoTest2(){
                return new PojoTest2();
        }

        @Singleton
        @Provides
         public PojoTest3 getPojoTest3(){
                 return new PojoTest3();
        }

}

module 提供了对生产实例的集中管理。其中 @Module表示此类为一个module
@Provides表示此方法是提供实例的方法。一般 @Module@Provides是成对出现的。
@Singleton这个表示此方法是单例

Component ----》》》》AppComponent

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

        void inject(MainActivity mainActivity);

        void inject(TestActivity testActivity);

Component 一定是一个接口!!
Component 连接了module与需要使用实例的地方的组件(实在是不知如何解释给你们听了)
日常比方:module是对生产实例的集中管理,对吧?那么生产的实例需要被使用吧,不然你生产出来干嘛?对吧?
现在mainActivityTestActivity需要用到module里的某些实例。怎么办?activitymodule没有啥联系啊,就像一条河。
你要过去对岸拿东西,是不是必须坐船,吊索,过桥。不管你用什么方式去到对岸,你都要借助一些工具或者称为载体。
activity怎么从module 中拿到实例?答案就是Component!! Component就是那艘船,那条钢索,那座桥!!
它把moduleactivity 联系起来。使activity通过Component拿到module中的实例。各位大侠,现在是不是有点门道了?
我感觉我已经解释的很清楚了_

@Component(modules = AppModules.class)

这句话表示Component 连接的是哪个module。这里是支持多个module

@Component(modules = {AppModules.class,AppModules2.class })
void inject(MainActivity mainActivity);

这句话表示谁来用取这些实例。换句话说就是module里的实例需要被谁用到。这里写的是MainActivity
意思就是Maintivity需要用到module里生产的实例

你以为这样就完了? 小伙子! 太年轻了哈哈哈哈哈哈

话说Componentmodule 都有了,是不是也要看看activity是怎么通过Componentmodule里的实例啊。
这才是大家关心的
来rebuild一下,dagger会自动生成刚上面创建的AppComponent 的一个DaggerAppComponent操作类,才能继续往下走。
看代码吧,代码才是说明一切的道理

public class TestActivity extends Activity {
        private AppComponent appComponent;

        @Inject
        PojoTest2 pojoTest2;


        @Inject
        PojoTest3 pojoTest3;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_test);
                appComponent = DaggerAppComponent.builder().appModules(new AppModules()).build();
                appComponent.inject(this);

        findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                        pojoTest2.setUname("我是真的爱你彭文雄啊");
                        pojoTest3.setUname("证明一个事情,会不会成功");
                }
        });

        findViewById(R.id.btn_2).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                        Log.i("pwx",pojoTest2.getUname());
                        Log.i("pwx",pojoTest3.getUname());
                }
        });

appComponent = DaggerAppComponent.builder().appModules(new AppModules()).build();
appComponent.inject(this);

各位大侠,看到没有,最终 activity 就是这样通过Componentmodule里的实例。

到此 全剧终。谢谢大家耐心看完。_

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容