我正在使用Dagger 2.24版
关于带有子组件的此模块声明:
@Module(subcomponents = MySubComponent.class)
abstract class MyModule {
...
}
我理解(如果我在这里已经理解错了,请指出)此代码意味着MyModule
下的类属于MySubComponent
。
某些教程说,
此代码可以使Dagger自动检测是否请求子组件。
是什么意思?这是否意味着在编译时Dagger可以通过扫描代码库来确定是否请求此子组件,以查看此模块中的任何对象是否受任何代码依赖,如果不存在,则在编译时不会生成MySubComponent(及其包含的对象)时间?否则Dagger然后会生成MySubComponent(&属于它的对象)?
我理解正确还是错过了什么?
这是否意味着在编译时Dagger可以决定是否扫描代码库请求子组件以查看是否有任何对象该模块中的代码取决于任何代码,如果没有,则不会MySubComponent(及其包含的对象)在编译时生成时间?否则Dagger然后将生成MySubComponent(&对象属于它)?
[我认为您混合了code generation
和object instantiated
。该代码总是生成的(即MySubComponent
总是由Dagger生成),但是天气instantiated
是基于MyModule
创建的对象是否需要它。
如果MyModule
提供MySubComponent
的构建器所需的对象,则仅当创建该对象时,MySubComponent
的构建器为instantiated
,如https://dagger.dev/subcomponents.html中的示例所示>]
@Singleton class RequestRouter { @Inject RequestRouter( Provider<RequestComponent.Builder> requestComponentProvider) {} void dataReceived(Data data) { RequestComponent requestComponent = requestComponentProvider.get() .data(data) .build(); requestComponent.requestHandler() .writeResponse(200, "hello, world"); } }
[创建
RequestRouter
时,将给出Provider<RequestComponent.Builder> requestComponentProvider
。并且仅在调用dataReceived
函数时,才创建子组件生成器(即RequestComponent
的生成器),然后创建子组件(即RequestComponent
)。[具有
@Module(subcomponents = MySubComponent.class)
允许延迟创建其子组件,因此在下面进行说明
此代码可以使Dagger自动检测是否请求子组件。
以上陈述是为了与如下所述的
instantiating
MySubComponent的另一种方法形成对比另一种方法是,强制子组件(或其构建器)始终为
instantiated
,这是通过ParentComponent创建的。
@Component interface MyParentComponent { MySubComponent getSubComponent(); }
您可以参考https://medium.com/@elye.project/dagger-2-subcomponent-through-module-or-component-comparison-92486767a861文章以了解两者之间的更多详细信息。
希望这可以澄清。