我有一个基本抽象类BaseProcessingObject
,其中有许多(大约40个)特定的后继类(ProcessingObject1
等)。
每个后继者都有自己的处理服务
@Service
class ProcessingService1 extends BaseProcessingService<ProcessingObject1> {
@ServiceActivator
@Override
String process( ProcessingObject1 anObject ) { '' }
}
其中
abstract BaseProcessingService<T extends BaseProcessingObject> implements Processor<T> { }
interface Processor<T extends BaseProcessingObject> {
String process( T anObject )
}
希望很清楚。
如果我只有BaseProcessingObject
类的后继实例,应该如何确定应该使用哪个服务激活器。
最原始的想法是创建一个像这样的地图
private static final Map<? extends BaseResposen, ? extends BaseProcessingService> OBJECT_TO_SERVICE_MAP = [(ProcessingObject1.class: ProcessingService1.class),
(ProcessingObject2.class: ProcessingService2.class),
....]
我在此网站上找到的另一种方法是添加一种额外的方法
boolean canHandle( T anObject )
进入Processor
界面,并在解析服务中执行以下操作:
@Autowired
private List<Processor> services;
public MyService findService( BaseProcessingObject anObject ) {
for( Processor service : services ) {
if( service.canHandle( anObject ) ) {
return service;
}
}
thron new Exception()
}
是否有一种更复杂的方法可以将此解决方案放在Spring DI肩膀上,也许可以避免使用其他方法? 我使用的是groovy-2.5和spring-boot-2.1.7。