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

2022-09-02 21:50:20

我想知道在方法上使用@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

如果您这样做

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

Guice 将为您创建实例。这使得像AOP这样的东西成为可能。如果您这样做

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

然后 Guice 没有创建实例,因此 AOP 将不起作用。此外,它还需要 一个可访问的构造函数。通常,仅当您无法编辑以使其与 Guice 兼容时,才会使用此表单。MyImplementationMyImplementation

还有第三种形式:

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

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


答案 2

推荐