CDI @Producer方法可以采用自定义参数吗?

Raj*_*Raj 5 cdi

我想我理解CDI是如何工作的,为了深入研究它,我想尝试用一些真实世界的例子.我被困在一件事情,我需要你的帮助才能让我理解.在这方面,我非常感谢你的帮助.

我有自己的工作流框架使用Java反射API和XML配置开发,其中基于特定类型的"source"和"eventName",我加载适当的Module类并在其上调用"process"方法.一切都在我们的项目中运作良好.

我对CDI功能很兴奋,并希望尝试使用工作流框架,我计划注入Module类,而不是使用Reflection等加载它们...

只是为了给你一个想法,我会尽量在这里保持简单.

"Message.java"是一种带有"Source"和"eventName"的Transfer Object,因此我们可以适当地加载模块.

public class Message{
private String source;
private String eventName;
}
Run Code Online (Sandbox Code Playgroud)

模块配置如下

<modules>
<module>
    <source>A</source>
    <eventName>validate</eventName>
    <moduleClass>ValidatorModule</moduleClass>
</module>
<module>
    <source>B</source>
    <eventName>generate</eventName>
    <moduleClass>GeneratorModule</moduleClass>
</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

ModuleLoader.java

public class ModuleLoader {
public void loadAndProcess(Message message){
    String source=message.getSource();
    String eventName=message.getEventName();

    //Load Module based on above values.

}
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想通过CDI实现相同的注入模块(在ModuleLoader类中),我可以使用@Produce方法编写Factory类,这可以做到这一点.但我的问题是,

a)如何将Message Object传递给@Produce方法,以便根据eventName和source进行查找?

你能给我一些建议吗?

提前致谢.

Lig*_*ard 4

这有点棘手,因为 CDI 的工作方式与您的自定义解决方案不同(如果我理解正确的话)。CDI 必须在启动时拥有所有依赖项和这些依赖项的解决方案列表,您的解决方案听起来像是在运行时找到可能发生变化的所有内容。话虽如此,您可以尝试一些事情。

您可以尝试将 anInjectionPoint作为参数注入生产者方法并返回正确的对象,或创建正确的类型。

还可以创建您自己的扩展来执行此操作并创建依赖项并将它们全部连接到扩展中(查看ProcessInjectionTargetProcessAnnotatedType和 'AfterBeanDiscovery` 事件。这两个 快速入门也可能有助于实现一些想法。