2013-09-25 163 views
0

我已經在使用CDI@Inject在我的一些課程中獲得一些無狀態的服務。域對象被注入嗎?

我不知道是否也將是有意義的注入域對象,如下面的例子:

class UserSettings; 

class User { 
    //@Inject 
    private UserSetttings settings = new UserSettings(); 
} 

用戶應該始終有附加了一些默認設置,以後可以改變。你會在這裏使用CDI,還是堅持手動創建一個新對象?

或者更一般的說法:在哪裏使用CDI來說一般意義上的?哪裏不?


更新監製:

class Preferences { 
    @Produces @DefaultSettings 
    public UserSettings getDefaultSettings() { 
     UserSettings settings = new UserSettings(); 
     //configure default 
     return settings; 
    } 
} 


class User { 
    @Inject @DefaultSettings 
    private UserSettings settings; 
} 

回答

0

可以注入域對象。你可能不想注入默認的域對象,而是想爲它提供一個生產者。這個生產者基本上會根據一些設置創建域對象。你可以有一個「管理員」類型的類,它根據某些東西來加載具有必要屬性的對象,比如當前登錄的用戶。現在我做了類似的事情,拿着委託人並使用它來查找登錄用戶的信息,創建類似UserSettings的信息。你只需要確保你的UserSettings不是注射劑,使用否決權擴展或甚至不安裝它。

替代方案(我不特別喜歡但可以工作)是爲了讓您的域對象注入對持久性域的引用來查找數據。從概念上講,它看起來更清潔一些。設置代碼將採用@PostConstruct方法。

+0

所以,因爲我是生產者新手:我更新了我的第一篇文章 - 這是你會在這種情況下建議嗎?或者,如果不是,你能舉一個例子嗎? – membersound

+0

是的,這是一種方法。 '@ DefaultSettings'沒有登錄?如果用戶有自定義設置,會不會有另一種情況? –

0

用戶應該始終有附加了一些默認設置,可以 後來改變。你會在這裏使用CDI,還是堅持手動創建一個新的對象?

如果您的應用程序啓用了CDI,那麼您應該使用CDI,而不是手動創建新對象。

哪裏使用CDI通常有意義?哪裏不?

CDI有很多更廣泛的用途,允許開發人員具有很大的靈活性,以鬆耦合的,但類型安全方式的各種組件的集成。所以,CDI應該使用所有Java EE 6EE 7應用程序。如果您的應用程序不支持CDI,那麼您不應該使用它。

0

我想補充一點:好的代碼可以測試。而使用依賴注入來支持「Inversion of Control」總是一個好主意。想想你會如何測試你的代碼,如果是通過

private final UserSettings s = new UserSettings();內部創建設置...

這是很容易使其注射,然後用測試範圍(尖注射框架:用針( https://github.com/akquinet/needle))。