2011-10-25 76 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中。

相關問題