2016-03-15 57 views
-1

「本地」我的意思是這個bean在方法調用期間被創建和銷燬。這與調用構造函數基本相同,優點是可以在該bean的字段中使用@Inject。在CDI中是否存在「局部」範圍的bean?

爲什麼我要這麼做
我重構舊代碼使用CDI。我想extract very long methods into classes。來自該方法的局部變量將被類中的字段替換,因此該bean將具有僅屬於該短暫作用域(方法調用的持續時間)的狀態。該bean還將依賴於服務和其他更廣泛的bean,我寧願將它們傳遞給構造函數的長參數列表。

+0

如果你重構類,你可以讓它們成爲一個「無狀態」的applicationcoped bean,這樣你就不需要考慮這種更窄的範圍 – maress

回答

0

CDI不支持方法注入(除了setter和構造函數)。所以不能這樣做,因爲@Dependent範圍依賴於包含的bean而不是調用方法。

在你的情況下,即使這個工作,它會產生一個無限循環,因爲你需要將容器傳遞給孩子,然後將孩子傳遞給容器,等等。

解決辦法是改爲注入工廠。

0

考慮到標準的CDI範圍,@RequestScoped可能是最適合您的短命豆,即使它們的生命週期比單一方法調用更長。

無狀態@ApplicationScoped bean(例如服務)可以並行處理任意數量的@RequestScoped bean(例如命令)。

如果不適合您,您可以隨時使用CDI擴展名定義自定義作用域。