你的问题不是很清楚。你想实现什么?什么意思can I prevent an implementation from being passed ?
你想传递什么?空或您的实施?
你说的对,Nexus OSS使用Google Guice作为依赖注入框架。要实现绑定到某个接口,你必须创造一个你说的是这样的模块:
bind(ReleaseRemover.class).to(DefaultReleaseRemover.class);
正如你在DefaultReleaseRemover
看到有另一种注射,他们极有可能卡住了。所以在DefaultReleaseRemover
注入的执行包含另一个注射等。
DefaultReleaseRemover
注释为@Singleton
,这意味着整个注射器只有一个DefaultReleaseRemover
类的实例。
那么,你有你的界面和实现,你的模块绑定。现在您需要创建Guice Injector并使用它为您创建所有对象。 适用于Nexus OSS你可以在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...);
请参阅查找吉斯注射切入点,将为你提供你想要安装到吉斯喷油器的所有模块。请注意,模块内可能会安装一些子模块。你不必明确地将它传递给createInjector
函数。所以,如果你想改变一些Guice绑定,那么从这里开始挖掘是一件好事。
UPDATE:
我不知道的机制。但是你必须在一些Module.configuration()
您的实现绑定为
bind(ReleaseRemover.class).annotathedWith(Names.named("custom")).to(MyCustomReleaseRemover.class);
模块应不PrivateModule
:)
然后你会CustomReleaseRemover
传给你作为
@Inject
public ReleaseRemoverTask(final @Named("custom") ReleaseRemover releaseRemover)
我会指引你更直向前,但我不知道它如何在Nexus OSS中工作。也许有人可以帮你解决这个问题。
它似乎是javax.Inject而不是guice的注入 - 必须有一个配置文件定义哪个具体类应该实例化。 – assylias
但是即使是我在一个插件中写的类也会被调用....他们不知道我的类名是否正确?这给我一个印象,他们有一些东西可以找到所有的实现并逐个传递。 –