java - 所有实现都会自动通过吗?谁做这个?

标签 java dependency-injection guice nexus inject

我在 Nexus OSS 代码中看到了这一行...

@Inject
public ReleaseRemoverTask( final ReleaseRemover releaseRemover )
{
    this.releaseRemover = checkNotNull( releaseRemover );
}

以上内容可在 https://github.com/sonatype/nexus-oss/blob/master/components/nexus-core/src/main/java/org/sonatype/nexus/maven/tasks/ReleaseRemoverTask.java 中找到

但是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/

相关文章:

java - 在 Arduino IDE 中使用串口监视器(为什么这样工作?)

java - Netty + ProtoBuffer : A few communication messages for one connection

c# - 简单的喷射器将具体类型与生活方式结合起来

java - guice servlet 不是单例

java - Guice:无法注入(inject)辅助列表<Long>

Java : How to get button position after self click-action

java - 对于无限运行的查询,哪个是更好的 Java 程序或存储过程

java - 在 Guice AbstractModule 和 Servlet 模块之间共享绑定(bind)

dependency-injection - 在温莎城堡上携带 CreationContext.AdditionalArguments

java - 是否强制/推荐使用 requireExplicitBindings