dagger2 module用法及分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangshuaionline/article/details/86650585

1.component声明module

@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

2.module中声明方法:

@Module
public class MainModule {
    public MainModule() {
    }
    @Named("testUrl")
    @Provides
    public String provideUrl() {
        return "this is url";
    }
}

3.调用注入方法:

public class MainActivity extends AppCompatActivity implements MainUiInterface{
    @Inject
    MainPresenter presenter;
    @Named("testUrl")
    @Inject
    String url;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerMainComponent.builder()
                .build().inject(this);
        Log.d("打印","不错"+url);
    }
}

打印结果:

D/打印: 不错this is url

分析自动生成代码:
根据module的每一个注入方法,都会自动生成一个工厂类。在DaggerMainComponent,有这样相关代码:

this.provideUrlProvider = MainModule_ProvideUrlFactory.create(builder.mainModule);
this.mainActivityMembersInjector =
        MainActivity_MembersInjector.create(mainPresenterProvider, provideUrlProvider);

MainModule_ProvideUrlFactory代码:

public final class MainModule_ProvideUrlFactory implements Factory<String> {
  private final MainModule module;
	//2.保存module对象
  public MainModule_ProvideUrlFactory(MainModule module) {
    assert module != null;
    this.module = module;
  }
	//主动调用二、调用module的provideUrl方法。
  @Override
  public String get() {
    return Preconditions.checkNotNull(
        module.provideUrl(), "Cannot return null from a non-@Nullable @Provides method");
  }
	//1.新建module工厂
  public static Factory<String> create(MainModule module) {
    return new MainModule_ProvideUrlFactory(module);
  }
}

MainActivity_MembersInjector源码:


public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
  private final Provider<MainPresenter> presenterProvider;

  private final Provider<String> urlProvider;
	//2.保存module工厂
  public MainActivity_MembersInjector(
      Provider<MainPresenter> presenterProvider, Provider<String> urlProvider) {
    assert presenterProvider != null;
    this.presenterProvider = presenterProvider;
    assert urlProvider != null;
    this.urlProvider = urlProvider;
  }
	//1.调用构造方法,根据presenter(和module无关,不考虑)和module工厂创建对象。
  public static MembersInjector<MainActivity> create(
      Provider<MainPresenter> presenterProvider, Provider<String> urlProvider) {
    return new MainActivity_MembersInjector(presenterProvider, urlProvider);
  }
	//主动调用一、调用inject方法的时候,默认会调用此方法,然后调用module工厂的get方法
  @Override
  public void injectMembers(MainActivity instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    instance.presenter = presenterProvider.get();
    instance.url = urlProvider.get();
  }

  public static void injectPresenter(
      MainActivity instance, Provider<MainPresenter> presenterProvider) {
    instance.presenter = presenterProvider.get();
  }

  public static void injectUrl(MainActivity instance, Provider<String> urlProvider) {
    instance.url = urlProvider.get();
  }
}

生成的代码中主要有两个功能:

1.绑定关系(method->component->view)
2.调用关系(view ->component->method)

猜你喜欢

转载自blog.csdn.net/yangshuaionline/article/details/86650585