语境:
基于我的 Java EE 应用程序接收到的 XML,我想创建一个新的 AreeConfiguration 对象,其中发生 3 个对象的注入。根据此 XML 中的信息选择正确的 Instance<>。因此,我从这个 XML 传递信息。
我有一个数据结构,应该在运行时填充这些 AreeConfiguration 对象:
private HashMap<Integer, AreeConfiguration> configurations = new HashMap<Integer, AreeConfiguration>();
public void parseNewConfiguration(Element el) throws InvalidDescriptorException {
if(!isValidConfiguration(el)) throw new InvalidDescriptorException();
int key = getUniqueKey();
AreeConfiguration cfg = new AreeConfiguration(key, el);
configurations.put(key, cfg);
}
我的 AreeConfiguration 对象应该(理想情况下)用基本的 XML 信息构造并注入一些对象。稍后,我想使用 XML 中的信息来选择正确的 Instance<>。
public class AreeConfiguration {
@Inject
private Instance<AreeInput> ais;
private AreeInput ai;
@Inject
private Instance<AreeReasoner> ars;
private AreeReasoner ar;
@Inject
private Instance<AreeOutput> aos;
private AreeOutput ao;
AreeConfiguration(int key, Element el) throws InvalidDescriptorException {
...
}
@PostConstruct
public void chooseComponents(){
ai = chooseInput();
ar = chooseReasoner();
ao = chooseOutput();
}
我发现并尝试过的:
通过研究(在 Stack Overflow),我现在了解到 CDI 不会注入使用new Object()
. 上面显示的代码,从不输入chooseComponents()
。
当我想尝试使用@Producer 时,我会使用注释parseNewConfiguration(Element el)
并@Producer
添加一个@New AreeConfiguration cfg
参数。但是,我也不能通过Element el
,这很不幸,因为它包含基本的 XML 信息。
如果我没有彻底解释自己,请提出其他问题。我正在寻找一种使用 CDI 完成上述任务的方法。
此外,这个问题的答案中提出的解决方案有多“干净”:@Inject 仅适用于由 CDI 容器创建的 POJO?