有時 Spring 組件可能如下所示:@Servicepublic final class SomeService { @Autowired private SomeService2 someService2; @Autowired private SomeService3 someService3; @Autowired private SomeService4 someService4; // … and many other services @Autowired private SomeDao someDao; @Autowired private SomeDao2 someDao2; @Autowired private SomeDao3 someDao3; // … and many other DAOs}換句話說,Spring 組件有很多服務和 DAO,這些服務和 DAO 在其他 Spring 組件中大部分是重復的。恕我直言,它有以下缺點:用于自動裝配大多數相同組件的不必要(樣板)代碼有時由于組件之間的循環引用,可能會出現 Spring 上下文加載錯誤如何使用組合所有服務或所有 DAO 的一體化組件。它將僅包含指向 Spring 組件的鏈接,其中沒有任何業務邏輯:@Servicepublic final class AllServices { @Autowired private SomeService2 someService2; @Autowired private SomeService3 someService3; @Autowired private SomeService4 someService4; // … and many other services // get methods to get some service public someService getSomeService(){};并將其注入其他組件:@Servicepublic final class SomeService { @Autowired private AllServices serv; @Autowired private AllDaos daos; @Autowired private Environment env;// inside some code…serv.getSomeService().processData();恕我直言,如果沒有循環引用問題,它看起來會更簡潔……這種方法有什么優點和缺點?
2 回答

繁花如伊
TA貢獻2012條經驗 獲得超12個贊
第二種方法可能看起來很吸引人,首先想到的是眾所周知的外觀模式,所以我完全可以理解這一點。
但是,我認為第一種模式實際上會更好地工作,原因如下:
你說“萬能”的服務可以解決循環依賴
好吧,循環依賴通常指向錯誤/糟糕的設計,并且是代碼本身的味道,因此將其隱藏在外觀后面不會改善系統,解決循環依賴會。此外,如果從由“AllServices”調用的實際服務中,您需要調用其他服務(同樣,保留了糟糕的設計),那么代碼可能會再次通過 AllServices,因此循環依賴仍然存在。
使用第二種設計假設這個“AllServices”類將被系統的所有組件使用,但在這種情況下,它變成了一個“一個中心點”,并且在這個類中重構可能會變得瘋狂——所有組件/他們的測試可能會受到影響
此服務的初始化本身可能會變得一團糟,因為您可能不想維護具有 20-30 個輸入參數的構造函數,您將求助于字段注入(如示例中),這本身就很糟糕,因為如果你想以某種方式初始化它,可能來自測試,或者你想知道什么應該被模擬,什么不是,以什么順序,等等。

海綿寶寶撒
TA貢獻1809條經驗 獲得超8個贊
第二種方法可能看起來更干凈,但很難知道哪個服務連接到服務/DAO,因此很難重構或執行/決定任何更改將導致哪個回歸。這意味著它會影響軟件的靈活性
這是一個重要的差異使不同選擇第一個選項恕我直言
添加回答
舉報
0/150
提交
取消