如何帮助Spring根据服务激活器的参数选择合适的服务?

时间:2019-08-07 17:13:22

标签: java spring spring-boot groovy dependency-injection

我有一个基本抽象类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。

0 个答案:

没有答案