2012-07-25 18 views
1

我有2個spring上下文:「webapplication」上下文和「core」上下文。上下文「核心」在服務器啓動時被初始化並連接到一個持有上下文的Singleton類。當web應用程序啓動時,「webapplication」上下文被初始化。Web應用上下文和服務上下文之間的雙向依賴關係

我想從一個上下文中的Bean注入Bean依賴關係到另一個上下文(雙向訪問)。 Web應用程序bean將成爲「會話」範圍的bean。

我正在測試這個概念驗證:webapp bean - >(取決於)核心bean - >(取決於另一個)webapp bean。

在web應用程序上下文初始化中,我可以將「核心」bean注入到「web應用程序」bean(一個BeanFactory,它支持單例做魔術),但無法弄清楚如何做相反的事情;因爲包含WebApplicationContext的Spring ThreadLocal尚未初始化。

問題是。這是我想要做的事嗎?如果答案是「是」,你會怎麼做?

提前致謝。

編輯:

我已經意識到我做錯了。事實是,我想在錯誤的時間向服務層注入一個依賴於會話bean的依賴;也就是說,在我沒有當前用戶會話的網絡初始化時間。

回答

1

這看起來像一個建築問題,而不是技術(當然不是Spring)。您的核心上下文和網絡上下文非常好。前者處理業務流程,後者則負責表示,也許是一些API。

網絡(表示,訪問)核心是可以理解的和所需的依賴 - 畢竟,你正在構建對業務程序的接口。這是默認情況下,如何工作,創建獨立的核心上下文的子(Web)應用程序上下文。

我幾乎不能想象一個反轉依賴的用例。爲什麼您的業務邏輯取決於Web層?如果您嘗試將應用程序遷移到其他表示技術(桌面,移動設備),該怎麼辦?你能證明這種倒置依賴的原因嗎?你是什​​麼意思會話bean

雙向依賴關係,以及持有對應用程序上下文的類加載器全局引用的靜態單例表明設計有問題。

+0

我的業務邏輯依賴於會話數據,因爲我需要(示例)在發送一些信息到後端層之前從服務bean內部訪問/處理購物車bean(具有會話範圍)。單例模式在許多體系結構中都是常見的做法,我們的單例模式持有ApplicationContext(不是類加載器)。爲什麼你說這是一個糟糕的設計實踐? – 2012-07-25 17:39:52

+0

@andresoviedo:謝謝澄清。您的業​​務邏輯不是從Web層調用的嗎?如果是這種情況,只需在web圖層中閱讀購物車並將其明確地作爲參數傳遞即可。關於單例 - 在單例的靜態字段中保留對「ApplicationContext」的引用(單例具有類加載器作用域,這就是我的意思)只是醜陋的,Spring提供了更好的機制。上下文繼承(如前面提到的Spring MVC)。更不用說那個單身人士本身有時被稱爲*反模式*。 – 2012-07-25 17:50:59

+0

謝謝。 Mi業務邏輯是從Web層調用的。我已經考慮過將Web bean作爲參數傳遞給服務層,但我想使用注入有作用域的會話Bean來簡化組件的佈線。 – 2012-07-25 18:39:45

相關問題