Android 依赖注入: Dagger 2 实例解说(一)

摘要:
我仍然关心这个项目。我将介绍达格尔2。匕首2是匕首1的增强版本。x提前通过演示。在匕首1。x、 @Inject和@Providesannotation构成了对象的图形,它们之间的依赖关系将它们联系起来。例如:@ComponentpublicinterfaceActivityComponent{MainActivityinjectActivity;ToastHelpergeToastHelper();}编译时,Dagger2将自动生成Dagger_Dagger,即此接口的实现,前缀为ActivityComplete。通过调用this builder()方法获取一个实例,通过此方法返回的生成器设置其他依赖项,并通过build获取一个新实例。凝视1:配置取决于匕首2。版本号为2.0-SNAPSHOT。与之前的版本号相比,Dagger从com.square.Dagger更改为com.google.Dagger,这不是关键点。

本文原创,转载请注明出处:http://blog.csdn.net/zjbpku

[Duplicated]   link to  Dagger on Android - Dagger2具体解释

关于Dagger,在之前的博文(Android 依赖注入:Dagger 实例解说(Demo下载))中已有介绍, 本文说的Dagger 2主要是由Google技术

人员參与开发的。当然包含Square的各位及其它一些Contributors在内的大牛也贡献了不少。

该项目大概是从去年11月份開始启动的。到眼下该项

目还在继续进行,Snapshot version也是刚刚公布不久,从Github提供的内容看,不久会是Pre Release Version,然后才是Release Version,因为

如今还是预览版,还不稳定,请慎重使用。到Pre Release时才会相对照较稳定。能够使用来进行项目开发。本人关注这个项目依然,就提前通过一

个Demo来简介一下Dagger 2.

                                                                                 Android 依赖注入: Dagger 2 实例解说(一)第1张

Dagger 2是Dagger 1.x的增强版。在Dagger 1.x中,@Inject和@Provides annotation 构成了对象的图谱(graph),依靠之间的依赖

关系而链接在一起。

通过定义好的图谱集(ObjectGraph)能够方便的调用代码。

而在Dagger 2中。这样的关系被带有无參方法的接口取代,

这样的方法返回的类型就是所需类型。

这样的接口的实现是通过@Component 注解且传入modules參数来定义的。如:

@Component(
//        dependencies = ApplicationComponent.class,
        modules = ActivityModule.class
)
public interface ActivityComponent {
    MainActivity injectActivity(MainActivity activity);

    ToastHelper getToastHelper();
}

在编译时,Dagger 2会自己主动生成以Dagger_为前缀的此接口的实现Dagger_AcitvityComponent.通过调用此的builder()方法来获得一个

实例,通过该方法返回的builder来设置其它依赖,通过build来获得一个新的实例。

 this.component = Dagger_ActivityComponent.builder()
//                .applicationComponent(((DaggerApplication) getApplication()).getComponent())
                .activityModule(new ActivityModule(this))
                .build();

另外一点,假设@Component注解的接口中的方法没有參数,生成的实例中会生成一个create()方法,此create()方法实际上就是
builder().build();此点在以后的代码中会提到。

以下介绍Demo:

Demo使用最新的AndroidStudio (下面简称AS)1.0.2版本号,既然使用AS,就少不了gradle.build文件的配置。此项目gradle配置例如以下:

apply plugin: 'com.android.application'
apply plugin: 'android-apt'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' // 3
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots/'
        }
    }
}
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.zjbpku.dagger2"
        minSdkVersion 19
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

def Dagger2_Version = '2.0-SNAPSHOT'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    // 1. Dagger 2.0
    compile "com.google.dagger:dagger:$Dagger2_Version"
    apt "com.google.dagger:dagger-compiler:$Dagger2_Version"
    // 2.
    compile 'org.glassfish:javax.annotation:10.0-b28'
}
分别看一下gradle.build文件里凝视1。2,3。

凝视1:是配置依赖Dagger 2,版本号是2.0-SNAPSHOT,这里相比之前版本号的Dagger就是从com.square.dagger 变为如今的com.google.dagger,

当然这不是重点。

凝视2:为什么要加上这一句呢?由于Dagger 2 中会用到@Generated注解(后面讲),而javax.anotation.generated在java 6及以上的版本号中都有,

在Android API 中是没有的,所以在Android项目中一定要加此句,假设不加就有提示下面错误:

error: cannot find symbol class Generated
error: package javax.annotation does not exist

凝视3:就不多少了,详细作用请看http://blog.csdn.net/zjbpku/article/details/22976291,另不要忘记加 

apply plugin:android-apt

在之前的Dagger中@module是一个关键注解,在Dagger 2中相同少不了,此Demo中用到的两个Module例如以下:(用过Dagger的不会认为有问题)

ActivityModule.java:

/**
 * Created by zjbpku on 12/20/14.
 */

@Module
public class ActivityModule {

    private Activity mActivity;

    public ActivityModule(Activity activity) {
        mActivity = activity;
    }

    @Provides
    Activity providesActivity() {
        return mActivity;
    }

}

ApplicationModule.java:

/**
 * Created by zjbpku on 12/20/14.
 */
@Module
public class ApplicationModule {
    Application mApplication;

    ApplicationModule(Application application) {
        mApplication = application;
    }

    @Provides
    Application providesApplication() {
        return mApplication;
    }
}

写好之后,加入两个@Component注解的接口,此Demo很easy。仅仅是来尝试使用一下Dagger 2,Application相关的事实上能够不用,对Demo不会

有什么影响,但在实际项目中还是必须加入的,所以这里也给加上。

Activityomponent.java:

/**
 * Created by zjbpku on 12/20/14.
 */

@Component(
        dependencies = ApplicationComponent.class,
        modules = ActivityModule.class
)
public interface ActivityComponent {
    MainActivity injectActivity(MainActivity activity);

    ToastHelper getToastHelper(); 
}


ApplicationComponent.java:

/**
 * Created by zjbpku on 12/20/14.
 */
@Component(
        modules = ApplicationModule.class
)
public interface ApplicationComponent {
    DaggerApplication injectApplication(DaggerApplication application);
}


DaggerApplication.java:

/**
 * Created by zjbpku on 12/20/14.
 */
public class DaggerApplication extends Application {

    private ApplicationComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        this.component = Dagger_ApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
        this.component.injectApplication(this);
    }


    ApplicationComponent getComponent() {
        return this.component;
    }
}

//加入仅仅是为了測试

ToastHelper.java:

/**
 * Created by zjbpku on 12/22/14.
 */
public class ToastHelper {

    @Inject
    ToastHelper() {
    }

    //@Inject
    //Utils utils;
    Toast toast = null;

    public void showToast(Context context, CharSequence text) {
        if (toast == null) {
            toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
        } else {
            toast.setText(text);
        }
        toast.show();
    }

    public void show(Context context) {
       // showToast(context, utils.getContent());
    }
}


MainActivity.java:

package com.example.zjbpku.dagger2;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity {

    private ActivityComponent component;
//    @Inject
//    ToastHelper toastHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.component = Dagger_ActivityComponent.builder()
                .applicationComponent(((DaggerApplication) getApplication()).getComponent())
                .activityModule(new ActivityModule(this))
                .build();
        this.component.injectActivity(this);
        setContentView(R.layout.activity_main);
    }


    public void helloDagger2(View v) {
//        toastHelper.showToast(this, "Dagger 2");
//        toastHelper.show(this);
        this.component.getToastHelper().showToast(this, "Dagger 2 Demo");
    }

}

        能够看到。Dagger 2 消除了Dagger 1.x 中全部的映射(reflection),通过加入@Component。移除ObjectGraph/Injector使代码更加的清晰了。

到此,Dagger 2的基本使用方法已经结束,在ActivityComponet接口中你发现有getToastHelper()方法,在Mainctivity中发现@Inject注解的ToastHelper

是注销的。且在helloDagger2(View v)方法中也是注销的。这是由于。開始时getToastHelper()方法是没有的。是直接在Mainctivity中通过@Inject直接注入

的,后来阅读Dagger 2的相关资料发现,事实上这并非Dagger 2的所期望的,Dagger 2希望使用@Component注解接口将依赖关系链接起来,所以才改用

如今这样的方法。事实上两种都能达到一样的效果。仅仅是Dagger自己主动生成的代码有所差异,这个之后会进一步介绍。




免责声明:文章转载自《Android 依赖注入: Dagger 2 实例解说(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇netcore 依据注解自动注入目标检测之faster-RCNN和FPN下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android Touch事件原理加实例分析

       Android中有各种各样的事件,以响应用户的操作。这些事件可以分为按键事件和触屏事件。而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制。        Android Touch事件原理描述        一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOW...

5个Android开发中比较常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存...

react 执行 yarn build ,无法直接打开dist文件下的index

如果你使用create-react-app创建项目,执行命令 yarn build 后,直接以静态方式打开build文件夹内的index.html,会看到页面显示出现问题,打开console后会看到js、css、svg等文件的路径出现问题。 解释: 在打包之前,在 package.json 中 private 下(位置任意)添加"homepage": "....

Android源码分析(二)-----如何编译修改后的framework资源文件

一 : 编译framework资源文件 如果修改android framework资源文件,需要先编译资源文件,然后再编译framework才可以正常引用,进入项目目录 cd work/source/frameworks/base/core/res/ 执行mm 编译 framework-res.apk(原生或高通)编译完后com.android.inte...

Android Monkey压力测试使用

一、Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。只针对Activity做测试,不能对Servic...

Android开发之AIDL的使用一--跨应用启动Service

启动其他App的服务,跨进程启动服务。 与启动本应用的Service一样,使用startService(intent)方法 不同的是intent需要携带的内容不同,需要使用intent的setComponent()方法。 setComponent()方法需要传入两个参数,第一个参数是包名,第二个参数是组件名。即,第一个参数传入要启动的其他app的包名,第二...