dagger2 module用法及分析

使用范围:当某个module被多个对象使用的时候使用。

在这里插入图片描述

1.component声明module

@Component(modules = MainModel.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
    void inject(Main2Activity activity);
}

2.module中声明方法:

@Module
@Module
public class MainModel {
    public MainModel(){
        Log.d("打印","不错"+this.getClass().getName());
    }
    @Named("testUrl")
    @Provides
    public String provideUrl() {
        return "this is url";
    }

    @Named("testName")
    @Provides
    public String provideName() {
        return "this is name";
    }
}

3.调用注入方法:

public class MainActivity extends AppCompatActivity {
    @Named("testUrl")
    @Inject
    String url;
    @Named("testName")
    @Inject
    String name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerActivityComponent.builder().build().inject(this);
        Log.d("打印","1不错"+url);
        Log.d("打印","1不错"+name);
        startActivity(new Intent(this,Main2Activity.class));
    }
}


public class Main2Activity extends AppCompatActivity {
    @Named("testUrl")
    @Inject
    String url;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        DaggerActivityComponent.builder().build().inject(this);
        Log.d("打印","2不错"+url);
    }
}

打印结果:

2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 不错yang.shuai.mydagger.MainModel
2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 1不错this is url
2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 1不错this is name
2019-04-16 18:13:23.535 6987-6987/yang.shuai.mydagger D/打印: 不错yang.shuai.mydagger.MainModel
2019-04-16 18:13:23.535 6987-6987/yang.shuai.mydagger D/打印: 2不错this is url

分析自动生成代码:

DaggerMainComponent中包含:
MainModel_ProvideUrlFactory、MainModel_ProvideNameFactory、MainActivity_MembersInjector、Main2Activity_MembersInjector

//根据方法名为module中每个方法都建立一个factory,并为每个activity创建一个注入类
private void initialize(final Builder builder) {
    this.provideUrlProvider = MainModel_ProvideUrlFactory.create(builder.mainModel);
    this.provideNameProvider = MainModel_ProvideNameFactory.create(builder.mainModel);
    this.mainActivityMembersInjector =
        MainActivity_MembersInjector.create(provideUrlProvider, provideNameProvider);
    this.main2ActivityMembersInjector = Main2Activity_MembersInjector.create(provideUrlProvider);
}
//注入MainActivity
@Override
public void inject(MainActivity activity) {
   mainActivityMembersInjector.injectMembers(activity);
}
//注入Main2Activity
@Override
public void inject(Main2Activity activity) {
  main2ActivityMembersInjector.injectMembers(activity);
}

MainModel_ProvideUrlFactory、MainModel_ProvideNameFactory代码,主要提取对应的值:

public final class MainModule_ProvideUrlFactory implements Factory<String> {
  ...
  //根据。
  @Override
  public String get() {
    return Preconditions.checkNotNull(
        module.provideUrl(), "Cannot return null from a non-@Nullable @Provides method");
  }
  ...
}

public final class MainModel_ProvideNameFactory implements Factory<String> {
  ...
  @Override
  public String get() {
    return Preconditions.checkNotNull(
        module.provideName(), "Cannot return null from a non-@Nullable @Provides method");
  }
  ...
}

MainActivity_MembersInjector源码:


public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
  private final Provider<String> urlProvider;
  private final Provider<String> nameProvider;
  ...
  //初始化urlProvider、nameProvider
  ...
  //注入调用
  @Override
  public void injectMembers(MainActivity instance) {
    ...	
    instance.url = urlProvider.get();
    instance.name = nameProvider.get();
  }
  ...
}

public final class Main2Activity_MembersInjector implements MembersInjector<Main2Activity> {
  private final Provider<String> urlProvider;
  ...
  //初始化urlProvider、nameProvider
  ...
  //注入调用
  @Override
  public void injectMembers(Main2Activity instance) {
    ...
    instance.url = urlProvider.get();
  }
  ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值