版权声明:本文为博主原创文章,未经博主允许不得转载。 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)