Dagger 2 subcomponents vs component dependencies
Dagger 1的
在什么情况下使用组件依赖关系而不是子组件依赖关系是有益的,为什么?
组件依存关系-当您要使两个组件保持独立时,请使用此选项。
子组件-当您要保持两个组件耦合时使用此组件。
我将使用下面的示例来说明组件依赖关系和子组件。需要注意该示例的一些要点是:
-
可以创建
SomeClassA1 而没有任何依赖关系。ModuleA 通过provideSomeClassA1() 方法提供SomeClassA1 的实例。 -
如果没有
SomeClassA1 ,则无法创建SomeClassB1 。仅当将SomeClassA1 的实例作为参数传递给provideSomeClassB1() 方法时,ModuleB 才能提供SomeClassB1 的实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @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; } } |
每当初始化
组件依赖性
请注意以下"组件依赖关系"示例中的以下几点:
-
ComponentB 必须通过@Component 批注上的dependencies 方法定义依赖项。 -
ComponentA 不需要声明ModuleB 。这使两个组件保持独立。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 通过接口方法componentB() 声明了ModuleB 。这使两个组件耦合。实际上,只能通过ComponentA 初始化ComponentB 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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); } } |
根据文档:
假设您有一个
1 | MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need! |
现在考虑这种情况,您想将
这是带有屏幕截图的代码示例,用于更多地了解Component和SubComponent:
零件:
子组件:
和画图:
资料来源:链接
直到现在我还没有意识到的另一件事是:
-
@Subcomponent 实例仅具有一个父组件(尽管不同的组件可以实例化相同的@Subcomponent 并成为该实例的父组件) -
@Component 可能具有零个,一个或多个通过组件依赖项声明的"父"组件