在基于EJB的应用程序中加载spring上下文

时间:2011-10-25 05:21:31

标签: java spring java-ee ejb spring-remoting

以下是这种情况:

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

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

(在Web项目中,有一个优点是在contextLoaderListener中配置spring上下文,并且仅在应用程序启动时才加载一次)

我想过将spring包含在同一层中,因为:

  1. 配置所有DAO和服务类的依赖关系,并在必要时将其注入。
  2. 在业务层中使用spring支持进行休眠。
  3. 通过将属性注入类并模拟它们来简化单元测试。不需要一次又一次地运行其他层,来测试我的业务类/方法。
  4. 能够使用AOP(面向方面​​编程)进行日志记录和方法级审计。
  5. 请帮助我建议最好的方法,在EJB项目中加载spring上下文。我也想知道,如果有任何替代方案,我可以在应用服务器中加载相同的内容(我正在使用Web领域应用服务器)。

    谢谢和问候,

    Jitendriya Dash

3 个答案:

答案 0 :(得分:3)

Spring应该以您始终设置的常规方式配置为应用程序的一部分。然后,您需要从EJB层访问Spring bean。要访问(改编from this post),请按如下方式创建一个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层可以随意访问。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

将EJB标记为单例(@Singleton)。并在创建一次后将spring上下文存储在此bean的变量中,以便您可以反复返回相同的上下文。