匕首如何能够从另一个模块中注入一个类,而这个模块还没有包含在组件中?

问题描述 投票:0回答:0

我遇到过一个场景,即使我没有明确包含一个模块(通过

@Module(includes = { .. } )
@Component(modules = { .. })
),dagger 也能够很好地构建所有类。

为了让事情更清楚,这是我创建的示例 Maven 项目:

src/
├── main
│   ├── java
│   │   └── org
│   │       └── daggertest
│   │           ├── Main.java
│   │           ├── persistence
│   │           │   ├── di
│   │           │   │   └── PersistenceModule.java
│   │           │   └── PersistenceManager.java
│   │           ├── ui
│   │           │   ├── AppUI.java
│   │           │   └── di
│   │           │       └── UIComponent.java
│   │           └── util
│   │               ├── di
│   │               │   └── UtilModule.java
│   │               └── SystemUtil.java
│   └── resources
└── test
    └── java

有一个主类和三个包(persistence、ui、util)。 persistence和util都有相应的模块。以及 ui 的组件。

让我们从底部开始。 UtilModule 只提供 SystemUtil:

@Module
public class UtilModule {

    @Provides
    public SystemUtil providesSystemUtil() {
        return new SystemUtil();
    }
}  

非常简单。这里什么都没有发生。根据评论中的要求,SystemUtil 的外观如下:

public class SystemUtil {

    public Path getSomeFile(String fileName) {
        return Path.of(fileName);
    }
}

然后,在持久化包中,PersistanceManager注入SystemUtil。所以 PersistenceModule 像这样提供 PersistenceManager:

@Module
public class PersistenceModule {

    @Provides
    public PersistenceManager providesPersistenceManager(SystemUtil systemUtil) {
        return new PersistenceManager(systemUtil);
    }
}  
  1. 即使 PersistenceModule 没有明确包含该模块(通过执行
    @Module(includes = { UtilModule.class })
    ),这也能正常工作。为什么?

然后,在ui包中,AppUI同时注入了PersistenceManager和SystemUtil。我这样写 UIComponent:

@Component(modules = { UtilModule.class })
public interface UIComponent {

    AppUI buildAppUI();
}  
  1. 我只明确包含了 UtilModule。但即使我没有指定 PersistenceModule,它仍然能够注入 PersistenceManager。这是如何工作的?有趣的是,如果我不在此处包含 UtilModule,它就会失败。

我的猜测是我对模块/组件如何能够相互隔离有误解。

  1. 我的期望是,如果它没有明确包含在 Component 或 Module 注释中,它将编译失败。这不是真的吗?有可能强制执行吗?
java dagger-2
© www.soinside.com 2019 - 2024. All rights reserved.