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