最近工作比较闲,没事就来写写博客。
为啥要用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/