Dagger2入门

Dagger2是Google出的依赖注入框架。该框架是基于square开发的dagger基础上开发的。

Dagger2的原理是在编译期生成相应的依赖注入代码。这也是和其他依赖注入框架不同的地方,其他框架是在运行时期反射获取注解内容,影响了运行效率。

Dagger起初square公司开发,后来谷歌对它进行修改及维护。是一款基于java注解来实现的编译期生成的依赖注入开源库,主要用于模块间解耦,提高代码的健壮性和可维护性

我们为什么要使用依赖注入?我们之所以是用是因为依赖注入最重要的就是解耦,达到高聚合低耦合的目的,保证代码的健壮性,灵活性,可维护性。

三种实现方法:

构造方法

setter方法

接口注入

使用过程中出现的注解:

@Module:作为实例对象的容器。

@Provides:标注能够提供实例化对象的方法。

@Component:作为桥梁,注入对象的通道。

@Inject:需要注入的方法

//Dagger2需要配置的东西

最外层的build里面配置插件

buildscript {

    ....

    dependencies {

        classpath 'com.android.tools.build:gradle:2.1.0'
        // 添加android-apt 插件
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}
//在里层build里面配置插件与权限
apply plugin: 'com.android.application'
// 应用插件
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.mahao.alex.architecture"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'

    // dagger 2 的配置
    compile 'com.google.dagger:dagger:2.4'
    apt 'com.google.dagger:dagger-compiler:2.4'
    compile 'org.glassfish:javax.annotation:10.0-b28'// 添加java 注解库
}

先看实例化部分(容器),在此处是Module

@Module   //提供依赖对象的实例
public class MainModule {

    @Provides // 关键字,标明该方法提供依赖对象
    Person providerPerson(){
        //提供Person对象
        return new Person();
    }


}
沟通部分Component

@Component(modules = MainModule.class)  // 作为桥梁,沟通调用者和依赖对象库
public interface MainComponent {

    //定义注入的方法
    void inject(MainActivity activity);

}
使用者Actvity中调用。

public class MainActivity extends AppCompatActivity{

    @Inject   //标明需要注入的对象
    Person person;

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

        // 构造桥梁对象
        MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule()).build();

        //注入
        component.inject(this);

    }
}
创建Component(桥梁),并调用注入方法。

        // 构造桥梁对象
        MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule()).build();

        //注入
        component.inject(this);


需要参数的实例化对象

Person的构造方法发生了变化,需要传入一个Context,代码如下:
public class Person {
    private Context mContext;
    public Person(Context context){
        mContext = context;
        Log.i("dagger","create");
    }
}
//这样的话,我们需要修改MainModule
@Module   //提供依赖对象的实例
public class MainModule {
    private Context mContext;
    public MainModule(Context context){
        mContext = context;
    }
    @Provides
    Context providesContext(){
        // 提供上下文对象
        return mContext;
    }
    @Provides // 关键字,标明该方法提供依赖对象
    @Singleton
    Person providerPerson(Context context){
        return new Person(context);
    }
}
//修改providerPerson方法,传入Context对象。
//添加providesContext(),用以提供Context对象。
// 构造桥梁对象
        MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule(this)).build();
        //注入
        component.inject(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值