基于注解的编码思想,是现在一种降低模块间耦合度的通用方式。形成了多种应用和框架技术,其中包括典型Spring的DI和IOC特色。
现在基本讲解一下最简单的例子。
1. 首先准备依赖:
implementation "com.Google.dagger:dagger:2.6"
annotationProcessor 'com.Google.dagger:dagger-compiler:2.6'
注意:如果使用kotlin编程,应该使用
apply plugin: 'kotlin-kapt'
kapt 'com.Google.dagger:dagger-compile:2.6'
kapt是一种注解处理器,用于在编译时生成辅助代码。
2. 准备model
class Cat{}
3. 准备CatModule,依赖对象的提供方
@Module
class CatModule {
@ProvIDes
fun provIDeCar(): Car = Car()
}
4. 准备Component,依赖注入组件,将提供方的资源提供给需求方Activity
@Component{modules = [CarModule::class]}
interface CommonComponent {
fun inject(activity: MainActivity)
}
6. 最后直接在需求方MainActivity中注入
class MainActivity: AppCompatActivity() {
overrIDe fun onCreate(saveInstanceState: Bundle?) {
super.onCreate()
DaggerCommonComponent.create().inject(this)
}
}
流程搞定。
二、dagger2原理
Dagger的核心类是DaggerCommonComponent
首先@Component会在编译时生成一个DaggerCommonComponent的实现类。包含两个成员
private ProvIDer<Car> provIDeCarProvIDer; // 注入对象provIDer
private MembersInjector<MainActivity> mainActivityMembersInjector; // 向需求方的依赖注入组件
调用create(),
public static Builder builder() {
return new Builder();
}
public static MainComponent create() {
return builder().build();
}
public static final class Builder {
private CarModule carModule;
private Builder() {}
public MainComponent build() {
if (carModule == null) {
this.carModule = new CarModule();
}
return new DaggerMainComponent(this);
}
public Builder carModule(CarModule carModule) {
this.carModule = Preconditions.checkNotNull(carModule);
return this;
}
}
从源码调用实现来看,首先生成builder类,而builder类中包含依赖提供方。然后初始化
private voID initialize(final Builder builder) {
this.provIDeCarProvIDer = CarModule_ProvIDeCarFactory.create(builder.carModule);
this.mainActivityMembersInjector = MainActivity_MembersInjector.create(provIDeCarProvIDer);
}
CarModule_ProvIDeCarFactory和MainActivity_MembersInjector都是编译时自动生成的,首先看CarModule_ProvIDeCarFactory这个工厂类
public final class CarModule_ProvIDeCarFactory implements Factory<Car> {
private final CarModule module;
public CarModule_ProvIDeCarFactory(CarModule module) {
assert module != null;
this.module = module;
}
@OverrIDe
public Car get() {
return Preconditions.checkNotNull(
module.provIDeCar(), "Cannot return null from a non-@Nullable @ProvIDes method");
}
public static Factory<Car> create(CarModule module) {
return new CarModule_ProvIDeCarFactory(module);
}
}
create()直接将依赖提供方对象ProvIDer实例化,大致作用就是将ProvIDer对象传递给
MainActivity_MembersInjector中,MainActivity_MembersInjector就是将provIDer对象和activity关联起来的,总结
通过使用inject注入依赖需求方,然后MainActivity的car对象到此注入成功。
以上是内存溢出为你收集整理的android关于dagger2原理的浅聊全部内容,希望文章能够帮你解决android关于dagger2原理的浅聊所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)