Загрузка контекста пружины в приложении на основе EJB - PullRequest
8 голосов
/ 25 октября 2011

Ситуация следующая:

У меня есть бизнес-уровень, это проект EJB. На самом деле создан только один EJB. Этот EJB отвечает за предоставление классов обслуживания другим уровням, которые вызывают EJB. Я хочу представить Spring (для использования функции DI) в этом слое.

Меня беспокоит, каков наилучший способ загрузки контекста пружины в этом бизнес-уровне, чтобы контекст пружины не загружался снова и снова, когда вызывается EJB?

(В веб-проекте преимущество заключается в том, чтобы сконфигурировать контекст Spring в contextLoaderListener, и он загружается один раз только при запуске приложения)

Я думал о включении пружины в тот же слой, потому что:

  1. Сконфигурируйте зависимости всех DAO и классов обслуживания и внедрите их, где это необходимо.
  2. Использование поддержки весны для спящего режима на бизнес-уровне.
  3. Простота модульного тестирования, добавляя свойства в классы и моделируя их. Не нужно запускать другие слои снова и снова, чтобы проверить мои бизнес-классы / методы.
  4. Чтобы иметь возможность использовать AOP (Аспектно-ориентированное программирование) для ведения журнала и аудита на уровне метода.

Пожалуйста, помогите мне предложить наилучший способ загрузки контекста Spring в EJB-проекте. Я также хочу знать, есть ли альтернативы, если я могу загрузить то же самое на сервере приложений (я использую сервер приложений веб-сферы).

Спасибо и всего наилучшего,

Джитендрия Даш

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Spring должен быть настроен как часть вашего приложения обычным способом, которым вы всегда его устанавливаете.Затем вам нужно получить доступ к Spring bean-компонентам из слоя EJB.Чтобы получить доступ (адаптировано из этого поста ), создайте bean-компонент Spring следующим образом:

@Component
public class SpringApplicationContext implements ApplicationContextAware {
    private static ApplicationContext CONTEXT;
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }
    public static Object getBean(String beanName) {
        return CONTEXT.getBean(beanName);
    }
}

Затем для вызова соответствующего бина из унаследованного приложения:

SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl");

Контекст Spring инициализируется один раз, и ваш слой EJB может получить доступ по желанию.

2 голосов
/ 09 ноября 2011

Для EJB3 Spring рекомендует использовать EJB3 Inceptor Interceptor . По сути, вы указываете свой контекст Spring, используя ContextSingletonBeanFactoryLocator , что влечет за собой создание контекста Spring в beanContextRef.xml в вашем пути к классам. Вероятно, как часть вашего EAR. SpringBeanAutowiringInterceptor вводит ваш бин в ваш EJB.

0 голосов
/ 25 октября 2011

Маркировка EJB была как синглтон (@Singleton). И сохраняем контекст Spring в переменной в этом bean-компоненте после его создания один раз, чтобы вы могли возвращать один и тот же контекст снова и снова.

...