Как выбрать бин для внедрения во время выполнения
Я пытаюсь найти способ выбора между несколькими EJB-компонентами для внедрения во время выполнения.
Сценарий выглядит следующим образом: есть 2 компонента (ejbA, ejbB), которые реализуют один и тот же интерфейс (ejbInterface). В нескольких точках внедрения (другие управляемые bean-компоненты, т.е. в bean-компоненте ejbCaller) я хочу внедрить реализацию ejbInterface. Я буду знать, какой мне нужен во время выполнения (то есть, основываясь на некотором значении БД).
Я знаю, что один из рабочих способов сделать это - сделать выбор при развертывании с помощью аннотации @Alternative и дескрипторов развертывания, но я бы предпочел сделать выбор во время выполнения.
Я уже попробовал подход @Producer, но таким образом я могу вводить только неуправляемые объекты (объекты, которые я создаю в производителе, и которые не управляются контейнером или сами могут быть точками внедрения). Я нашел два обходных пути / подвиги производителя:
- Создайте неуправляемый объект и передайте любой управляемый объект (т. Е. Другие компоненты, менеджеры сущностей) через
setup
метод в ejbInterface (ejbCaller должен будет передать их) - Используйте поиск JNDI в источнике и верните управляемый объект
Оба обходных пути подвержены ошибкам и не элегантны. Есть ли лучшее решение для этого?
1 ответ
Просто введите BeanManager и используйте
javax.enterprise.inject.spi.BeanManager.getBeans(Type, Annotation...)
во время выполнения