gpt4 book ai didi

java - 条件注入(inject)bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:48 24 4
gpt4 key购买 nike

我想根据从客户端传递的字符串参数注入(inject)一个 bean。

public interface Report {
generateFile();
}

public class ExcelReport extends Report {
//implementation for generateFile
}

public class CSVReport extends Report {
//implementation for generateFile
}

class MyController{
Report report;
public HttpResponse getReport() {
}
}

我希望根据传递的参数注入(inject)报表实例。任何帮助将不胜感激。提前致谢

最佳答案

使用Factory method图案:

public enum ReportType {EXCEL, CSV};

@Service
public class ReportFactory {

@Resource
private ExcelReport excelReport;

@Resource
private CSVReport csvReport

public Report forType(ReportType type) {
switch(type) {
case EXCEL: return excelReport;
case CSV: return csvReport;
default:
throw new IllegalArgumentException(type);
}
}
}

报告类型 enum 可以在您使用 ?type=CSV 调用 Controller 时由 Spring 创建:

class MyController{

@Resource
private ReportFactory reportFactory;

public HttpResponse getReport(@RequestParam("type") ReportType type){
reportFactory.forType(type);
}

}

但是 ReportFactory 非常笨拙,每次添加新报表类型时都需要修改。如果报告类型列表是固定的,那很好。但如果您计划添加越来越多的类型,这是一个更健壮的实现:

public interface Report {
void generateFile();
boolean supports(ReportType type);
}

public class ExcelReport extends Report {
publiv boolean support(ReportType type) {
return type == ReportType.EXCEL;
}
//...
}

@Service
public class ReportFactory {

@Resource
private List<Report> reports;

public Report forType(ReportType type) {
for(Report report: reports) {
if(report.supports(type)) {
return report;
}
}
throw new IllegalArgumentException("Unsupported type: " + type);
}
}

使用此实现添加新的报告类型就像添加新的 bean 实现 Report 和新的 ReportType 枚举值一样简单。您可以不用 enum 并使用字符串(甚至可能是 bean 名称),但我发现强类型是有益的。


最后的想法:Report 名字有点可惜。 Report 类代表(无状态?)封装某些逻辑(Strategy 模式),而顾名思义它封装了(数据)。我会建议 ReportGenerator 或类似的东西。

关于java - 条件注入(inject)bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537620/

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