android关于dagger2原理的浅聊

android关于dagger2原理的浅聊,第1张

概述基于注解的编码思想,是现在一种降低模块间耦合度的通用方式。形成了多种应用和框架技术,其中包括典型Spring的DI和IOC特色。现在基本讲解一下最简单的例子。1.首先准备依赖:implementation"com.google.dagger:dagger:2.6"annotationProcessor'com.google.dagger:dagger-compile

基于注解的编码思想,是现在一种降低模块间耦合度的通用方式。形成了多种应用和框架技术,其中包括典型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原理的浅聊所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1003737.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存