【发布时间】:2015-09-11 20:28:37
【问题描述】:
我目前正在开发 CDI 扩展。我必须注册一些特殊的自定义bean,这就是为什么生产者还不够。
目前这是在AfterBeanDiscovery-Phase 内通过使用abd.addBean() 方法注册Bean<> 的自定义实现来完成的。
缺点是在 bean 的 create()-method 内我无法访问 InjectionPoint,这可能在注解中包含额外的配置。
作为一种可能性,我可以在ProcessInjectionTarget 阶段收集我需要的所有bean(因为我可以访问注释)并在AfterBeanDiscovery 阶段中注册它们中的每一个。
然后我必须使配置注释成为限定符和限定符绑定的属性(不使用@Nonbinding)以防止模棱两可的依赖关系。
然后我将注册大量配置不同的 bean。
是否有替代解决方案?是否可以访问bean create() 方法中的InjectionPoint?
谢谢!
【问题讨论】:
-
你说生产者是不够的,但你不支持它。为什么你觉得这里的 producer 方法是不够的,它似乎完全可以做到你想要的。
-
好的,所以你的用例有点混乱。是的,如果有人想使用自定义限定符,它会超出您的框架。通常,框架将创建带有参数的生产者,通常是字符串。 DeltaSpike 有一个很好的例子来说明这种实现,请注意使用 JPA,但这里使用了相同的想法 deltaspike.apache.org/documentation/…
-
所以可能更具体一点(不想打扰细节):我目前正在开发一个 CDI 扩展,它允许您通过使用例如注入 Jenkins 的东西。
@JenkinsJob("JobName")。为此目的,生产者由将产生相应 JenkinsServer(例如 ServerDev)的开发人员实现。现在,开发人员应该能够使用第二个注释(限定符)来注释@JenkinsJob注释成员,该注释用于确定要使用哪个服务器(因为他的 JenkinsServer-Producer 将具有相同的限定符)。这有帮助吗? -
只需对 JenkinsJob.value 使用 @Nonbinding 并提供带有 InjectionPoint 作为参数的 CDI-Producer。参见例如github.com/apache/deltaspike/blob/master/deltaspike/core/impl/…