javascript
stackoverflow_Stackoverflow的见解:投票最多的是Spring 4问题
stackoverflow
在Stackoverflow上對Spring 4問題進(jìn)行投票和回答最多的是什么? 以下是最常見的五個(gè)問題和解答。
Spring中的@ Component,@ Controller,@ Repository和@Service批注有什么區(qū)別,它們可以互換使用還是具有特定功能?
這些構(gòu)造型旨在標(biāo)記多層應(yīng)用程序中的不同層。 業(yè)務(wù),表示層和持久層中的組件分別由@ Service , @ Component和@Repository進(jìn)行注釋,如下所示:
- 數(shù)據(jù)訪問組件帶有@Repository批注
- 服務(wù)組件@Service
- 控制器組件帶有@Controller批注
- 其他任何組件都用@Component注釋。
所有這些注釋本身都使用@Component進(jìn)行注釋。 所以問題是:我們可以對所有自動(dòng)掃描的類使用@Component嗎? 是的,沒有!
所有帶有此批注標(biāo)記的類都將被自動(dòng)掃描,但是,由于這些批注旨在幫助開發(fā)人員清楚地傳達(dá)組件的意圖,因此不會(huì)被視為一種好的做法。
這些注釋的技術(shù)互換性有一個(gè)例外。 @Repository標(biāo)記為其注釋的所有bean賦予特殊行為。 PersistenceExceptionTranslationPostProcessor自動(dòng)將持久性異常轉(zhuǎn)換應(yīng)用于任何標(biāo)有@Repository的 bean。
考慮一下Spring框架參考手冊中的以下段落。
后處理器自動(dòng)查找所有異常翻譯器(PersistenceExceptionTranslator接口的實(shí)現(xiàn)),并建議所有標(biāo)有@Repository批注的bean,以便發(fā)現(xiàn)的翻譯器可以攔截適當(dāng)?shù)霓D(zhuǎn)換并將其應(yīng)用于引發(fā)的異常。
進(jìn)一步的考慮是,在Spring框架的未來版本中,這些批注的使用可能會(huì)傳達(dá)與其各自層有關(guān)的特殊功能,并且通過適當(dāng)?shù)厥褂眠@些批注,您可以確保您的應(yīng)用程序?qū)⑹芤嬗诖祟惞δ?#xff0c;而無需進(jìn)行重構(gòu)或進(jìn)行最少的重構(gòu)。
原始問題和答案可以在Stackoverflow網(wǎng)站上查看。 感謝以下回答這些問題的海報(bào),它們是本文的一部分: akash746 , nijogeorgep和Colin McCree提出了原始問題。
DAO類,調(diào)用DAO的服務(wù)還是兩者?
答案分為兩個(gè)陣營:那些贊成在服務(wù)層注釋類的人,以及那些對DAO進(jìn)行注釋的人。
服務(wù)層
傳統(tǒng)的Spring體系結(jié)構(gòu)建議事務(wù)性語義位于服務(wù)級別。 操作的原子性應(yīng)該為我們的決定提供依據(jù)。 事務(wù)注釋應(yīng)放在所有不可分割的操作周圍。 考慮匯款的經(jīng)典示例。 它包含以下調(diào)用:
這兩個(gè)事務(wù)都必須成功或失敗,因此事務(wù)必須同時(shí)包含調(diào)用1和2。
如果服務(wù)層必須在數(shù)據(jù)訪問層中的DAO上調(diào)用不同的方法以執(zhí)行完整的操作,并且其中一個(gè)調(diào)用失敗,而其他成功則可能導(dǎo)致數(shù)據(jù)庫狀態(tài)不一致。 因此,在服務(wù)層進(jìn)行的調(diào)用周圍注釋將保護(hù)操作的原子性。
為了進(jìn)一步確定,您可能希望通過添加@Transactional(propagation = Propagation.MANDATORY)注釋數(shù)據(jù)訪問層中的借方和貸方通話。 這將確保事務(wù)已在調(diào)用方中啟動(dòng),并且如果不存在活動(dòng)事務(wù),則將引發(fā)異常。
與DAO方法上的直接注釋相比,對服務(wù)層進(jìn)行注釋可能導(dǎo)致更長的持久事務(wù)。 您做出的選擇將取決于業(yè)務(wù)邏輯所需的級別事務(wù)隔離。
道
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)正在出現(xiàn)一種新興趨勢。 Spring Roo是這種趨勢的一個(gè)很好的例子。
這樣做的目的是使域?qū)ο蟊葌鹘y(tǒng)的Spring架構(gòu)豐富得多,通常它們是貧血的,尤其是將事務(wù)和持久性語義放在域?qū)ο蟊旧砩稀?
在僅需簡單的CRUD操作的用例中,Web控制器將直接在域?qū)ο笊线\(yùn)行(在此上下文中充當(dāng)實(shí)體),并且沒有服務(wù)層。
如果域?qū)ο笾g需要某種協(xié)調(diào),則可以按照傳統(tǒng)使用@Transaction來實(shí)現(xiàn)服務(wù)bean句柄。 您可以將域?qū)ο笊系氖聞?wù)傳播設(shè)置為REQUIRED之類,以便域?qū)ο笫褂萌魏维F(xiàn)有事務(wù),例如在服務(wù)bean處啟動(dòng)的事務(wù)。
原始問題和答案可以在Stackoverflow網(wǎng)站上查看。 感謝以下回答這些問題的海報(bào),它們是本文的一部分: Willie Wheeler , Michael Wiles , mnp , tweekran , djt和Thomas Einwaller提出了原始問題。
在什么條件下使用哪個(gè)?
簡短的答案:沒有區(qū)別,可以互換使用。
更詳細(xì)地,@ Inject注釋是Java EE 7的上下文和依賴關(guān)系注入框架的一部分( JSR 346另請參見JSR 365 for Java 2.0),而@Autowired是Spring框架自己的實(shí)現(xiàn)(請參閱Java doc )。
原始問題和答案可以在Stackoverflow網(wǎng)站上查看。 感謝以下回答它們構(gòu)成本文一部分的海報(bào): pap和Rachel提出了原始問題。
有什么區(qū)別?
@Autowired (或@Inject )和@Resource批注具有相同的功能。 但是有一個(gè)概念上的區(qū)別:
- @Resource應(yīng)該用于通過名稱獲取已知資源。 名稱是從帶注釋的設(shè)置器或字段中提取的,或者是從注釋的名稱參數(shù)的名稱中獲取的。
- @Inject或@Autowired批注嘗試按類型注入合適的組件。
本質(zhì)上,這是兩個(gè)不同的概念。 令人失望的是,Spring的@Resource批注實(shí)現(xiàn)具有內(nèi)置的回退,當(dāng)解析按名稱失敗時(shí)會(huì)觸發(fā)該回退。 它回退到@Autowired批注所使用的分辨率類型。 盡管這種回退很方便,但是由于人們沒有意識(shí)到概念上的差異,因此可能會(huì)造成混亂,并且傾向于使用@Resource進(jìn)行基于類型的注入。
選擇依賴項(xiàng)的方式特定于注釋。 以下是每個(gè)批注解決注入的方式:
@Autowired和@Inject
@資源
Spring參考手冊中的這句話建議使用@Resource而不是@Autowired ,其中首選使用名稱注入。
如果您打算通過名稱表示注釋驅(qū)動(dòng)的注入,則即使技術(shù)上可以通過@Qualifier值引用bean名稱,也不要主要使用@Autowired 。 而是使用JSR-250 @Resource批注,該批注的語義定義是通過其唯一名稱來標(biāo)識(shí)特定目標(biāo)組件,而聲明的類型與匹配過程無關(guān)。
由于這種語義差異的特定結(jié)果,本身定義為集合或映射類型的bean無法通過@Autowired注入,因?yàn)轭愋推ヅ洳贿m用于它們。 對此類bean使用@Resource ,通過唯一名稱引用特定的collection或map bean。
@Autowired適用于字段,構(gòu)造函數(shù)和多參數(shù)方法,從而允許在參數(shù)級別縮小限定符注釋的范圍。 相比之下, @Resource僅支持具有單個(gè)參數(shù)的字段和bean屬性設(shè)置器方法。 因此,如果注入目標(biāo)是構(gòu)造函數(shù)或多參數(shù)方法,請堅(jiān)持使用限定詞。
原始問題和答案可以在Stackoverflow網(wǎng)站上查看。 謝謝以下海報(bào)誰的答案這篇文章的組成部分: 卡爾蒂克 , 斯蒂芬 , Ichthyo和mlo55誰問原來的問題。
Spring Framework的用途是什么?
Spring Framework可以描述為三種方式:
原始問題和答案可以在Stackoverflow網(wǎng)站上查看。 感謝以下回答這些問題的海報(bào),它們是本文的一部分: karstensrage和maksim ,他們提出了原始問題。
我希望您發(fā)現(xiàn)對stackoverflow上最受歡迎的問題的理解很有意思。 如果您有任何反饋意見,請發(fā)表評論。 可以在這里找到本文的原始文章: Stackoverflow的見解:Spring 4投票最多的問題。
如果您對設(shè)計(jì)模式感興趣,那么您可能會(huì)對我的新書感興趣: Professional Java EE Design Patterns 。 對于想要更有效地使用Java EE的任何人來說,它都是一個(gè)完美的伴侶,并且是涵蓋解決實(shí)際問題的設(shè)計(jì)模式的理論和應(yīng)用程序的唯一資源。
翻譯自: https://www.javacodegeeks.com/2016/02/insights-stackoverflow-voted-spring-4-questions.html
stackoverflow
總結(jié)
以上是生活随笔為你收集整理的stackoverflow_Stackoverflow的见解:投票最多的是Spring 4问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直径的定义 什么是直径
- 下一篇: 身份证号码的含义 各代表什么意思