Если я создаю боб EJB3 (скажите, что сеансовый объект без сохранения состояния) в приложении с помощью Spring 2.5 для DI, как я должен ввести зависимости от Spring в боб, не связывая боб с Spring?
Я не знаю, рассматриваете ли вы возможность применения перехватчика в качестве связки, но, насколько мне известно, это стандартный подход. Из Главы 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) открытый класс MyFacadeEJB реализует MyFacadeLocal { // автоматически вводится соответствующий компонент Spring @Autowired частный MyComponent myComp; // для бизнес-метода делегировать сервису POJO impl. public String myFacadeMethod (...) { вернуть myComp.myMethod (...); } ... }
SpringBeanAutowiringInterceptor
, автор: по умолчанию получает целевые bean-компоненты изContextSingletonBeanFactoryLocator
, с контекстом, определенным в bean-компоненте файл определения с именемbeanRefContext.xml
. По умолчанию ожидается единственное определение контекста, которое получается по типу, а не по типу по имени. Однако, если вам нужно выбирать между несколькими контекстами определений, конкретный ключ локатора обязательный. Ключ локатора (т. Е. имя определения контекста вbeanRefContext.xml
) может быть явно указано либо через отвергаяgetBeanFactoryLocatorKey
метод в обычайSpringBeanAutowiringInterceptor
подкласс.
Единственный известный мне вариант (расширение классов поддержки EJB 2.x) намного хуже с точки зрения связывания (и поэтому не отвечает на ваш вопрос).