最通俗易懂的Dagger2说明书

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

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

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

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

最通俗易懂的Dagger2说明书_第1张图片
image.png

通常我们使用这个类的话是这样做的,直接NEW
最通俗易懂的Dagger2说明书_第2张图片
image.png

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

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


最通俗易懂的Dagger2说明书_第3张图片
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

怎么使用?来看!


最通俗易懂的Dagger2说明书_第4张图片
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里的实例。

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

你可能感兴趣的:(最通俗易懂的Dagger2说明书)