一文掌握 Spring Boot 常用注解,保姆級整理,建議收藏!

親兄弟篇:? ?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 去校驗方法參數。

七、統一異常處理注解

異常處理通常也是我們在開發中一定要做的,因為不可能將一些程序員才能看懂的異常拋出到前端去(總會有不靠譜的同事忘記捕獲異常的),所以一般都會加上統一的異常處理,在對用戶不友好的錯誤堆棧轉換為普通用戶可以看懂的文案提示。

這里涉及到的注解只有兩個:

  1. @ControllerAdvice?: 定義全局異常處理類,包含 @Component 所以可以被 Spring 掃描到。

  2. @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應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163318.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端編碼技巧須知

前端開發中可能會使用到以下軟件,它們各自具有不同的作用: 代碼編輯器:例如Sublime Text、Atom、Visual Studio Code等,用于編寫和編輯HTML、CSS和JavaScript等前端代碼。網頁瀏覽器:例如Chrome、Firefox、Safari等&a…

多線程工具類ExecutorService的使用(所有任務執行完成后獲取最終結果)

我們經常會有這種需求,比如APP首頁,需要同時加載20多個接口,你怎么做?一個個按順序調用接口嗎?如果網絡通暢還好,如果網絡不好,你可能會讓首頁加載幾分鐘,用戶體驗肯定不好&#xff…

來聊聊JVM中的類加載過程以及雙親委派模型(學習Java必知內容)

文章目錄 1. 類加載過程加載驗證準備解析初始化 2. 雙親委派模型一個類的加載流程雙親委派模型的優點 總結 1. 類加載過程 在整個 JVM 執行過程中, 和我們程序員關系最密切的就是類加載的過程, 所以接下來我們來看下類加載的執行流程. 對于一個類來說, 它的生命周期是這樣的:…

python pymodbus庫使用教程(以Modbus RTU為例)

文檔: https://pymodbus.readthedocs.io/en/latest/ 源碼: https://github.com/riptideio/pymodbus/ 文章目錄 Python PyModbus庫使用教程:以Modbus RTU為例介紹安裝PyModbus配置串行連接導入必要的模塊創建Modbus客戶端實例 建立連接連接…

UEC++ day8

傷害系統 給敵人創建血條 首先添加一個UI界面用來顯示敵人血條設置背景圖像為黑色半透明 填充顏色 給敵人類添加兩種狀態表示血量與最大血量,添加一個UWidegtComponet組件與UProgressBar組件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok歷史探秘:短視頻中的時間之旅

在數字時代的浪潮中,TikTok嶄露頭角,成為社交媒體領域的一顆耀眼新星。這款短視頻應用以其獨特的創意、時尚和娛樂性質,吸引了全球數以億計的用戶。 然而,TikTok并非一夜之間的奇跡,它背后蘊藏著豐富而有趣的歷史故事…

[ChatGPT]ChatGPT免費,不用翻墻!?——你需要的裝備

系列文章目錄 【AIGC】服務于人類|一種新的人工智能技術-CSDN博客 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、天意云網站 ?編輯 二、使用步驟 可以看到有云服務器、Rstudio以及我們的ChatGPT,我這次主要分享ChatGPT,其他的有機會我再給…

常用服務注冊中心與發現(Eurake、zookeeper、Nacos)筆記(一)基礎概念

基礎概念 注冊中心 在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心,注冊中心按照服務名分類組織服務清單,服務…

電力感知邊緣計算網關產品設計方案-軟件架構(業務流程)

軟件架構(業務流程) 基于前端系統提供的硬件通信平臺,后端系統以控制執行單元為核心,協同控制通信管理、驅動適配、存儲單元等職能單元完成與前端系統的通信數據交互業務,在經歷以下業務流程后,完成設備自適應通信業務功能。 1.外部設備通信前端系統 前端系統連接新的…

OpenAI

OpenAI,在美國成立的人工智能研究公司,核心宗旨在于“實現安全的通用人工智能(AGI)”,使其有益于人類。 OpenAI于2015年由一群科技領袖,包括山姆阿爾特曼(Sam Altman)、彼得泰爾(Peter Thiel&a…

設計師不能忽視的幾個寶藏圖標設計工具

在這個快速變化的時代,設計師對創新和實用工具的需求越來越大。這就要求我們及時跟上潮流,不斷探索和嘗試最新、最有價值的圖標設計工具。只有這樣,我們才能在競爭激烈的設計市場中脫穎而出。以下是我們精心挑選的2024年值得一試的圖標設計工…

C語言實現求n以內最大的k個素數c

以下是C語言實現求n以內最大的k個素數的代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>bool is_prime(int num) { // 判斷素數int i;if(num < 2) {return false;}for(i 2; i < sqrt(num); …

服務器安全如何保障

主機安全是指保護計算機主機&#xff08;也稱為服務器、終端或主機設備&#xff09;免受潛在的安全威脅和攻擊的一系列措施和實踐。主機安全旨在防止未經授權的訪問、數據泄露、惡意軟件感染和其他安全漏洞的利用&#xff0c;主機一旦被黑客入侵&#xff0c;企業會面臨很多安全…

相比其他關系型數據庫,AntDB JDBC驅動特性有哪些不同之處

摘要&#xff1a;使用Java語言進行各類應用程序的快速開發成為目前比較主要且流行的開發方式。JDBC是 Java 語言中用來連接和操作關系型數據庫的 API&#xff0c;在業務程序與關系型數據庫通信時&#xff0c;必然會使用JDBC驅動。 本文將通過國產關系型數據庫AntDB中的JDBC為大…

【Effective C++】 (六) 繼承與面向對象設計

【六】繼承與面向對象設計 條款32 &#xff1a; 確保public繼承是"is a"的關系 Item 32: Make sure public inheritance models “is-a”. C面向對象程序設計中&#xff0c;最重要的規則便是&#xff1a;public繼承應當是"is-a"的關系。當Derived public繼…

3.1.2 Linux時間子系統 hrtimer示例使用

文章目錄 結構體定義接口初始化啟動修改取消示例示例1示例2示例3結構體定義 struct hrtimer {struct timerqueue_node node;ktime_t _softexpires;enum hrtimer_restart

生成目錄結構圖 tree命令

tree /f >info.txt tree命令可用于生成漂亮的目錄結構圖&#xff0c;在此之前&#xff0c;我一直以為是手打的…… .| index.html|\---static---css| bar.css| map.css| \---js

jQuery創建、插入、刪除對象

jQuery庫中的一些操作元素的方法 創建元素&#xff1a; $(htmlString)&#xff1a;這個構造器可以用來創建元素&#xff0c;其中htmlString是一個包含HTML標記的字符串。例如&#xff0c;$(<p>Hello, World!</p>)會創建一個<p>元素對象&#xff1b;$("&…

【uniapp】部分圖標點擊事件無反應

比如&#xff1a;點擊這個圖標在h5都正常&#xff0c;在小程序上無反應 css&#xff1a;也設置z-index&#xff0c;padding 頁面上也試過click.native.stop.prevent"changePassword()" 時而可以時而不行&#xff0c; 最后發現是手機里輸入鍵盤的原因&#xff0c;輸…

大型養殖場需要哪些污水處理設備

大型養殖場是一個涉及環境保護和可持續發展的關鍵行業&#xff0c;對于處理養殖場產生的污水有著明確的要求和標準。為了確保污水得到有效處理和處理效果達到國家排放標準&#xff0c;大型養殖場需要配備一系列污水處理設備。以下是幾種常見的污水處理設備&#xff1a; 1. 水解…