我遇到过一个场景,即使我没有明确包含一个模块(通过
@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);
}
}
@Module(includes = { UtilModule.class })
),这也能正常工作。为什么?然后,在ui包中,AppUI同时注入了PersistenceManager和SystemUtil。我这样写 UIComponent:
@Component(modules = { UtilModule.class })
public interface UIComponent {
AppUI buildAppUI();
}
我的猜测是我对模块/组件如何能够相互隔离有误解。