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

时间:2014-12-15 21:05:52

标签: java dependency-injection guice

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


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

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

但是,我注意到我正在使用的代码库中的一个模式,其中实现没有明确绑定,它们是从这样的提供程序返回的:

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

是否有理由偏爱另一个?是否存在强制特定方法的情况?

1 个答案:

答案 0 :(得分:11)

如果你这样做

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语法的框架中。