2011-04-20 65 views
20

我正在重新閱讀「有效Java」,同時在大量使用Spring依賴注入的商店工作。在閱讀布洛赫的書時,人們不禁會提起他對課堂不可變性的強調(他多次聲明類應儘可能不可變)。我不禁感到這與Spring依賴注入(以及大多數DI引擎)對javabeans標準的依賴有直接衝突。 閱讀'春天在行動'關於DI的章節看起來好像他們會讓布洛赫畏縮他們的可變類,這些可變類在您的權限之外實例化的對象可能在他們自己的權限中是可變的。易變性和彈性

布洛赫的想法對於春天來說太新奇了嗎? Spring模型被破壞了嗎? Bloch對不變性的立場僅適用於編寫庫代碼嗎?在編寫Spring代碼時,我應該使用許多getter和setter編寫靈活的對象,或者在構造函數中加載所有東西?

+3

布洛赫並沒有說「永遠不要讓事情變得可變」,他說「不要讓它們變得比必要更多」。如果你的框架需要一定程度的可變性,那麼這就是你必須忍受的。 – skaffman 2011-04-20 14:45:15

+1

那麼在關於可變性,伸縮構造函數和構建器模式的項目中,他會拋棄javabeans標準(指的是過時),但該標準是Spring的基礎,是否意味着Spring會過時? – nsfyn55 2011-04-20 14:55:06

+0

spring不依賴於javabeans標準。 – Bozho 2011-04-20 14:58:53

回答

11

事實上,即使您沒有強制執行此操作,spring beans也是不可改變的。

您只能提供一個通過構造函數注入初始化的final字段的獲取方。

通常你不這樣做,但你永遠不應該重新分配由DI框架注入的bean域。這是因爲除了它們的依賴關係外(其範圍是單例),Spring bean通常不會擁有任何狀態。當然,也有例外,比如原型和請求範圍的bean,這些很少見(例如,在2個大型項目和2箇中型項目中,我只使用了1個原型範圍的bean)

+3

我同意:大多數Spring instanciated對象是「singleton」,而不是真正「可變的」(服務,daos,控制器,transactionManagers,...)。 – Tristan 2011-04-20 14:50:20

+0

如果我將一個可變對象注入到最終字段中,該字段不會阻止該對象發生更改,從而導致易碎對象圖 – nsfyn55 2011-04-20 14:57:28

+0

@ nsfyn55,則完全由您決定注入哪個對象。它與DI無關。 – Bozho 2011-04-20 14:58:16

9

您可以讓類不可變,如果使用基於構造函數的注入,請使用依賴注入。這樣你可以避免不必要的制定者。

2

我沒有看到自己的衝突,特別是與Spring MVC。 Spring管理哪些bean?主要是你的控制器和你的服務/數據層你的DAO和服務。無論如何,這些通常都沒有實際狀態,也沒有設置者。如果你的問題在於setter注入(例如,你有你自己的類需要由Spring管理,並且你不想爲某些字段設置setter),那麼你可以使用構造函數注入(或者兩者兼有)。