9

以下是情况:

我有一个业务层,即一个 EJB 项目。实际上,只创建了一个 EJB。此 EJB 负责将服务类公开给调用 EJB 的其他层。我想在这一层引入spring(使用DI特性)。

我担心的是,在这个业务层中加载 spring 上下文的最佳方法是什么,以便在调用 EJB 时不会一次又一次地加载 spring 上下文?

(在 Web 项目中,在 contextLoaderListener 中配置 spring 上下文是有好处的,它只在应用程序启动时加载一次)

我曾考虑在同一层中包含弹簧,因为:

  1. 配置所有 DAO 和服务类的依赖关系,并在必要时注入它们。
  2. 在业务层使用spring对hibernate的支持。
  3. 通过将属性注入到类中并对其进行模拟,易于单元测试。不需要一次又一次地运行其他层来测试我的业务类/方法。
  4. 能够使用 AOP(面向方面​​的编程)进行日志记录和方法级别的审计。

请帮我建议最好的方法,在 EJB 项目中加载 spring 上下文。我也想知道,如果我可以在应用程序服务器中加载相同的内容(我正在使用 Web sphere 应用程序服务器),是否还有其他选择。

谢谢并恭祝安康,

Jitendriya Dash

4

3 回答 3

4

Spring 应该以通常设置的方式配置为应用程序的一部分。然后您需要从 EJB 层访问 Spring bean。要访问(改编自这篇文章),请创建一个 Spring bean,如下所示:

@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);
    }
}

然后,从遗留应用程序调用有问题的 bean:

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

Spring上下文初始化一次,你的EJB层可以随意访问。

于 2011-10-25T15:05:19.500 回答
2

对于 EJB3,Spring 建议使用EJB3 注入拦截器。基本上,您使用ContextSingletonBeanFactoryLocator指定您的 Spring 上下文,这需要在您的类路径中的 beanContextRef.xml 中创建您的 Spring 上下文。可能是您 EAR 的一部分。SpringBeanAutowiringInterceptor 将您的 bean 注入您的 EJB。

于 2011-11-09T03:39:39.927 回答
0

将 EJB 标记为 Singleton ( @Singleton)。并将 spring 上下文存储在这个 bean 中的一个变量中,在它被创建一次之后,这样你就可以一次又一次地返回相同的上下文。

于 2011-10-25T07:38:34.177 回答