Зависимость инъекций в соответствии с условиями - PullRequest
0 голосов
/ 03 октября 2018

Мой контроллер:

@RestController
@RequestMapping("/mypath")
public class MyController {
   @Autowired
   MyServiceInterface service;

   @PostMapping("/{source}")
   void myControllerFunc(@PathVariable String source, @RequestBody MyObject obj) {
       ...
       Object myServiceObj = service.myServiceFunc(param);
       ...
   }
}

Мой сервисный интерфейс:

public interface MyServiceInterface {

   Object myServiceFunc(String param);

}

Мои сервисные реализации:

@Service    
public class MyServiceOne {

   Object myServiceFunc(String param) {
       ...
   }

}

@Service
public class MyServiceTwo {

   void myServiceFunc(String param) {
       ...
   }

}

Моя версия с весенней загрузкой: 1.5.7

Я хочу внедрить службу в соответствии с моей переменной пути («источник»).Если источник = один, введите MyServiceOne или если источник = два, введите MyServiceTwo.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Я не думаю, что это возможно и разумно.

A @RestController s по своей природе является синглтоном.Он настраивается при запуске и остается неизменным для каждого запроса.

Выражение /{source} оценивается во время запроса во время выполнения, когда контроллер уже настроен.

Опциирассмотреть:

  1. Внедрить обе службы и в методе решить, какую из них выбрать.
  2. Создать два отдельных контроллера для каждой службы.
  3. Используйте контекст приложения и извлекайте оттуда бины.
0 голосов
/ 03 октября 2018

Похоже, вам нужно, чтобы они оба были доступны, и каждый вызов метода на контроллере может выбрать другой.Так что соедините обе реализации с помощью квалификатора, чтобы различать их.Используйте переменную path в методе контроллера и позвольте ему программно решить, какую службу вызывать.

0 голосов
/ 03 октября 2018

Как описано в Получить bean-компонент из ApplicationContext по квалификатору , вы можете добавить квалификаторы для каждой реализации сервиса и получить что-то подобное в myControllerFunc:

BeanFactoryAnnotationUtils.qualifiedBeanOfType(ctx.getBeanFactory(), MyServiceInterface.class, source)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...