Dagger2实现依赖注入之一步一步带你入门

一、首先你要知道什么是依赖?

想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。这里给大家举个通俗易懂的例子,让你秒懂什么是依赖,你今天去办港澳通行证,出入境告诉你想办理这个证你要携带你的个人身份证和户口本,不然不给你办,这个时候就产生了一个依赖关系,通行证的办理需要依赖身份证和户口本,我们就想到用代码实现可以如下。

     
     class PassPort{

            private IDCardBean mIDCard;
            private FamilyRegisterBean mFamilyRegister;

            public PassPort(){
                this.mIDCard = new IDCardBean();
                this.mFamilyRegister = new FamilyRegisterBean();
            }
        }


或者

    
    class PassPort{

        private IDCardBean mIDCard;
        private FamilyRegisterBean mFamilyRegister;

        public PassPort(IDCardBean mIDCard, FamilyRegisterBean mFamilyRegister){
            this.mIDCard = mIDCard;
            this.mFamilyRegister = mFamilyRegister;
        }
    }

    IDCardBean mCard = new IDCardBean();
    FamilyRegisterBean mFR = new FamilyRegisterBean();

    PassPort mPassPort = new PassPort(mCard, mFR);
 }


上面两段代码咋一看没啥毛病,但是如果现在我告诉你,你去办理身份证也同时需要带户口本还有身份证照片回执等,办理户口本还需要各种证明等,那么这个时候 IDCardBean 和 FamilyRegisterBean 的构造函数是不是也要相应地做出改变,而通行证 PassPort 的代码是不是也要做出修改,这时就有人说了,没事啊我可以改,那么如果你项目中有一百个地方都用到了呢,你是不是都要逐个逐个去改呢?为了不需要改动太多地方,我们必须给通行证和身份证、户口本进行降耦。

二、知道依赖的概念后,你要知道Dagger2是个什么东西

从上面的例子可以看出,如果按照我们日常的编码习惯,如果存在依赖关系的某一处有一些小修改,都可能会给代码量大的项目造成很大的改动,这样是不符合工程思想的,所以就出现了各种依赖注入框架,Dagger2就是其中的一个,它的前身是Dagger1,Dagger1是由Square公司开发的,而Dagger2却是由谷歌公司接手开发,两者还是存在一些区别的,不过这篇文章不会做太多介绍,主要还是教会大家如何使用Dagger2。


三、初步了解Dagger2后,你需要知道几个重要的概念

在正式使用Dagger2之前,你需要了解以下几个重要的注解,为了方便大家的理解,我会用最通俗的话来解释,如果想知道更多的可以查看官方文档。

1、@Inject:目标类用这个注解修饰的一些方法或者属性(字段),说明这个目标类需要这个依赖,比如上面例子中就可以在身份证字段和户口本字段上加上这个注解

2、@Module:用这个注解修饰的类说明是一个提供依赖的类,比如我们可以把通行证的依赖身份证和户口本一起放在用这个注解修饰的类中

3、@Provide:这个注解主要用来修饰 @Module 修饰的类中的方法

4、@Component:这个是把 @Inject 和 @Module 关联在一起的桥梁

5、@Scope:作用域

四、你需要知道Dagger2的使用步骤

1、定义所需要的bean,比如前面的 PassPort 、IDCardBean 之类的,然后在需要注入依赖的地方标上 @Inject 注解。

2、定义一个类,命名为 XXXModule ,比如 PassPortModule,用 @Module 注解这个类。

3、在PassPortModule 这个类中定义你需要提供依赖的方法,这些方法名一般为 provideXXX,而且要用 @Provides 来注解,方法体就是 new 一个依赖实例,比如 new 一个 IDCardBean 实例。

4、创建一个接口,一般命名为 XXXComponent,接口要用 @Component 注解,并需要传入相应的 module 参数,例如 @Component(modules = PassPortModule.class),另外需要提供一个注入方法,一般写成 void inject(目标类 tmp),比如 void inject(PassPort passPort)

五、开始上代码

1、在根项目(project)的 build.gradle 中添加以下代码,为了添加 apt 插件
    
    dependencies {
          
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
           
    }


2、在 app (module)的 build.gradle 中添加以下代码
    
    dependencies {
          
        apt 'com.google.dagger:dagger-compiler:2.6'
        compile 'com.google.dagger:dagger:2.6'
           
    }


注意上面两个步骤的版本可能会有所不一样。

3、定义PassPortActivity,并在需要依赖的属性上用 @Inject 注解
    
    public class PassPortActivity extends BaseActivity{

        @Inject
        IDCardBean mIDCard;

        @Inject
        FamilyRegisterBean mFamilyRegister;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(getContentViewId());

        }

    }


4、定义PassPortModule,并用 @Module 注解这个类,类里面写上提供依赖的方法,方法用@Provides注解,方法体则是 new 出依赖实例
    
    @Module
    public class PassPortModule {

        private final PassPortActivity mView;

        public PassPortModule(PassPortActivity view) {
            this.mView = view;
        }

        @PerActivity
        @Provides
        public IDCardBean provideIDCard() {
            return new IDCardBean(mView);
        }

        @PerActivity
        @Provides
        public FamilyRegisterBean provideFamilyRegister() {
            return new FamilyRegisterBean(mView);
        }

    }

5、定义PassPortComponent
    
    @PerActivity
    @Component(dependencies = ApplicationComponent.class, modules = PassPortModule.class)
    public interface PassPortComponent { 

        void inject(PassPortActivity activity);

    }


6、这个时候依赖关系就已经建立好了,你需要重新编译一下你的工程,Android studio 的快捷键是 ctrl+f9

7、在你 onCreate 方法里面添加以下代码
    
    DaggerPassPortComponent.builder()
                    .applicationComponent(getAppComponent())
                    .passPortModule(new PassPortModule(this))
                    .build()
                    .inject(this);


到现在,你已经会Dagger2的基本使用了,这里说明一下,如果你没进行第6个步骤,或者这个步骤中编译出错,那么你是无法进行到第七步的,因为这篇文章只讲解Dagger2的基础使用,有兴趣深入了解的可以期待下我的另一篇文章Dagger2实现依赖注入之深入探究,我会带着大家看下Dagger2生成的代码中是如何工作的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章