我在 Nexus OSS 代码中看到了这一行...
@Inject
public ReleaseRemoverTask( final ReleaseRemover releaseRemover )
{
this.releaseRemover = checkNotNull( releaseRemover );
}
但是ReleaseRemover.java是一个接口(interface)。
这里的接口(interface)没有用,所以在运行时只应该传递实现..这才有意义.. 于是通过调试确认,该实现被调用了。实现类为 DefaultReleaseRemover.java .
为了支持我的论点,我为 nexus 编写了一个插件,并为 ReleaseRemover 编写了一个实现。
连这个都被捡到了......
这是怎么做到的? 他们在内部使用 Google Guice ..
Guice 是否正在执行在该函数内传递实现的工作? 这是像 Google Guice 这样的框架的属性吗?
如果所有实现都这样传递,我可以阻止某个实现被传递吗?
最佳答案
你的问题我不清楚。你想实现什么目标? 我可以阻止实现被传递吗?
你想传递什么是什么意思?空还是你的实现?
关于 Nexus OSS 使用 Google Guice 作为依赖注入(inject)框架,您是对的。要将实现绑定(bind)到某个接口(interface),您必须创建模块,其中您可以这样说:
bind(ReleaseRemover.class).to(DefaultReleaseRemover.class);
正如您在 DefaultReleaseRemover
中看到的那样,还有另一个注入(inject),它们很可能会卡住。因此,DefaultReleaseRemover
中的注入(inject)实现包含另一个注入(inject),依此类推。
DefaultReleaseRemover
被注释为 @Singleton
,这意味着整个注入(inject)器只有一个 DefaultReleaseRemover
类的实例。
好吧,您已经有了接口(interface)和实现以及带有绑定(bind)的模块。现在您需要创建 Guice Injector 并使用它来为您创建所有对象。 对于 Nexus OSS,您可以在 https://github.com/sonatype/nexus-oss/blob/de6a606372349283f78aeaa498e9a70d4dd967b1/components/nexus-webapp/src/main/java/org/sonatype/nexus/webapp/WebappBootstrap.java 找到 Guice 注入(inject)入口点。第118行
Guice.createInjector(your modules...);
看,您将提供要安装到 Guice 注入(inject)器的所有模块。请注意,模块内可能安装了一些子模块。您不必将其显式传递到 createInjector 函数中。因此,如果您想更改一些 Guice 绑定(bind),最好从那里开始挖掘。
<小时/>更新:
我不知道机制。但是您必须将某些 Module.configuration()
中的实现绑定(bind)为
bind(ReleaseRemover.class).annotathedWith(Names.named("custom")).to(MyCustomReleaseRemover.class);
该模块不应是 PrivateModule
:)
然后您将把 CustomReleaseRemover
作为
@Inject
public ReleaseRemoverTask( final @Named("custom") ReleaseRemover releaseRemover )
我会更直接地指导你,但我不知道它在 Nexus OSS 中是如何工作的。也许有人可以帮助你完成这部分。
关于java - 所有实现都会自动通过吗?谁做这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149683/