第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

關(guān)于分層和循環(huán)注入的問(wèn)題,求大神幫忙解答一下

關(guān)于分層和循環(huán)注入的問(wèn)題,求大神幫忙解答一下

蝴蝶不菲 2019-03-13 17:14:35
通常我們?cè)谧鲆惶紫到y(tǒng)時(shí),一個(gè)請(qǐng)求的流程大概是action(controller)->service->dao,這個(gè)流程很清晰,也很簡(jiǎn)單,但是在具體業(yè)務(wù)中我們可能需要不同的業(yè)務(wù)之間的配合使用,這時(shí)可能需要service中調(diào)用service。例如AService中調(diào)用BService,BService中又調(diào)用CService,CService又調(diào)用AService,這樣我們就造成了A中注入B,B中注入C,C中又注入A的循環(huán)注入情況,這時(shí)Spring在初始化時(shí)就出問(wèn)題了。在查詢(xún)了一些資料中,基本上意見(jiàn)都是“這屬于系統(tǒng)設(shè)計(jì)問(wèn)題”,經(jīng)過(guò)不斷的思考,我想出一個(gè)解決辦法,那就是我們?cè)谄胀ǖ娜龑釉O(shè)計(jì)中再添加一層(BusinessService),我們規(guī)定:1,**Service層只面向單表(這里的單表指的是不注入其他service層,當(dāng)然在寫(xiě)sql時(shí)仍然可以join其他表,不過(guò)返回結(jié)果就需要自定義一個(gè)dto來(lái)接收)**。2,**若在service層只對(duì)數(shù)據(jù)庫(kù)負(fù)責(zé),要進(jìn)行數(shù)據(jù)持久時(shí),不校驗(yàn)數(shù)據(jù)的正確性,只校驗(yàn)數(shù)據(jù)是否為空,是否符合數(shù)據(jù)庫(kù)的非空約束、是否符合數(shù)據(jù)庫(kù)的索引約束等。**若有比較復(fù)雜的業(yè)務(wù)(需要多個(gè)子業(yè)務(wù)支撐)時(shí),我們?cè)贐usiness層中統(tǒng)一調(diào)用多個(gè)service層的方法,然后依次由BusinessService層進(jìn)行組裝和事務(wù)控制,舉個(gè)例子:我們現(xiàn)在有一個(gè)添加學(xué)生個(gè)業(yè)務(wù),添加學(xué)生總共有3個(gè)子業(yè)務(wù)   1,保存學(xué)生基本信息   2,更新學(xué)生所在的班級(jí)學(xué)生數(shù)量   3,更新學(xué)生所在的學(xué)校的學(xué)生總數(shù)那我們只需要在StudentBusinessService中依次注入StudentService、ClassStudentCountService、SchoolStudentCountService,并在StudentBusinessService中的add方法內(nèi)依次調(diào)用這三個(gè)子業(yè)務(wù)的對(duì)應(yīng)方法即可。如此,這樣A->B-C->A 就變成了 A-B,A-C(A層為BusinessService層,B、C為service層,service層永遠(yuǎn)不會(huì)調(diào)用BusinessService層,從而打破了之前循環(huán)結(jié)構(gòu)) 從而解決了之前的問(wèn)題了但是,隨著業(yè)務(wù)的增長(zhǎng),之前在BusinessService中定義的方法可能成為更大的一個(gè)業(yè)務(wù)中的一個(gè)子業(yè)務(wù)了,舉個(gè)例子,教師在從一個(gè)校區(qū)調(diào)到另一個(gè)校區(qū),此時(shí)需要將該教師原有的學(xué)生全部加入到現(xiàn)在的校區(qū)中(**此處為業(yè)務(wù)規(guī)定,不做合理性解釋**)那么也很簡(jiǎn)單,我們需要在TeacherBusinessService中注入StudentBusinessService即可,然后調(diào)用StudentBusinessService的add方法,然后add方法會(huì)調(diào)用其他子業(yè)務(wù),但是這樣可能又回到了之前的A->B-C-A的模式了,隨著業(yè)務(wù)的增長(zhǎng),很可能又會(huì)出現(xiàn)循環(huán)注入的問(wèn)題。我暫時(shí)還沒(méi)想出更好的解決辦法,不知各位是如何處理類(lèi)似的問(wèn)題的?
查看完整描述

4 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

我覺(jué)得這確實(shí)是系統(tǒng)設(shè)計(jì)問(wèn)題,一般系統(tǒng)分層原則是,越是底層越細(xì)化,例如數(shù)據(jù)庫(kù)的DAO基本是針對(duì)單個(gè)表的,越往上層越抽象化,比如某個(gè)Service可能會(huì)注入多個(gè)DAO來(lái)實(shí)現(xiàn)某個(gè)業(yè)務(wù)。
你提的問(wèn)題應(yīng)該就是Service沒(méi)有按照職責(zé)劃分清楚,比如StudentService應(yīng)只能實(shí)現(xiàn)Student相關(guān)的業(yè)務(wù),其它的業(yè)務(wù)應(yīng)該不歸它管理,因此在StudentService里面不應(yīng)該調(diào)用ClassService或者SchoolService。
就如你所言的解決方案,Service層本身根據(jù)不同的業(yè)務(wù)職責(zé)是可以分成多個(gè)層,只要確保在同一層里面的Service不會(huì)互相引用(也不應(yīng)該引用),復(fù)雜的業(yè)務(wù)需求應(yīng)當(dāng)由更上層的Service提供。
三層設(shè)計(jì)只是一個(gè)指導(dǎo)方針,你可以擴(kuò)展成n層,這依賴(lài)你業(yè)務(wù)需求的復(fù)雜度。

查看完整回答
反對(duì) 回復(fù) 2019-04-19
?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊

例如AService中調(diào)用BService,BService中又調(diào)用CService,CService又調(diào)用AService,這樣我們就造成了A中注入B,B中注入`C,C中又注入A的循環(huán)注入情況,這時(shí)Spring`在初始化時(shí)就出問(wèn)題了

Spring在單例的場(chǎng)景下,是可以解決循環(huán)依賴(lài)的問(wèn)題的,所以站在整個(gè)系統(tǒng)正確性角度上來(lái)看的話(huà),那么如果系統(tǒng)中存在循環(huán)依賴(lài),是不會(huì)對(duì)系統(tǒng)的正確性造成影響的

所以歸根結(jié)底來(lái)看,這確實(shí)是系統(tǒng)設(shè)計(jì)上應(yīng)該考慮的問(wèn)題

具體可以參考系統(tǒng)中循環(huán)引用


查看完整回答
反對(duì) 回復(fù) 2019-04-19
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊

首先,對(duì)于Spring中的循環(huán)引用是不會(huì)有問(wèn)題的,而且循環(huán)引用在很多時(shí)候也是不可避免,很多設(shè)計(jì)模式實(shí)際上都存在著循環(huán)引用的情況。

其次,對(duì)于像StudentService只調(diào)用StudentDao的情況只是理想情況下出現(xiàn)的,實(shí)際場(chǎng)景下,一個(gè)Service肯定會(huì)調(diào)用其他Service來(lái)完成自身功能。若不希望存在循環(huán)引用的情況,那只能讓Service依賴(lài)Dao(因?yàn)镈ao之間是不會(huì)存在互相依賴(lài)的情況),但這樣做會(huì)造成大量的代碼冗余,粒度也過(guò)細(xì)。

最后,在業(yè)務(wù)實(shí)現(xiàn)中,循環(huán)引用是正常的,對(duì)于Spring的管理、事物的處理來(lái)說(shuō)都不會(huì)產(chǎn)生問(wèn)題。


查看完整回答
反對(duì) 回復(fù) 2019-04-19
?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

分層的設(shè)計(jì)理念,分多了,更細(xì),維護(hù)起來(lái),有點(diǎn)不便。分少了,結(jié)構(gòu)混亂,不易維護(hù)。三層模型是經(jīng)過(guò)檢驗(yàn)的出來(lái)的結(jié)論。


查看完整回答
反對(duì) 回復(fù) 2019-04-19
  • 4 回答
  • 0 關(guān)注
  • 558 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)