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

确保仅在Guice中加载一次模块

傅阳炎
2023-03-14
问题内容

不得不与Guice打交道,我想知道我应该如何处理模块方面的依赖关系。

在Guice中,每个模块都是由实例提供的。因此,如果我有一个需要某种服务的模块,它将创建一个向该服务添加绑定的模块并进行安装(binder.install(module))。

现在,我有两个独立的模块,完全可以独立使用,并且都安装了相同的数据库模块。

单独使用两个模块都不会出现问题,但是如果两个模块在同一应用程序中使用会怎样?这两个模块将分别加载数据库模块,这是不正确的。

有没有一种方法可以问活页夹,如果某个类型已经绑定了?我不能使用getProvider进行检查,因为返回的只是一个LookupProvider,无论是否已经绑定了什么。

那么,如何应对这种情况呢?

更新:

它表明Guice无法提供以下功能:

  1. 检查给定的模块是否已经加载。
  2. 检查给定的类是否已经绑定。
  3. 使用配置中的提供者可以执行分布式配置(模块可以配置要提供的对象)。

问题答案:

Guice有两个功能可以处理这种情况。首先是 模块重复数据删除
。这意味着,如果安装了两个等效的模块(按equals()hashCode()),则只能configure()运行一个方法。但是,此解决方案有些脆弱,因为它无法经受住SPI转换Modules.override()等。

第二个也是IMO更好的解决方案是 绑定重复数据删除
。这意味着Guice将接受完全相同的绑定。因此,如果您的模块执行了bind(Interface.class).to(Implementation.class),它的configure()方法是否运行两次甚至都没有关系,因为Guice可以很好地处理重复的绑定。



 类似资料:
  • 我是胡克斯的新手,遇到了一些让我追自己尾巴的案例。 希望有人能解释或提供对我有意义的解决方案: > 下面这个线程:如何调用加载函数与反应使用效果只有一次 我试着在没有依赖性的情况下使用useEffect,eslint不喜欢这样,他们建议添加一个“跳过下一行”,这似乎有点骇人:

  • 问题内容: 我正在编写一个应用程序,并试图将简单的AJAX功能绑定在一起。它在Mozilla Firefox中运行良好,但是Internet Explorer中有一个有趣的错误:每个链接只能单击一次。浏览器必须完全重新启动,只是重新加载页面将无法进行。我编写了一个非常简单的示例应用程序来演示这一点。 Javascript转载如下: 任何帮助,将不胜感激。 问题答案: 发生这种情况是因为Intern

  • 问题内容: 我正在制作一个由CSS3驱动的简单目标网页。为了使它看起来很棒,有一个隆重的表演: 为了使它更加出色,我添加了一个悬停动画: 但是问题来了!我分配了这样的动画: 一切都很好:飞溅到用户脸上,当他徘徊时有很好的振动。用户模糊后,立即填充,平滑内容突然结束并重复-animation。(这对我来说是合乎逻辑的,但我不希望这样做)没有某种JavaScript类Jiggery Pokery,有什

  • 问题内容: 有没有办法在同一个python会话中两次加载一个模块? 用一个例子填补这个问题:这是一个模块: 模版 现在,我想两次导入该模块,例如创建一个类的两个实例以实际具有的两个副本。 要已经回答评论中的问题,“如果有人只要创建一个带有变量的类,为什么有人会想这样做”: 您是正确的,但是存在大量的源,必须重写,并且两次加载一个模块将是一个快速修复^^。 问题答案: 是的,您可以两次加载一个模块:

  • 问题: 我知道我们可以在Play框架应用程序的其余部分注入配置模块,但我想在模块配置期间获取我的信息。我该怎么做?

  • 我在一些关于堆栈溢出的答案中看到,通常在web中也看到,Kafka不支持消费确认,或者消费一次就很难实现。 在以下作为示例的条目中,有没有理由使用RabbitMQ而不是Kafka?,我可以读到以下语句: RabbitMQ将保留已消耗/已确认/未确认消息的所有状态,而Kafka则不保留 或 有人能解释一下为什么Kafka的“一次消费保证”很难实现吗?这与Kafka和RabbitMQ等其他更传统的消息