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