Java dagger如何从另一个没有';组件中没有包含任何内容吗?
我遇到了一个场景,在这个场景中,即使我没有显式地包含一个模块(通过Java dagger如何从另一个没有';组件中没有包含任何内容吗?,java,dagger-2,Java,Dagger 2,我遇到了一个场景,在这个场景中,即使我没有显式地包含一个模块(通过@module(includes={..})或@Component(modules={..})),dagger也能够很好地构造所有的类 为了让事情更清楚,下面是我创建的Maven项目示例: src/ ├── main │ ├── java │ │ └── org │ │ └── daggertest │ │ ├── Main.java │ │ ├── pe
@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)。持久性和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})
),也可以正常工作。为什么?@Component(modules = { UtilModule.class })
public interface UIComponent {
AppUI buildAppUI();
}
如果您需要任何其他信息,请告诉我。谢谢大家! 能否提供一个简化版的
SystemUtil
?我猜你到处散布@Inject
。@DavidMedenjak我在帖子中编辑了整个SystemUtil。因为这只是一个测试项目,所以在这个类中没有发生任何事情。它是一个没有依赖项的简单类。我唯一有@Inject
的地方是PersistenceManager和AppUI。您的示例显然缺少一些东西。如果您不使用构造函数注入,也不以某种方式提供对象(模块、父组件、组件依赖项、组件工厂/生成器),那么Dagger将抱怨无法提供。。。我不确定什么是AppUI
,但假设其他所有内容都如前所述,我猜AppUI
只会请求SystemUtil
,这将由您添加的模块提供。而且您不使用PersistenceManager,这也是您不需要该模块的原因。@DavidMedenjakAppUI
同时注入PersistenceManager和SystemUtil。我可能遗漏了什么。因此,我已经在github上发布了我的代码:。这是一个简单的maven项目,只有dagger依赖项。因此,只要安装了Maven和Java,您就应该能够运行mvn clean package
。@DavidMedenjak,您可以在这里看到:。我同时注射了PersistenceManager和SystemUtil。