最通俗易懂的Dagger2说明书

作者: anypwx | 来源:发表于2017-11-25 21:32 被阅读76次

    网上有很多的例子,长篇大论,让=,=我们这些个新手真的胆怯了。我们的读者都是接地气的人,尽量的通俗,会让大家更容易接受。
    此文是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里的实例。

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

    相关文章

      网友评论

      本文标题:最通俗易懂的Dagger2说明书

      本文链接:https://www.haomeiwen.com/subject/jwfhbxtx.html