2017-10-20 133 views
0

避免我所經歷的春天文檔,和整個以下說明─爲什麼getBean()方法應該在Spring應用程序

來到然後可以使用的getBean檢索bean的實例。 ApplicationContext接口有幾個其他方法可用於 檢索bean,但理想情況下,您的應用程序代碼不應使用 這些方法。 事實上,您的應用程序代碼應該沒有調用 getBean()方法的所有,因此不依賴於所有的Spring API。例如,Spring與Web框架的集成爲各種Web框架組件(如 控制器和JSF管理的bean)提供了 依賴注入,允許您通過元數據聲明對特定Bean的依賴關係(例如自動裝配 註釋)。

參考 - https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html

在我的申請,我收到了一些參數,我的客戶的方法,在此基礎上,我注入接口的正確實施。 我這樣做的方式是在連接這些參數後搜索bean id。 例如,如果我收到type=C,subType=D,我通過調用getBean(beanId)獲得與bean id=typeCsubTypeD的bean。 即,我的依賴關係決定於運行時間。

我已經通過Why is Spring's ApplicationContext.getBean considered bad?

走了,但,這並不能掩蓋我的使用情況下(也通過在問題中留言討論)。

+0

有趣的問題,你可以分享代碼嗎?參數的方式是什麼? – Andrew

+0

我的項目在另一個應用程序中用作jar庫。該應用程序調用這個jar的方法。現在基於它通過什麼參數,我必須選擇bean併產生結果。 – Deb

回答

1

一般來說,我的建議是避免月份風味的狂熱分子。

如今,反轉控制的是非常多的炒作(爲的SOLID設計原則的一部分),因此,如果有人使用任何違背這一原則,人們會盲目地抨擊它,並說,你應該避免使用它。然而,真正的答案是在軟件設計方面沒有普遍的規律。如果您在應用程序中沒有使用控制反轉的正當理由,那麼在使用getBean()時肯定沒問題。原理通常是意思是意思是「在靜態初始化上下文中不要使用getBean()」,您可以改爲使用控制反轉。

例如,我們有一個使用Spring作爲「bean腳本語言」的應用程序,允許非開發人員在不使用完整的DSL的情況下定義可配置的Java Bean。如果你在這方面使用Spring,那麼你可以避免使用getBean()

+0

getBean()如何違背IoC?因爲,我仍然使用Spring容器(而不是依賴類)創建bean,並在運行時獲取bean。只是這一點,依賴關係在編譯時沒有解決。 – Deb

+1

由於您依賴的是ApplicationContext,除非上下文本身被注入,否則它不再是完全的IoC,因爲您必須知道如何獲取上下文本身。在關於服務定位器和IoC之間的區別的帖子中,有一個很好的討論,您提到的用例比純粹的IoC更像服務定位器。 –

相關問題