java - 在 guice 中,@provides 和 bind() 之间有区别吗?

标签 java dependency-injection guice

我想知道在方法上使用 @provides 和使用 bind() 有什么区别在我的 guice 模块中。


我通常会覆盖 AbstractModule.configure() 并将我的所有实现绑定(bind)到我的接口(interface),如下所示:

public class MyModule extends AbstractModule
{
  @Override
  protected void configure()
  {
    this.bind(myIface.class).to(myIfaceImpl.class);
    this.bind(myOtherIface.class).to(myOtherIfaceImpl.class).asEagerSingleton();
  }
  ...
}

但是,我注意到我目前正在使用的代码库中的一种模式,其中实现未明确绑定(bind)它们是从提供商返回的,如下所示:

public class MyModule extends AbstractModule
{
  @Provides
  @Singleton
  myIface iFaceProvider()
  {
    return new myIfaceImpl();
  }
  ...
}

有理由偏爱其中之一吗?是否存在强制使用特定方法的情况?

最佳答案

如果你这样做

bind(MyInterface.class).to(MyImplementation.class)

Guice 为您创建实例。这使某些事情成为可能,比如 AOP。如果你这样做

@Provides
MyInterface provideMyInterface() {
    return new MyImplementation();
}

然后 Guice 没有创建实例,所以 AOP 将无法工作。此外,它还需要一个可访问的 MyImplementation 构造函数。通常,只有当您无法编辑 MyImplementation 以使其与 Guice 兼容时才使用这种形式。

还有第三种形式:

@Provides
MyInterface provideMyInterface(MyImplementation impl) {
    return impl;
}

这几乎完全等同于 bind(...).to(...) 形式。它常用于像 Dagger 这样没有 bind 语法的框架。

关于java - 在 guice 中,@provides 和 bind() 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493125/

相关文章:

Angular2 - 异步依赖注入(inject)

java - 如何将场注入(inject)与 Action 组合一起使用?

java - jpa2 使用 guice 重用 entityManager

java - Guice:强制绑定(bind)作为提供者注入(inject)

Java从ArrayList中获取子内容

java - 如何在Java的socket中使用readObject()两次?

java - 如何在 Kotlin 中实现可空 "beanName"的 BeanPostProcessor?

java - Java 中的阻塞线程——要避免吗?

spring - 如何将属性值注入(inject)到 Spock 测试中?

java - Guice 不会注入(inject) Jersey 的资源