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