Может быть, вы можете использовать org.springframework.beans.factory.config.ServiceLocatorFactoryBean, определив MessageProcessorService:
public interface MessageProcessorService {
void process(Message message);
}
, а затем интерфейс для вашей фабрики услуг:
public interface MessageProcessorServiceFactory {
MessageProcessorService getMessageProcessorService(String messageType);
}
в своем классе конфигурации вы можете создать свою фабрику сервисов и реализовать свой другой процессор сообщений:
@Configuration()
public class Config {
@Bean
public ServiceLocatorFactoryBean serviceLocatorFactoryBean() {
ServiceLocatorFactoryBean serviceLocatorFactoryBean = new ServiceLocatorFactoryBean();
serviceLocatorFactoryBean
.setServiceLocatorInterface(MessageProcessorServiceFactory.class);
return serviceLocatorFactoryBean;
}
@Bean("typeB")
public MessageProcessorService typeBProcessorService() {
return new MessageProcessorService() {
@Override
public void process(Message message) {
System.out.println("Processing a B type message");
}
};
}
@Bean("typeA")
public MessageProcessorService typeAProcessorService() {
return new MessageProcessorService() {
@Override
public void process(Message message) {
System.out.println("Processing an A type message");
}
};
}
@Bean
public SomeService someService(){
return new SomeService();
}
}
Позвольте быть SomeService сервису, где вы получаете ваше сообщение:
@Service
public class SomeService {
@Autowired
private MessageProcessorServiceFactory factory;
public void doSomething(Message message) {
String messageType = message.getType();//Type must be typeA or typeB, matching processor beans names
MessageProcessorService messageProcessorService = factory.getMessageProcessorService(messageType);
messageProcessorService.process(message);
}
}
Итак, используяMessageProcessorServiceFactory, вы можете получить разные реализации процессора для каждого типа сообщений.
Надеюсь, это поможет