Dagger2

最近工作比较闲,没事就来写写博客。

为啥要用Dagger? 其实就是不想重复写new对象,主要目的是解决重复劳动力

Dagger的注解

@Component  包含一组提供实例的Module

@Module  包含一组@Proivde

@Provide 在Module里面提供实例对象

@Inject  在类的构造方法声明表示提供实例,在全局变量上面进行声明表示对此变量进行注入

@Scope 

@Qualifier 

现在android开发都是用dagger.android来开发

使用方法在app builde.gradle中添加

// Dagger dependencie
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
provided 'org.glassfish:javax.annotation:10.0-b28'
compile "com.google.dagger:dagger:$rootProject.daggerVersion"
compile "com.google.dagger:dagger-android:$rootProject.daggerVersion"
compile "com.google.dagger:dagger-android-support:$rootProject.daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.daggerVersion"

自定义Application extends DaggerApplication

public class MyAppliaction extends DaggerApplication {
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }
}

编写AppComponet extends AndroidInjector<自定义的application>

@Component(modules = {
        AppModule.class,
        ActivityBindModule.class,
        AndroidSupportInjectionModule.class
})
public interface AppComponent extends AndroidInjector<MyAppliaction>{

    @Component.Builder
    interface Builder {
        @BindsInstance
        AppComponent.Builder application(Application application);

        AppComponent build();
    }
}

编写Module  module类为abstract

@Binds 的使用必须用在abstract方法前面 ,返回值必须是接口,传入的参数是这个接口的实现类(子类)

@Module
public abstract class AppModule {

    @Binds abstract Context bindContext(Application application);
}
@Module
public abstract class ActivityBindModule {

    @ActivityScope 

    @ContributesAndroidInjector(modules = {MainFragmentModule.class})
   // ContributesAndroidInjector主要是解决之前的SubComponent.Builder 这些重复的代码 使用这个注解daggger自动编译SubComponet
    abstract MainActivity mainActivity();

}

自定义Scope 其实就是为了同一个作用域中使用的相同的对象 如果不用这个同一个作用域中每次都会重新创建一个新的对象

@Documented
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
@Module
public abstract class MainFragmentModule {

    @ContributesAndroidInjector
    abstract MainFragment mainFragment();

}

参考:

https://blog.csdn.net/qq_24442769/article/details/79406216

https://blog.csdn.net/qq_17766199/article/details/73030696

https://www.jianshu.com/p/465d22027e58

https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值