Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java dagger如何从另一个没有';组件中没有包含任何内容吗?_Java_Dagger 2 - Fatal编程技术网

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);
    }
}  
  • 即使PersistenceModule没有显式地包含该模块(通过执行
    @module(includes={UtilModule.class})
    ),也可以正常工作。为什么?
  • 然后,在ui包中,AppUI同时注入PersistenceManager和SystemUtil。我是这样写的:

    @Component(modules = { UtilModule.class })
    public interface UIComponent {
    
        AppUI buildAppUI();
    }  
    
  • 我只明确地包含了UtilModule。但是它仍然能够注入PersistenceManager,即使我没有指定PersistenceModule。这是如何工作的?有趣的是,如果我不在这里包含UtilModule,它就会失败
  • 我的猜测是,我对模块/组件如何能够彼此隔离存在误解

  • 我的期望是,如果它没有显式地包含在组件或模块注释中,编译就会失败。这不是真的吗?有可能强制执行吗

  • 如果您需要任何其他信息,请告诉我。谢谢大家!

    能否提供一个简化版的
    SystemUtil
    ?我猜你到处散布
    @Inject
    。@DavidMedenjak我在帖子中编辑了整个SystemUtil。因为这只是一个测试项目,所以在这个类中没有发生任何事情。它是一个没有依赖项的简单类。我唯一有
    @Inject
    的地方是PersistenceManager和AppUI。您的示例显然缺少一些东西。如果您不使用构造函数注入,也不以某种方式提供对象(模块、父组件、组件依赖项、组件工厂/生成器),那么Dagger将抱怨无法提供。。。我不确定什么是
    AppUI
    ,但假设其他所有内容都如前所述,我猜
    AppUI
    只会请求
    SystemUtil
    ,这将由您添加的模块提供。而且您不使用PersistenceManager,这也是您不需要该模块的原因。@DavidMedenjak
    AppUI
    同时注入PersistenceManager和SystemUtil。我可能遗漏了什么。因此,我已经在github上发布了我的代码:。这是一个简单的maven项目,只有dagger依赖项。因此,只要安装了Maven和Java,您就应该能够运行
    mvn clean package
    。@DavidMedenjak,您可以在这里看到:。我同时注射了PersistenceManager和SystemUtil。