我想知道在方法上使用 @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();
}
...
}
是否有理由偏爱另一个?是否存在强制特定方法的情况?
答案 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
语法的框架中。