java - 子组件与组件依赖关系

标签 java android dependency-injection dagger-2

我从此文档中阅读了 SubComponentsComponent Dependency 之间的区别 https://google.github.io/dagger/api/latest/dagger/Component.html并阅读此线程Dagger 2 subcomponents vs component dependencies

任何人都可以通过示例帮助我了解这行代码的含义。

SubComponents may use any binding defined by their ancestor component and subcomponents. as an alternative, components can use bindings only from another component interface by declaring a component dependency. When a type is used as a component dependency, each provision method on the dependency is bound as a provider. Note that only the bindings exposed as provision methods are available through component dependencies.

最佳答案

将其视为一个子组件,例如 java SubComponent 扩展 ParentComponent,其中所有内容都受到保护。它将有权访问与父级相同的成员,并且只能使用父级的所有内容。

另一方面,组件依赖关系就像委托(delegate)对象,您只能访问该类公开的公共(public)方法。

<小时/>

假设我们有 2 个 Dagger 可以创建和提供的类。不管这可能是什么。如果您使用构造函数注入(inject)或从模块创建对象并不重要...我们只是假设我们有这两个类可以由某些 BaseComponent 提供,我将在接下来展示。

// some module can create either object
class ComponentPrivateObject {}
class ExposedObject {}

他们来自哪里并不重要。下一部分是有趣的部分。我们将这些类中的一个声明为组件接口(interface)上方法的返回类型。这就是 Dagger 所说的“配置方法”。它表示该组件可以提供该类。

@Component(modules=/* some modules */)
class BaseComponent {

  // BaseComponent can provide ExposedObject!
  ExposedObject exposedObject();

}

子组件和依赖组件之间的区别在于,与开头的 java 示例一样,Subcomponent 将有权访问 ComponentPrivateObjectExposedObject code> 因为它只是扩展父图。

// can use either class, it just adds to the parent
@Subcomponent
class Subcomponent {}

另一方面,DependentComponent 只能访问ExposedObject。它不会扩展 BaseComponent 的图,但它只是将 BaseComponent 绑定(bind)为某些对象的提供者。与上面的 java 示例一样,它就像使用其公共(public) API,如果您尝试使用 ComponentPrivateObject,Dagger 会告诉您它无法提供...

// binds component dependency as provider
@Component(dependency=BaseComponent.class)
class DependentComponent{}

一个扩展父级,另一个使用其公共(public) API。

关于java - 子组件与组件依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46042273/

相关文章:

android - 当我使用 Unity 的动画师在 Unity3D 中更改图像颜色时,为什么我的游戏会滞后?

android - 如何使用 dockerfile 在模拟器上构建并运行 android apk

java - 使用这种方法注入(inject)并与Java中的构造函数注入(inject)进行比较

javascript - 类型错误 : $controller is not a function + Controller inside controller

java - 如何执行具有异步子任务的顺序任务

java - 使用线程增加一个 int

java - 如何让 IntelliJ 为非基于 ruby​​ 的项目加载我的 .rvmrc?

java - 从 Facebook SDK android 获取用户电子邮件

java - 从根上下文访问 bean 时出现 Spring NoSuchBeanDefinitionException

java - Maven 依赖项失败并出现 501 错误