將一個類聲明爲Spring的 bean 的註解有哪些?

我們一般使用 @Autowired 註解自動裝配 bean,要想把類標識成可用於 @Autowired註解自動裝配的 bean 的類,採用以下註解可實現:

  • @Component :通用的註解,可標註任意類爲 Spring 組件。如果一個Bean不知道屬於哪個層,可以使用

  • @Repository : 對應持久層即 Dao 層,主要用於數據庫相關操作。

  • @Service :對應服務層,主要涉及一些複雜的邏輯,需要用到 Dao層。

  • @Controller : 對應 Spring MVC控制層,主要用戶接受用戶請求並調用 Service 層返回數據給前端頁面。

Spring 管理事務的方式有幾種?

編程式事務,在代碼中硬編碼。(不推薦使用)
聲明式事務,在配置文件中配置(推薦使用)

聲明式事務又分爲兩種:

基於XML的聲明式事務
基於註解的聲明式事務

事務特性(4種):

原子性 (atomicity):強調事務的不可分割.
一致性 (consistency):事務的執行的前後數據的完整性保持一致.
隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾
持久性(durability) :事務一旦結束,數據就持久到數據庫

Spring 事務中的隔離級別有哪幾種?

TransactionDefinition 接口中定義了五個表示隔離級別的常量:
TransactionDefinition.ISOLATION_DEFAULT: 使用後端數據庫默認的隔離級別,Mysql 默認採用的 REPEATABLE_READ隔離級別 Oracle 默認採用的 READ_COMMITTED隔離級別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

如果不考慮隔離性引發安全性問題:
髒讀 :一個事務讀到了另一個事務的未提交的數據
不可重複讀 :一個事務讀到了另一個事務已經提交的 update 的數據導致多次查詢結果不一致.
虛幻讀 :一個事務讀到了另一個事務已經提交的 insert 的數據導致多次查詢結果不一致.

解決讀問題: 設置事務隔離級別(5種)

DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
未提交讀(read uncommited) :髒讀,不可重複讀,虛讀都有可能發生
已提交讀 (read commited):避免髒讀。但是不可重複讀和虛讀有可能發生
可重複讀 (repeatable read) :避免髒讀和不可重複讀.但是虛讀有可能發生.
串行化的 (serializable) :避免以上所有讀問題.
Mysql 默認:可重複讀
Oracle 默認:讀已提交

Spring 事務中哪幾種事務傳播行爲?
支持當前事務的情況:

TransactionDefinition.PROPAGATION_REQUIRED: 如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
TransactionDefinition.PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
TransactionDefinition.PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。(mandatory:強制性)不支持當前事務的情況:
TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創建一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常。

其他情況:
TransactionDefinition.PROPAGATION_NESTED: 如果當前存在事務,則創建一個事務作爲當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。

發佈了54 篇原創文章 · 獲贊 2 · 訪問量 2962
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章