4 回答

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ù)雜度。

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)引用

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)題。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
添加回答
舉報(bào)