gpt4 book ai didi

java - 使用 CDI 机制替换基于工厂的对象创建

转载 作者:行者123 更新时间:2023-12-02 01:27:45 33 4
gpt4 key购买 nike

我想将 CDI (Weld) 引入我们的项目,但现在手动构建的对象遇到了一些问题。

因此,我们有一些实现 IReport 接口(interface)的类,其中有一个应该注入(inject)的字段。这在运行时为 null,因为所有这些类都是由类 ReportController 中的 ReportFactory 生成的。

private Map<String,Object> generateReport(ReportInfo ri, ...) {
// some input validation
IReport report = ReportControllerFactory.getReportInstance( ri.getClassName() );
// ...
}

我知道我可以将 @Produces 注释与 ReportControllerFactory 中的另一个自定义注释一起使用,但是如何使用 @Inject 对于只能在完成一些验证后创建的变量,方法内?我该如何提交参数ri.getClassName()?构造 ReportController 时,对象 ri 是未知的。

非常感谢!

亲切的问候, 塞巴斯蒂安

编辑于2011年7月8日(10:00):

ReportFactory 类:

public static IReport getReportInstance( String className ) throws ReportException {

IReport report = null;

try {
Class<?> clazz = Class.forName( className );
report = (IReport) clazz.newInstance();
}
catch ( Exception e ) { … }

return report;
}

编辑 2(选择正确的报告实现)

报表实例是通过从 JSF 前端到 ReportController 的一些路径来选择的。 ManagedBean 调用一个 session bean,该 session bean 有多种方法,具体取决于在何处按下了哪个按钮。所有这些方法都设置报告名称并调用更通用的方法sendOrGetReport。此方法从数据库中选择指定报告的唯一键,并决定是发送电子邮件还是立即传送报告。我们假设它应该被交付。

然后ReportController开始发挥作用。他根据上述方法提供的唯一键和其他信息获取 ReportInfo 对象,并调用 ReportFactory 来创建 ri.getClassName() 类型的报告.

很喜欢吧?我认为整个部分可能需要一些重构。如果您没有发现任何简单的地方,我会跳过报告实现中的 @Inject 并对该资源进行 JDNI 查找。

最佳答案

为了动态创建正确的报告类,对已接受的答案进行小的更改即可解决问题。解决方案是 Instance<...> 为您提供特定类型的所有 bean 的列表。不需要生成注释。

创建一个工厂类,可以在运行时在注入(inject)的实例之间进行选择

public class ReportFactory {

@Inject Instance<IReport> availableReports;

public IReport createReport(String type) {

for (IReport report: availableReports) {
if (report.getType().equals(type)) { //or whatever test you need
return report;
}
}
return null;
}

现在需要动态选择报告的类可以使用这个工厂。

public class ReportCreator {

@Inject
private ReportFactory reportFactory;

public void createReport(String type) {
IReport report = reportFactory.createReport(type);
report.execute();
}
}

关于java - 使用 CDI 机制替换基于工厂的对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6621403/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com