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语法的框架中.
| 归档时间: |
|
| 查看次数: |
5266 次 |
| 最近记录: |