2011-10-25 40 views
7

以下是这种情况:在基于EJB的应用程序中加载弹簧上下文

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

我的问题是,在这个业务层中加载spring上下文的最佳方式是什么,以便每当EJB被调用时,spring上下文都不会一次又一次地加载?

(在Web项目中,有一个优势,而配置在ContextLoaderListener的春天上下文,它就会被加载一次,只有当应用程序被启动)

我曾经想过,包括在同一层,因为春天:

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

请帮助我建议在EJB项目中加载spring上下文的最佳方式。我也想知道,如果有任何替代方案,我可以在应用程序服务器中加载它(我正在使用Web球体应用程序服务器)。

感谢和问候,

Jitendriya短跑

+0

不是EJB 3.1有它自己的依赖性注入框架,并且CDI会更好地集成我只需要一个轻量级的DI? – Ralph

回答

0

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

2

Spring应该以常规方式配置为应用程序的一部分,并且您始终可以进行设置。然后你需要从EJB层访问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); 
    } 
} 

然后,从继承应用程序调用问题豆:访问(改编from this post),按如下方式创建一个Spring bean

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

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

2

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

相关问题