码迷,mamicode.com
首页 > 移动开发 > 详细

android关于dagger2原理的浅聊

时间:2021-06-02 11:10:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:代码   nal   err   common   googl   依赖   cond   member   instance   

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

标签:代码   nal   err   common   googl   依赖   cond   member   instance   

原文地址:https://www.cnblogs.com/ai-shang/p/14812706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!