zoukankan      html  css  js  c++  java
  • Dagger2----一个最简单的Dagger2依赖的实现

    Dagger2是首个使用生成代码实现完整依赖注入的框架,极大降低了使用者的编码负担。Dagger2分析全部依赖并生成代码将这些依赖组织在一起,关于很多其它的Dagger2理论介绍请移步具体解释Dagger2(中文版)Tasting Dagger 2 on Android(可能须要梯子)。

    本次我们主要介绍怎样完毕一个最简单的Dagger2依赖项目,当中包含dagger2的Gradle加入和最基本注入关系处理。首先介绍注解的几个概念:

    • @Inject: 通常在须要依赖的地方使用这个注解。换句话说。你用它告诉Dagger这个类或者字段须要依赖注入。这样。Dagger就会构造一个这个类的实例并满足他们的依赖
    • @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类。用@Module注解。这样Dagger在构造类的实例的时候,就知道从哪里去找到须要的 依赖。

      modules的一个重要特征是它们设计为分区并组合在一起(比方说。在我们的app中能够有多个组成在一起的modules)。

    • @Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

    • @Component: Components从根本上来说就是一个注入器。也能够说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components能够提供全部定义了的类型的实例。比方:我们必须用@Component注解一个接口然后列出全部的@Modules组成该组件,如 果缺失了不论什么一块都会在编译的时候报错。

      全部的组件都能够通过它的modules知道依赖的范围。


    接下来就让我们进入代码部分吧,首先新建项目,在Project的build.gradle里面加入apt classpath例如以下:

    dependencies {
            classpath 'com.android.tools.build:gradle:2.0.0'
            classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }

    在app 的build.gradle文件中面加入Dagger2依赖,例如以下所看到的:

    apply plugin: 'com.android.application'
    apply plugin: 'com.neenbedankt.android-apt'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "24.0.0 rc2"
    
        defaultConfig {
            applicationId "com.tt.simpledagger2demo"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.3.0'
        apt 'com.google.dagger:dagger-compiler:2.2'
        compile 'com.google.dagger:dagger:2.2'
        provided 'javax.annotation:jsr250-api:1.0'
        compile 'com.jakewharton:butterknife:7.0.1'
    }

    注意apply plugin: 'com.neenbedankt.android-apt'这一句,不要忘了喔。
    完毕以上步骤就完毕了Dagger2的gradle依赖。
    编译一下不报错那就go on吧。
    新建UserModel实体类。我们在实体类内部模拟数据的生成就好(PS,为了简单),代码例如以下:

    public class UserModel {
        private String userName = "123";
        private String userPass = "456";
        private String address;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserPass() {
            return userPass;
        }
    
        public void setUserPass(String userPass) {
            this.userPass = userPass;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public UserModel() {
        }
    
        public UserModel(String userName, String userPass, String address) {
            this.userName = userName;
            this.userPass = userPass;
            this.address = address;
        }
    }

    完毕数据层实体部分的编写。接下来我们就要把数据注入到MainActivity中。新建ActivityModule:

    @Module
    public class ActivityModule {
        @Provides
        UserModel provideUserModel() {
            return new UserModel();
        }
    }

    如上使用@Module标识我们ActivityModule类提供依赖。接着我们使用@Component标识注入:

    @Component(modules = ActivityModule.class)
    public interface ActivityComponent {
        void inject(MainActivity mainActivity);
    }
    

    在MainActivity中,初始化Dagger2注入:

    @Bind(R.id.textview)
        TextView mTextview;
        private ActivityComponent mActivityComponent;
        @Inject
        UserModel userModel;

    在onCreate函数中改动例如以下:

    mActivityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule()).build();
            mActivityComponent.inject(this);
            mTextview.setText(userModel.getUserName()+"----"+userModel.getUserPass());

    小伙伴们。是不是突然感觉脸要绿了,为啥呢?好像是DaggerActivityComponent这个东东不存在唉,是不是哪里错了啊?

    哈哈。事实上并没有。前面也说了Dagger2是首个使用生成代码实现完整依赖注入的框架。所以这样的依赖类仅仅有rebuild以后才干有喔。赶紧rebuild一下点绿色三角运行一下,我的运行结果例如以下:
    这里写图片描写叙述

    完整源代码:完整源代码
    參考:Dependency Injection with Dagger 2
    使用Dagger 2进行依赖注入

  • 相关阅读:
    java语言中public、private、protected三个关键字的用法,重写和重载的区别。
    MVC模式中M,V,C每个代表意义,并简述在Struts中MVC的表现方式。
    abstract class和interface有什么区别?
    简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。
    在项目中用过Spring的哪些方面?及用过哪些Ajax框架?
    简述基于Struts框架Web应用的工作流程
    List、Map、Set三个接口存储元素时各有什么特点?
    mybatis查询时间段sql语句
    Maven pom.xml中添加指定的中央仓库
    为什么需要RPC,而不是简单的HTTP接口
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7220971.html
Copyright © 2011-2022 走看看