Я хотел бы знать, могу ли я объединить ServiceLoader
с EJB и инъекцией из Java EE 6.
Представьте, что у меня есть интерфейс ServiceI
который может быть реализован двумя EJB BeanA
и BeanB
.
Если я зарегистрирую эти два класса в MEAT-INF/services
они будут создаваться на Java-пути, а не управляться контейнером приложений (например, при использовании @Inject
). Это означает, что аннотации, такие как @Inject
или @PostConstruct
, не будут разрешены.
Возможно ли иметь что-то вроде ServiceLoader
который позволит мне пройти через EJB beans, реализуя данный интерфейс и возвращая его на основе некоторых критериев?
Я нашел решение.
Если оба компонента реализуют интерфейс Service
вы можете сделать следующее:
@Inject
private javax.enterprise.inject.Instance.Instance<Service> services
services
реализуют Iterator<Service>
и позволят циклически перебирать все компоненты, реализующие интерфейс Service
.
Затем вы можете выбрать одну из реализаций, основанную на некоторых критериях, и у вас есть эквивалент ServiceLoader
для EJB!