亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Spring 設計:多合一組件?

Java Spring 設計:多合一組件?

守候你守候我 2022-01-12 14:47:44
有時 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個贊

第二種方法可能看起來很吸引人,首先想到的是眾所周知的外觀模式,所以我完全可以理解這一點。

但是,我認為第一種模式實際上會更好地工作,原因如下:

  1. 你說“萬能”的服務可以解決循環依賴

    好吧,循環依賴通常指向錯誤/糟糕的設計,并且是代碼本身的味道,因此將其隱藏在外觀后面不會改善系統,解決循環依賴會。此外,如果從由“AllServices”調用的實際服務中,您需要調用其他服務(同樣,保留了糟糕的設計),那么代碼可能會再次通過 AllServices,因此循環依賴仍然存在。

  2. 使用第二種設計假設這個“AllServices”類將被系統的所有組件使用,但在這種情況下,它變成了一個“一個中心點”,并且在這個類中重構可能會變得瘋狂——所有組件/他們的測試可能會受到影響

  3. 此服務的初始化本身可能會變得一團糟,因為您可能不想維護具有 20-30 個輸入參數的構造函數,您將求助于字段注入(如示例中),這本身就很糟糕,因為如果你想以某種方式初始化它,可能來自測試,或者你想知道什么應該被模擬,什么不是,以什么順序,等等。


查看完整回答
反對 回復 2022-01-12
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

第二種方法可能看起來更干凈,但很難知道哪個服務連接到服務/DAO,因此很難重構或執行/決定任何更改將導致哪個回歸。這意味著它會影響軟件的靈活性

這是一個重要的差異使不同選擇第一個選項恕我直言


查看完整回答
反對 回復 2022-01-12
  • 2 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號