gpt4 book ai didi

spring - 以 spring-boot 代码中的多态性为条件进行重构

转载 作者:行者123 更新时间:2023-12-02 04:11:27 26 4
gpt4 key购买 nike

我看过 Martin Fowler 在《重构》中给出的示例 Here

不确定如何以 spring-boot 方式(IoC)实现它。

我正在开发 Spring Web 应用程序。我有一个 REST Controller ,它接受 studentIdfileType并导出给定 fileType学生的数据格式。 Controller 来电ExportService exportFile()方法看起来像

@Service
public class ExportServiceImpl implements ExportService {
public void exportFile(Integer studentId, String fileType) {
if (XML.equals(fileType)) { exportXML(studentId);}
else if()... // and so on for CSV, JSON etc
}
}

以多态性为条件进行重构,

首先我创建了抽象类,

abstract class ExportFile {
abstract public void doExport(Integer studentId);
}

然后我为每个文件类型导出创建服务。例如 XML 导出以下是一项服务,

@Service
public class ExportXMLFileService extends ExportFile {
public void doExport(Integer studentId) {
// exportLogic will create xml
}
}

现在我的 ExportService 应该看起来像,

@Service
public class ExportServiceImpl implements ExportService {
@Autowired
private ExportFile exportFile;

public void exportFile(Integer studentId, String fileType) {
exportFile.doExport(studentId);
}
}

现在我被困住了:(

无法获取,如何@Autowired ExportFile根据 fileType 就会知 Prop 体要引用哪个服务?

如果我错了,请纠正我。我们将非常感谢您的回复:)

最佳答案

您将需要实现工厂模式。我做了类似的事情。您将拥有一个 ExportServiceFactory ,它将根据特定的输入参数返回 ExportService 的具体实现,如下所示:

@Component
class ExportServiceFactory {

@Autowired @Qualifier("exportXmlService")
private ExportService exportXmlService;

@Autowired @Qualifier("exportCsvService")
private ExportService exportCsvService;

public ExportService getByType(String fileType) {
// Implement method logic here, for example with switch that will return the correct ExportService
}

}

如你所见,我使用了 Springs @Qualifier这将决定将注入(inject)什么实现。

然后,每当您需要使用 ExportService 时,您都将在代码中注入(inject)工厂并获取正确的实现,例如

  ...
@Autowired
private ExportServiceFactory exportServiceFactory;

...
// in method, do something like this
exportServiceFactory.getByType(fileType).doExport();

我希望这能帮助您走上正确的道路。至于工厂方法中的切换 - 没关系,因为您现在已经解耦逻辑以从与之无关的代码中检索特定的实现。

关于spring - 以 spring-boot 代码中的多态性为条件进行重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36542564/

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