当前位置: 首页 > 面试题库 >

使用组件依赖项时的单例问题

江凯风
2023-03-14
问题内容

我在理解以下代码为何不起作用时遇到问题。

我有以下项目结构:

@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

哪里

@Module
public class CCModule {

    @Provides @Singleton
    public XXX provide XXX(){
        return new XXX();
    }
}

@Component(dependencies = CComponent.class, modules = AAModule.class) 
public interface AComponent {
    YYY getYYY();
}

哪里

class YYY {
   @Inject
   public YYY(XXX xxx) {
       ...
   }
}

我将所有内容初始化为:

CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();

AComponent a_component = Dagger_AComponent.builder()
        .cComponent(c_component)
        .aAModule(new AAModule())
        .build();

一旦编译发生,我得到以下错误:

错误:(11,1)错误:com.test.CComponent(未作用域)可能未引用作用域绑定:@Provides @Singleton
com.test.XXX com.test.CCModule.provideXXX()

我的目标是让一个组件从其他组件继承绑定,以对对象(单件)具有相同的引用。


问题答案:

您应该@Singleton进行CComponent类声明。

@Singleton
@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

错误消息中的解释:CComponent是无作用域的,@Singleton是作用域。Dagger 2不允许无作用域的组件使用具有范围绑定的模块。
但是,现在您将收到以下错误:

AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)

无作用域的组件不能具有范围依赖性。因此,您需要确定AComponent范围。为此,创建自定义AScope注释。

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}

并用它注释AComponent

@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}

这些是最新快照版本中出现的新要求。在相应的问题中进行了讨论,并且可能仍会更改。



 类似资料:
  • 我在PHP中重构旧的应用程序。 我试图使用Symfony依赖注入组件将服务注入控制器(或其他服务),但我不知道如何实现这一点,因为symphony文档比框架组件更适合使用框架。 我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务)。我的控制器从扩展AbstractController。所以我现在唯一能做的就是: 通过

  • 我有一个这样定义的单例实例: 现在,由于一些变化,这个类必须依赖于几个(3)依赖项。因此,这些依赖项必须在这里注入。 我们如何为这样设计的Singleton类实现依赖注入? 问题是,已经有很多调用方,因此无法使 getInstance 方法来接受依赖关系。 页(page的缩写)我知道使用单例并不总是一种更干净的方式:)(这是现有的代码,我不得不忍受它:) 附注:我正在使用Guice进行依赖注入。

  • 最近,我发现了以下问题: 当我为我的项目设置依赖项管理时,我有一个child-pom,它使用具有依赖项的插件,我想要与在我的依赖项管理中声明的依赖项同步。 在根pom中,我在依赖项管理中声明: 在子pom中,我有一个插件需要gwt-user: 但是,如果我移除gwt-maven-plugin中使用的依赖版本,编译就会失败。 是不是还有别的办法可以实现呢? PS:在maven和maven插件中有一个

  • 我运行命令来检查我的java项目中未使用的jar,部分结果如下所述: [警告]找到未使用的声明依赖项: [警告] 组织.Spring框架工作.boot:Spring启动器:jar:2.0.3.发布:编译 [警告] 组织Spring框架工作.启动:Spring启动器测试:jar:2.0.3.发布 :编译 [警告] 组织.springframework.boot:Spring启动器-启动器-jdbc:

  • 在我试图建立的测试中,在实现Cucumber时遇到了一些问题。以此为指导,成功地获得了测试工作Selenium:https://medium . com/@ cbuelvasc/test-automation-in-kotlin-with-Selenium-TestNG-and-page-object-model-e 2252 DBC 492 a 当我尝试在其上添加功能以及步骤定义时 - 它抱怨p

  • 我想知道下面是否可行以及如何实现。 我正在学习Spring boot的教程,其中提到我们可以有一个父依赖项。 然后定义没有版本号的依赖项。 这将在项目依赖项中添加依赖项版本1.5.6。释放sping-boot-starter和sping-boot-starter-web。 就像那样,我想找到什么是<代码> Spring-上下文 spring-jdbc Spring测试 谢谢!