当前位置: 首页 > 知识库问答 >
问题:

所有实现都会自动通过吗?这是谁干的?

袁俊弼
2023-03-14

我在 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,所以在运行时应该只传递实现..这才有意义..所以我通过调试确认了,这个实现叫做。实现类是DefaultReleaseRemover.java。

为了支持我的论点,我为nexus编写了一个插件,并为ReleaseRemover编写了实现。

甚至那个也被捡起来了...

这是怎么做到的?在内部,他们正在使用Google Guice。。

Guice是在做传递这个函数中的实现的工作吗?这是像Google Guice这样的框架的属性吗?

如果所有的实现都这样通过,我可以阻止一个实现通过吗?

共有1个答案

方寒
2023-03-14

你的问题对我来说不清楚。你想实现什么?我可以通过什么方式阻止实现被传递? 你想传递什么?空还是您的实现?

Nexus OSS使用GoogleGuice作为依赖注入框架是正确的。要将实现绑定到某个接口,您必须创建这样的模块:

bind(ReleaseRemover.class).to(DefaultReleaseRemover.class);

正如您在<code>DefaultReleaseRemover</code>中看到的,还有其他注入,它们很可能会卡住。因此,<code>DefaultReleaseRemover</code>中的注入实现包含另一个注入,以此类推。

DefaultRelaseRemover被注释为@Singleton,这意味着整个注入器只有一个DefaultRelaseRemover类的实例

好吧,你有你的接口和实现,你的模块有绑定。现在您需要创建Guice Injector并使用它为您创建所有对象。对于Nexus OSS,您可以在以下位置找到Guice Injection入口点https://github.com/sonatype/nexus-oss/blob/de6a606372349283f78aeaa498e9a70d4dd967b1/components/nexus-webapp/src/main/java/org/sonatype/nexus/webapp/WebappBootstrap.java第118行

Guice.createInjector(your modules...);

看,您将向Guice注入器提供要安装的所有模块。请注意,模块内部可能安装了一些子模块。您不必将其显式传递给 createInjector 函数。因此,如果您想更改一些 Guice 绑定,那么从那里开始挖掘是很好的开始。

更新:

我不懂机械。但您必须在某些<code>模块中绑定您的实现。configuration()作为

bind(ReleaseRemover.class).annotathedWith(Names.named("custom")).to(MyCustomReleaseRemover.class);

该模块不应是私有模块:)

然后你会把你的自定义释放卸妆作为

@Inject
public ReleaseRemoverTask( final @Named("custom") ReleaseRemover releaseRemover )

我会更直接地告诉你,但我不知道它在Nexus OSS中是如何工作的。也许有人能帮你完成那部分。

 类似资料:
  • 在下面的代码中,这四种方法用于布局推理。不过,我有点困惑,为什么需要所有这些工具,以及它们之间的不同之处。在这个过程中,它们用于使单元格的高度随着自动布局而动态变化。(摘自此问题的存储库。) 这是一段关于细胞高度的代码: 但是他们有什么不同之处?为什么他们都需要?

  • 问题内容: 我在另一个Stack Overflow问题上读到,Python就像Ruby一样,因为它涉及到“一切都是对象”,而Python中的一切都是对象,就像Ruby一样。 这是真的?Python中的所有对象都是像Ruby这样的对象吗? 两者在这方面有何不同?或者它们真的相同吗?例如,您能拿一个数字来做我所看到的Ruby吗: 可以在Python中以相同的方式完成吗? 问题答案: DiveIntoP

  • 这不是正确的我知道,但我不能弄明白??

  • 我试图获得一个关于Spring代理如何工作的高级视图。为什么我应该在我的应用程序中使用“API接口&Impl bean”模式或者只使用“bean类”模式。我读了不少这样的答案,但它们都很古老,我相信大多数与Java7和Spring3.x相关。我想知道在2020年,Java11+与Spring5.x(Spring Boot2.x)仍然有什么关系。是否有“最佳做法”可循? 此外,由于的可用性,如果我有

  • 本文向大家介绍通过C#实现自动售货机接口,包括了通过C#实现自动售货机接口的使用技巧和注意事项,需要的朋友参考一下 下面分几部分介绍C#实现自动售货机接口的方法,代码写的非常详细,不懂的地方有注释可以参考下。 MachineJP类: 第1部分:串口初始化,串口数据读写 第2部分:接收串口数据,并响应货机,向货机发送数据     第3部分:货机状态、投币、出货等接口 ReceiveDataColle

  • 问题内容: 从php.net获得它,但是我不确定这是每个人如何破坏所有会话的方式吗? 代码会破坏所有会话吗?这是最常见的方式吗?你们如何破坏php会话? 哦,对了,那是什么?所有会话名称?例如,......? 我不需要再使用了吗? 和之间有什么区别? 问题答案: 首先,您应该知道什么是会话:您可以将会话视为与随机标识符(会话ID)相关联的服务器端数据容器。该会话ID需要由客户端提供,以便服务器可以