Если я создаю bean-компонент EJB3 (скажем, сеансовый bean-компонент без сохранения состояния) в приложении, использующем Spring 2.5 для DI, как мне внедрить зависимости из Spring в bean-компонент без привязки bean-компонента к Spring?
Как вводить ресурсы в bean-компоненты EJB3 с помощью Spring 2.5?
Ответы:
Я не знаю, рассматриваете ли вы возможность применения перехватчика в качестве связи, но, насколько мне известно, это стандартный подход. Из Глава 18. Интеграция Enterprise Java Beans (EJB) а> документации:
18.3.2. Перехватчик внедрения EJB 3
Для сеансовых компонентов EJB 3 и компонентов, управляемых сообщениями, Spring предоставляет удобный перехватчик, который разрешает аннотацию Spring 2.5
@Autowired
в классе компонентов EJB:org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor
. Этот перехватчик можно применить с помощью аннотации@Interceptors
в классе компонентов EJB или с помощью элемента XML, связывающего перехватчик, в дескрипторе развертывания EJB.@Stateless @Interceptors(SpringBeanAutowiringInterceptor.class) public class MyFacadeEJB implements MyFacadeLocal { // automatically injected with a matching Spring bean @Autowired private MyComponent myComp; // for business method, delegate to POJO service impl. public String myFacadeMethod(...) { return myComp.myMethod(...); } ... }
SpringBeanAutowiringInterceptor
по умолчанию получает целевые bean-компоненты изContextSingletonBeanFactoryLocator
с контекстом, определенным в файле определения bean-компонента с именемbeanRefContext.xml
. По умолчанию ожидается одно определение контекста, которое получается по типу, а не по имени. Однако, если вам нужно выбрать между несколькими определениями контекста, требуется специальный ключ локатора. Ключ локатора (т. е. имя определения контекста вbeanRefContext.xml
) может быть явно указан либо путем переопределения методаgetBeanFactoryLocatorKey
в пользовательском подклассеSpringBeanAutowiringInterceptor
.
Единственный другой известный мне вариант (расширение классов поддержки EJB 2.x) намного хуже с точки зрения связи (и, следовательно, не отвечает на ваш вопрос).