2013-08-20 163 views
0

我在想我的一些服務。 他們中有些人是這樣的:春季服務層 - autowire所有服務

@Service 
public class UserService { 

    @Autowired 
    UserDao dao; 

    @Autowired 
    OtherService1 serv1; 
    @Autowired 
    OtherService2 serv2; 
    @Autowired 
    OtherService3 serv3; 
    .... 



} 

我想..如果自動裝配等業務到一個服務的概念是很常見的,爲什麼不創建一個「主服務」:

@Service 
public class MasterService { 


    @Autowired 
    OtherService1 serv1; 
    @Autowired 
    OtherService2 serv2; 
    @Autowired 
    OtherService3 serv3; 
    ... 
    @Autowired 
    LastService servN; 


} 

並將此服務自動裝入所有服務。

@Service 
public class AnyService { 

    @Autowired 
    MasterService masterSevice; 
} 

這樣,我們不會有每個服務的許多服務,但只有一個單一的一個統治他們所有..

兩個問題上升:

1)由於masterService包含了所有的服務,我們有一個循環注射。我們可以解決它嗎?

2)如果問題1的答案是「是」 - 這個「masterService」是一種好的做法嗎?

回答

1

1)Spring在很多情況下都能夠處理依賴循環,特別是在不使用構造函數注入的情況下。

2)儘管如此。你應該完全避免這種設計。它打破了良好架構的許多原則:

  • 組件只能根據需要訪問其他組件。 Demeter's Law
  • 分離關注點。服務不應該同時處理業務邏輯和演示。
  • 抽象層次。服務不應該同時處理數據的邏輯視圖和它的持久性視圖。

打破這樣的原則可能會導致不好的情況,如:

  • 能力遵循代碼路徑(單個請求將是很難理解和依靠多層次的順序經過12個服務的條件邏輯)。
  • 很難知道哪些組件依賴於彼此。
  • 強耦合代碼(更改低級別服務將導致高級別服務的更改)。

您從這樣的設計中獲得的優勢非常小(您只需避免幾個@Autowired註釋)並且不值得冒這個風險。

1
  1. 爲什麼會有循環依賴?有一項服務包含所有其他服務,並且沒有包含它的其他服務。話雖如此,通過將依賴項設置爲屬性而不是構造函數arg,可以很容易地解決循環依賴問題。

  2. 我不這麼認爲,這是一種很好的模式來聲明一種層次結構(例如在端點中),但是這樣做的優點是什麼?您也可以在沒有它的情況下自動裝載您想要的所有服務。

0

1)MasterService不一定包含循環。如果是這樣,那麼你會遇到問題,並且首先不要在一個循環中構建bean。

2)如果你注入大量短命的豆子,這可能是有效的,但是這種方法的缺點是,任何插入MasterService實例的人都可能搞砸其他豆子的服務。你可以把它隱藏在getter方法的後面,但是將所有東西集中在一起通常不會帶來太多好處。

相反,它通常最好相關服務結合在一起,也許OtherService1OtherService2的,並且將它們放置在接口上。這使得嘲笑測試變得更容易,並將相關概念保存在一起(理想情況下是在他們自己的jar /模塊中)。

0

我還沒有遇到過這樣的模式(包含其他服務的一個服務)。 我常見和使用的是類似下面的東西 -

* SpecificController1 - > SpecificService1 - > SpecificDao1

SpecificController2 - > SpecificService2 - > SpecificDao2現在

,如果SpecificService1需求某些功能已在SpecificService2中提供,只有它會參考SpecificService2

所以,我有上述關於模式的幾個問題:

  1. 將如何被使用的MasterService?即任何需要任何服務的控制器(或任何人)將首先使用MasterService來獲得對實際服務的引用,否則MasterService將充當代表?
  2. 在哪種情況下,您是否需要這樣的設計以及哪些優勢?
+0

1.引用(公共接口)2.優點是所有公共服務都可以從任何服務中獲得,並且不需要在每個服務中自動裝配大量服務。而且,當你使用xml的時候,優勢更大 – Urbanleg