2013-01-12 43 views
3

難道我使用依賴注入下面的例子:我應該在這些域類上使用依賴注入嗎?

@Scope("prototype") 
@Component 
public class Order{ 
    @Autowired 
    public Order(User user,List<OrderItem> items,.......){ 

現在別的地方:

@Component 
public class PersistOrder{ 
    @Autowired 
    Provider<Order> orderProvider; 

    public void prepareOrder() { 
     Order order = orderProvider.get(); 

AS JSR-330的狀態中,Provider的get()方法返回訂購的新實例,但是什麼對象被傳遞給新訂單的構造函數?正如您所看到的,訂單具有自己的依賴性,必須在實際的訂單對象被檢索到方法之前注入它們。

沒有DI我只是創建所有必要的參數並將它們傳遞給新訂單的構造函數。那麼我應該在這裏使用DI嗎?

編輯:

這是該代碼似乎沒有DI:正如你看到我的用戶和訂單項目的ID,可以從DAO中得到他們的情況下

@Component 
public class PersistOrder{ 

    public void prepareOrder() { 
     User user=userDao.get(userId); 
     List<OrderItem> orderItems=orderItemDao.getAll(orderItemIds); 
     Order order = new SmartPhoneOrder(user,orderItems); 

。然後,我將這些實例傳遞給Order的子類的構造函數以獲取實例。這個過程對我來說似乎很清楚。我的意思是我如何使用DI來完成這項工作,以便我的代碼能夠在PersistOrder和Order類之間解耦?或者在這個例子中使用DI使邏輯更復雜?

+0

我認爲您已將訂單與訂單服務進行了合併。您通常會將用戶傳遞給返回用戶訂單的服務,並且您在撥打電話時會這樣做。 –

+0

其實我簡化了這個例子。是的,服務的prepareOrder()具有從視圖提供的參數,但它不會改變這個概念。假設我有一個有意義的順序(比如user,items,...)的所有必要對象的引用,但我必須將它們傳遞給順序的構造函數。這就是問題所在,因爲當我調用spring時,spring會實例化新順序get() –

+0

我編輯了問題並刪除了提到我的服務。現在我認爲這個問題不那麼令人困惑 –

回答

3

沒有依賴注入,域對象可以被認爲是貧血症,這可以說是一種反模式。通過擁有數據結構而沒有相關行爲,您正在失去面向對象的許多好處。例如,要評估Order.isValid(),您可能需要注入一些依賴項來執行驗證。

您可以通過使用得到Spring容器的上下文之外類依賴注入:

@Configurable 

然後,您可以聲明爲bean作爲protoype配方和Spring將使用AOP來調酒的構造和查找所需的依賴關係。 。即使查找依賴關係,對於你的淨效果也是依賴注入,因爲你只需要改變一行來注入其他的評估Order.isValid()的東西。

這種方式當你做新的訂單,或從你的持久性工廠得到它,它已經有「注入」的依賴關係。

要做到這一點,需要aspectJ編織,而不僅僅是默認的Proxy/CGLib編織。您可以使用Java代理的運行時編織或編譯時編織。 。 。我建議前者用於集成測試,後者用於部署。 。 。

服務VS域對象:

現在,你有豐富的域的選擇對象的問題就變成了放在哪裏的東西。服務與實體?我認爲服務應該基於可重用的域對象編排一個用例特定的過程。該服務是您的系統外部用戶的非OO網關。

。 。 Google Spring @Configurable獲取更多信息和基於AspectJ的域類依賴注入教程。

相關問題