親兄弟篇:? ?SpringBoot注解大全(超詳細)_Maiko Star的博客-CSDN博客
一、SpringBoot常用注解
二、Bean處理注解
2.1 @Resource
依賴注入,自動導入標注的對象到當前類中,比如我們的 Controller 類通常要導入 Service 類(需要注意這里 Service 類要被 Spring 容器管理)。
2.2 @Component、
@Repository、
@Service、
@Controller、
@RestController
我們一般使用?
@Resource
?注解讓 Spring 容器幫我們自動裝配 bean。要想把類標識成可用于?@Resource
?注解自動裝配的 bean 就需要我們使用這幾個注解了,它們表示對應的類將被 Spring 容器管理。
-
@Component
?:通用的注解,可標注任意類為?Spring
?組件。如果一個 Bean 不知道屬于哪個層,可以使用@Component
?注解標注; -
@Repository
?: 對應持久層即 Dao 層,主要用于數據庫相關操作; -
@Service
?: 對應服務層,主要涉及一些復雜的邏輯,需要用到 Dao 層; -
@Controller
?: 對應 Spring MVC 控制層,一般需要注入 Service 類返回結果數據; -
@RestController
?: 繼承于 @Controller,區別在于標注后整個類所有方法將直接返回 JSON 數據,不再需要視圖解析處理,目前前后端分離的項目后端都是直接用這個注解的;
2.3??@Configuration
標注是 Java 代碼的配置類, Spring Boot 中推薦這種做法不再使用 xml 配置了;
2.4? ?@Scope
聲明 Spring Bean 的作用域,作用于一共有以下幾種:
-
singleton:唯一 bean 實例,Spring 中的 bean 默認都是單例的。
-
prototype:每次請求都會創建一個新的 bean 實例。
-
request:每一次 HTTP 請求都會產生一個新的 bean,該 bean 僅在當前 HTTP request 內有效。
-
session:每一次 HTTP 請求都會產生一個新的 bean,該 bean 僅在當前 HTTP session 內有效。
三、HTTP請求注解
3.1??@GetMapping
等價于 @RequestMapping(value="/test",method=RequestMethod.GET)
3.2??@PostMapping
?3.3??@PutMapping
put 方式的請求,常用語更新服務器上的資源。舉個例子:
PUT /users/7
(更新編號為 7 的學生)
3.4??@DeleteMapping
DELETE 請求,從服務器刪除特定的資源。
四、前后端參數傳遞注解
4.1??@RequestParam
?&?@PathVariable
@RequestParam 用在方法的參數前面,獲取請求中表單類型的key=value格式的數據。
@PathVariable 用于獲取請求路徑中的參數。
4.2??@RequestBody
獲取請求 body 中的數據,常用于搭配 @PostMapping 請求來提交對象數據. ?請求體 的Content-Type 必須為 application/json?格式的數據,接收到數據之后會自動將數據綁定到 Java 對象上去。
系統會使用 HttpMessageConverter 或者自定義的 HttpMessageConverter將請求的 body 中的 json 字符串轉換為 java 對象。
強調一下:請求方法只可以有一個@RequestBody
,但是可以有多個?@RequestParam
?和?@PathVariable
。 如果你的方法必須要用兩個?@RequestBody
?來接受數據的話,那你就只思考下你的設計了,或者套娃形式的。
4.3??@ResponseBody
表示該方法的返回結果直接寫入 HTTP response body 中,格式為 json。上面我們提到的 @RestController 其實就是 @Controller 和 @ResponseBody 兩個結合起來的。
五、讀取配置注解
5.1??@value
可以在任意 Spring 管理的 Bean 中通過這個注解獲取任何來源配置的屬性值。比如我們的 application.properties 或者 application.yml 配置文件中配置的屬性值,當然也可以是 JVM 屬性配置或者系統環境變量配置的值,如果對 Spring Boot 應用程序都有哪些屬性配置源以及它們之間的優先級不了解的小伙伴可以看我之前的文章:Spring Boot 屬性配置你所不知道的細節。
5.2??@ConfigurationProperties
(重點)
上面 @Value 在每個類中獲取屬性配置值的做法其實是不推薦的,我們一般在企業項目開發中,不會使用那么雜亂無章的寫法而且維護也麻煩,通過就是一次性讀取到一個 Java 配置類,然后需要使用的地方直接引用這個類就可以多次訪問了,方便維護。
5.3??@PropertySource
這個注解是用來指定讀取我們自定義的配置文件的。
六、參數校驗注解
數據的校驗的重要性就不用說了,即使在前端對數據進行校驗的情況下,我們還是要對傳入后端的數據再進行一遍校驗,避免用戶繞過瀏覽器直接通過一些 HTTP 工具直接向后端請求一些違法數據。
JSR(Java Specification Requests)?是一套 JavaBean 參數校驗的標準,它定義了很多常用的校驗注解,我們可以直接將這些注解加在我們 JavaBean 的屬性上面,這樣就可以在需要校驗的時候進行校驗了,非常方便!
校驗的時候我們實際用的是?Hibernate Validator?框架。Hibernate Validator 是 Hibernate 團隊最初的數據校驗框架,Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的參考實現,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)的參考實現,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的參考實現。
需要注意的是從 Spring Boot 2.3開始,我們還需要顯式地添加 spring-boot-starter-validation 依賴項,在此之前的 Spring Boot 版本是在 spring-boot-starter-web 依賴項中包含的不需要額外引入。
我現在使用的是 Spring Boot 2.5.2 版本了,所以手動增加依賴:
👉 需要注意的是:?所有的注解,推薦使用 JSR 注解,即?javax.validation.constraints
,而不是?org.hibernate.validator.constraints
6.1? Bean字段驗證注解
-
@NotEmpty
?被注釋的字符串的不能為 null 也不能為空 -
@NotBlank
?被注釋的字符串非 null,并且必須包含一個非空白字符 -
@Null
?被注釋的元素必須為 null -
@NotNull
?被注釋的元素必須不為 null -
@AssertTrue
?被注釋的元素必須為 true -
@AssertFalse
?被注釋的元素必須為 false -
@Pattern(regex=,flag=)
被注釋的元素必須符合指定的正則表達式 -
@Email
?被注釋的元素必須是 Email 格式。 -
@Min(value)
被注釋的元素必須是一個數字,其值必須大于等于指定的最小值 -
@Max(value)
被注釋的元素必須是一個數字,其值必須小于等于指定的最大值 -
@DecimalMin(value)
被注釋的元素必須是一個數字,其值必須大于等于指定的最小值 -
@DecimalMax(value)
?被注釋的元素必須是一個數字,其值必須小于等于指定的最大值 -
@Size(max=, min=)
被注釋的元素的大小必須在指定的范圍內 -
@Digits (integer, fraction)
被注釋的元素必須是一個數字,其值必須在可接受的范圍內 -
@Past
被注釋的元素必須是一個過去的日期 -
@Future
?被注釋的元素必須是一個將來的日期
驗證請求體(RequestBody)
只需要在請求處理方法中需要驗證的參數前加上?@Valid
?注解就會開啟校驗了,如果驗證失敗將拋出異常:MethodArgumentNotValidException
。
6.2? @Validated
如果你的入參不是用一個 Java 對象來接收的話,比如用 @PathVariables 和 @RequestParam 注解來獲取入參,這種情況下要校驗參數不要忘記在類的頭上加 @Validated 注解,這個參數可以告訴 Spring 去校驗方法參數。
七、統一異常處理注解
異常處理通常也是我們在開發中一定要做的,因為不可能將一些程序員才能看懂的異常拋出到前端去(總會有不靠譜的同事忘記捕獲異常的),所以一般都會加上統一的異常處理,在對用戶不友好的錯誤堆棧轉換為普通用戶可以看懂的文案提示。
這里涉及到的注解只有兩個:
-
@ControllerAdvice
?: 定義全局異常處理類,包含 @Component 所以可以被 Spring 掃描到。 -
@ExceptionHandler
?: 聲明異常處理方法,表示遇到這個異常,就執行標注的方法。
八、JPA數據持久化注解
上面是百度百科給的概念,只能說在實際項目開發中還是用的不多,大家還是喜歡用 Mybatis,不過相比更加簡潔的技術還是要學習下的。
創建表
-
@Entity
-
@Table
這倆是放在 Java Bean 上面用來標注數據庫實體對象和表明之間的映射關系的。
創建主鍵
-
@Id
-
@GeneratedValue
這倆主鍵放在 Bean 的字段上,用來標識數據庫的主鍵以及主鍵自動生成的。通過?@GeneratedValue
直接使用 JPA 內置提供的四種主鍵生成策略來指定。
-
GenerationType.TABLE
?持久化引擎通過關系數據庫的一張特定的表格來生成主鍵; -
GenerationType.SEQUENCE
?隨機序列; -
GenerationType.IDENTITY
?主鍵自增長; -
GenerationType.AUTO
?持久化引擎會根據數據庫在以上三種主鍵生成策略中選擇,默認選擇的就是這個策略;
設置字段類型
@Column
?聲明字段。
比如:Java Bean 屬性名為 nickName 對應的數據庫字段名為 user_name,長度為 32,非空。
設置字段類型并且加默認值,這個還是挺常用的。
指定不持久化特定字段
@Transient
?:有一些字段我們有時間不需要落庫,就可以加上這個注解就好了。
@聲明事務
這個注解可以作用于類上,也可以作用于方法上。前者表示所有該類的 public 方法都配置相同的事務屬性信息,后者表示當類配置了@Transactional,方法也配置了@Transactional,方法的事務會覆蓋類的事務配置信息。
Exception 分為運行時異常 RuntimeException 和非運行時異常。在?@Transactional
?注解中如果不配置 rollbackFor 屬性,那么事物只會在遇到 RuntimeException 的時候才會回滾,加上?rollbackFor=Exception.class
?,可以讓事物在遇到非運行時異常時也回滾。
九、?JSON格式處理注解
9.1? 指定過濾字段
-
@JsonIgnoreProperties
?作用在類上用于過濾掉特定字段不返回或者不解析。 -
@JsonIgnore
一般用于類的屬性上,作用和上面的@JsonIgnoreProperties
?一樣。
9.2? 格式化 json 數據
要注意的是,它只會在類似 @ResponseBody 返回 json 數據的時候,才會返回格式化的?yyyy-MM-dd HH:mm:ss
?時間,你直接使用System.out.println()輸出的話,仍然是類似?Fri Dec 01 21:05:20 CST 2017
?這樣的時間樣式。
9.3? 扁平化對象
@JsonUnwrapped
這個可能不太好說,大家直接看代碼就懂了:
未扁平化之前:
使用?@JsonUnwrapped
?扁平對象之后:
十、測試處理注解
@ActiveProfiles
一般作用于測試類上, 用于聲明生效的 Spring 配置文件。
@Test
聲明一個方法為測試方法。
@Transactional
被聲明的測試方法執行后數據會被回滾,避免污染測試數據。
@WithMockUser
?Spring Security 提供的,用來模擬一個真實用戶,并且可以賦予權限。
十一、配置啟動注解
@SpringBootApplication
?: 等價于使用 @Configuration、@EnableAutoConfiguration、@ComponentScan ?三個注解。
@Configuration
:聲明是是一個 Java 形式的配置類,Spring Boot 提倡基于 Java 的配置,相當于你之前在 xml 中配置 bean;
@EnableAutoConfiguration
:類級別的注解,這個注解告訴 Spring Boot 根據添加的 jar 依賴猜測你想如何配置 Spring,也就是 Spring 實現自動配置的開關。
@ComponentScan
:標注哪些路徑下的類需要被Spring掃描。
@Conditional
:Spring4 新提供的注解,通過 @Conditional 注解可以根據代碼中設置的條件裝載不同的 bean,也是SpringBoot實現自動配置的基石。
Spring Boot 源碼中大量擴展了 @Condition 注解,用于實現智能的自動化配置,滿足各種使用場景。下面我給大家列舉下:
-
@ConditionalOnBean?:配置了某個特定的Bean時條件為真。
-
@ConditionalOnMissingBean?:沒有配置特定的Bean時條件為真。
-
@ConditionalOnClass:Classpath里有指定的類時條件為真。
-
@ConditionalOnMissingClass:Classpath里沒有指定的類時條件為真。
-
@ConditionalOnExpression:給定的SpEL表達式計算結果為true。
-
@ConditionalOnJava:Java的版本匹配特定值或者一個范圍值。
-
@ConditionalOnJndi:參數中給定的 JNDI 位置必須存在一個,如果沒有給參數,則要有 JNDI InitialContext。
-
@ConditionalOnProperty:指定的配置屬性要有一個明確的值。
-
@ConditionalOnResource:Classpath里沒有指定的資源。
-
@ConditionalOnWebApplication:這是一個Web應用程序。
-
@ConditionalOnNotWebApplication:這不是一個Web應用程序。