Answers:
组件依存关系-如果要使两个组件保持独立,请使用此选项。
子组件-当您要保持两个组件耦合时使用此组件。
我将使用下面的示例来说明Component依赖项和Subcomponents。需要注意该示例的一些要点是:
SomeClassA1
可以不受任何依赖地创建。ModuleA
提供和的实例SomeClassA1
经由provideSomeClassA1()
方法。SomeClassB1
没有不能创建SomeClassA1
。仅当将的一个实例作为方法的参数传递时,ModuleB
才能提供的实例。SomeClassB1
SomeClassA1
provideSomeClassB1()
@Module
public class ModuleA {
@Provides
public SomeClassA1 provideSomeClassA1() {
return new SomeClassA1();
}
}
@Module
public class ModuleB {
@Provides
public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
return new SomeClassB1(someClassA1);
}
}
public class SomeClassA1 {
public SomeClassA1() {}
}
public class SomeClassB1 {
private SomeClassA1 someClassA1;
public SomeClassB1(SomeClassA1 someClassA1) {
this.someClassA1 = someClassA1;
}
}
每当初始化组件/子组件声明时,Dagger都会将的实例SomeClassA1
作为参数传递给provideSomeClassB1()
方法。我们需要指导Dagger如何实现依赖关系。这可以通过使用Component依赖项或Subcomponent来完成。ModuleB
ModuleB
请注意以下“组件依赖关系”示例中的以下几点:
ComponentB
必须通过注释dependencies
方法定义依赖项@Component
。 ComponentA
不需要声明ModuleB
。这使两个组件保持独立。public class ComponentDependency {
@Component(modules = ModuleA.class)
public interface ComponentA {
SomeClassA1 someClassA1();
}
@Component(modules = ModuleB.class, dependencies = ComponentA.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
.moduleB(moduleB)
.componentA(componentA)
.build();
}
}
请注意SubComponent示例中的以下几点:
ComponentB
尚未定义对的依赖ModuleA
,它不能独立存在。它取决于将提供的组件ModuleA
。因此,它具有@Subcomponent
注释。ComponentA
已ModuleB
通过接口方法声明componentB()
。这使两个组件耦合。实际上,ComponentB
只能通过进行初始化ComponentA
。public class SubComponent {
@Component(modules = ModuleA.class)
public interface ComponentA {
ComponentB componentB(ModuleB moduleB);
}
@Subcomponent(modules = ModuleB.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerSubComponent_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = componentA.componentB(moduleB);
}
}
SomeClassB1
依赖于SomeClassA1
。ComponentA
必须显式定义依赖关系。” ==>您的意思是“ ComponentB
必须显式定义依赖项”吗?
SomeClassB1
依赖于SomeClassA1
。ComponentA
不需要显式定义依赖项”。您的意思是“ ComponentB
无需显式定义依赖项”。
根据文档:
Component Dependency
使您只能访问通过组件依赖项作为提供方法公开的绑定,即,您只能访问在parent中声明的类型Component
。
SubComponent
声明时,可从其父级访问整个绑定图,即,您可以访问Module
s中声明的所有对象。
比方说,你有一个ApplicationComponent
包含所有Android
相关的东西(LocationService
,Resources
,SharedPreference
等)。您还希望拥有DataComponent
可以管理持久性以及WebService
处理API的位置。您唯一缺少的DataComponent
是Application Context
驻留在中ApplicationComponent
。得到一个最简单的方法Context
从DataComponent
将是对的依赖ApplicationComponent
。您需要确保您有一个Context
明确声明的进入,ApplicationComponent
因为您只能访问声明的内容。在这种情况下,无需手动操作,这意味着您无需Submodules
在父级中指定,也无需Component
将子模块显式添加到父级模块中,例如:
MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need!
现在考虑要注入这种情况下,WebService
从DataComponent
和LocationService
从ApplicationComponent
到您的Fragment
使用结合@Submodule
plus
上述特征。这里的很酷的事情是,你结合(组件ApplicationComponent
)并没有需要公开WebService
,也不LocationService
是因为你有机会获得整个图形的时候了。
@Submodule
。是错字吗?
classes
一些示例,多一些图片来说明确切点会有所帮助。
这是带有屏幕截图的代码示例,用于更多地了解Component和SubComponent:
子组件:
资料来源:链接
直到现在我还没有意识到的另一件事是:
@Subcomponent
实例只有一个父组件(尽管不同的组件可以实例化它@Subcomponent
并成为该实例的父组件)@Component
可能具有零个,一个或多个通过组件依赖项声明的“父”组件