您的位置:首页 > 移动开发 > Android开发

关于Dagger2的使用心得

2017-10-14 23:42 288 查看

Dagger2

Github主页: https://github.com/google/dagger

历史:

Dagger1是由Square公司受到Guice(https://github.com/google/guice)启发创建的依赖注入框架.

Dagger2是Dagger1(https://github.com/square/dagger)的分支,由谷歌开发.该项目受到了Auto项目(https://github.com/google/auto)的启发

优点

没有使用反射,图的验证、配置和预先设置都在编译的时候执行

容易调试,完全具体地调用提供和创建的堆栈

更高的性能,谷歌声称他们提高了13%的处理性能

代码混淆,使用派遣方法,就如同自己写的代码一样

配置:

1. 在project/build.gradle 文件中添加android-apt 插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

2. 在app/build.gradle 文件中添加如下依赖

apply plugin: 'com.neenbedankt.android-apt'

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


主要的注解:

@Provides: 用来修饰方法,方法的返回类型就是所提供的依赖类型,可以简单的把方法的返回值理解为我们通常要new出来的对象.

// @Provides方法都会用provide作为前缀

@Provides
public Application provideApplication() {
return mApplication;
}


@Module: 所有的@Provides方法都必须放到一个Moudle中,一个Moudle就是使用@Moudle修饰的类,可以简单的理解为一个持有各种对象的仓库.用来给@Component组件提供实例化的对象.Android中有三种Module:

ApplicationModule:分别提供整个应用级别的(只生成一个该组件的实例)

ActivityModule:Activity级别的

UserModule:用户级别的Module

// @Module类都用Module作为后缀

@Module
public class AppModule {

private Application mApplication;

public AppModule(Application application){
this.mApplication = application;
}

@Provides
public Application provideApplication() {
return mApplication;
}
}


@Inject: 通常在需要依赖的地方使用这个注解,简单的理解为声明一个对象

@Inject
protected T mPresenter;


@Component 它是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分.我们必须用@Component注解一个接口,为该注解传入Module类,或者添加其依赖的组件

// @Component注解的接口或抽象类以Component为后缀

@Component(modules = {ApiModule.class})
public interface ApiComponent {

void inject(MainActivity mainActivity);

void inject(TestActivity testActivity);
}

// @Component注解的接口或抽象类,Dagger将会为该接口或者抽象类生成一个实现,这个实现的命名是在接口或抽象类前面加上Dagger,如ApiComponent生成的实现是DaggerApiComponent

ApiComponent apiComponent = DaggerApiComponent.builder()
.apiModule(new ApiModule())
.appModule(getAppModule())
.build();


@Scope: 用于自定义注解限定注解作用域。这是一个非常强大的特点,没必要让每个对象都去了解如何管理他们的实例

@Singleton : 代表各个注入对象为单例。

后话

Dagger2完整的例子及用法,大家可以参考我GitHub上的开源项目—>Framework

( 里面用到了:RxJava2 + Retrofit2 + Mvp + Dagger2 等框架,小伙伴们感觉不错的话欢迎star ^…^ )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android-studio