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

Ben*_*ser 11 java dependency-injection guice

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


我通常覆盖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();
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyModule extends AbstractModule
{
  @Provides
  @Singleton
  myIface iFaceProvider()
  {
    return new myIfaceImpl();
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

Tav*_*nes 12

如果你这样做

bind(MyInterface.class).to(MyImplementation.class)
Run Code Online (Sandbox Code Playgroud)

Guice为您创建实例.这样可以实现像AOP这样的认证.如果你这样做

@Provides
MyInterface provideMyInterface() {
    return new MyImplementation();
}
Run Code Online (Sandbox Code Playgroud)

然后Guice没有创建实例,所以AOP不起作用.此外,它需要一个可访问的构造函数MyImplementation.通常,此表单仅在您无法编辑MyImplementation以使其与Guice兼容时使用.

还有第三种形式:

@Provides
MyInterface provideMyInterface(MyImplementation impl) {
    return impl;
}
Run Code Online (Sandbox Code Playgroud)

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