【问题标题】:Java Guice: If you inject the same dependency multiple times, is the same instance of that dependency injected?Java Guice:如果多次注入相同的依赖项,是否注入了该依赖项的同一个实例?
【发布时间】:2018-10-01 21:49:45
【问题描述】:

我有一个 java jersey 2.x 项目,使用 Guice 作为我的依赖注入框架。我有这项服务

public class AccountService {

private final AccountRepository accountRepository;

@Inject
public AccountService(InMemoryAccountRepositoryImpl inMemoryAccountRepositoryImpl) {
    this.accountRepository = inMemoryAccountRepositoryImpl;
}

假设我创建了另一个同样注入InMemoryAccountRepositoryImpl 的服务类,会注入同一个实例吗?知道这一点对我来说很重要,因为这个实例的内部状态需要保持一致。

【问题讨论】:

  • 顺便说一句,你应该program to interfaces,意思是注入接口类型,而不是具体类型。在 Guice 配置中使用 bind(InterfaceType.class).to(ConcreteType.class)
  • 哦,我明白了,它干净多了。如果我需要更改类的实现,而不是在注入的每个构造函数中更改它,我会在 Guice 配置中更改它一次。非常整洁,谢谢@PaulSamsotha!
  • 是的,而且(单元)测试要容易得多。你可以模拟出依赖关系。

标签: java dependency-injection jersey jax-rs guice


【解决方案1】:

默认情况下,Guice 每次提供值时都会返回一个新实例。此行为可通过范围进行配置。范围允许您重用实例:在应用程序 (@Singleton)、会话 (@SessionScoped) 或请求 (@RequestScoped) 的生命周期内。 Guice 包含一个 servlet 扩展,它定义了 Web 应用程序的范围。可以为其他类型的应用程序编写自定义范围。

欲了解更多信息,请参阅documentation

【讨论】:

  • 非常感谢,我使用了Singleton注解并且成功了!
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2020-08-18
  • 2011-12-09
相关资源
最近更新 更多