SpringBoot 注解全解析

注解的優勢:

  • 采用純 java 代碼,不在需要配置繁雜的 xml 文件
  • 在配置中也可享受面向對象帶來的好處
  • 類型安全對重構可以提供良好的支持
  • 減少復雜配置文件的同時亦能享受到 springIoC 容器提供的功能

1. 常用的Spring Boot注釋及其用途和示例

1)@SpringBootApplication

這是一個組合注解,它包含了 @Configuration,@EnableAutoConfiguration 和 @ComponentScan 三個注解。它的作用是標記 Spring Boot 應用的主類,讓 Spring Boot 自動進行必要的配置,掃描并加載符合條件的組件或 bean 定義,啟動內嵌的 web 服務器等。一般來說,我們只需要在主類上添加這個注解,就可以快速啟動一個 Spring Boot 應用。

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

2)@RestController

這是一個組合注解,它包含了 @Controller 和 @ResponseBody 兩個注解。它的作用是標記一個控制器類,表示該類的所有方法的返回值都直接寫入 HTTP 響應體中,而不是解析為跳轉路徑。這個注解通常用于構建 RESTful 的 API,返回 JSON 或 XML 格式的數據。

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable("id") Long id) {return userService.getUserById(id);}
}

3)@RequestMapping

這是一個用于映射 HTTP 請求的注解,它可以用在類或方法上。它的作用是指定一個或多個請求路徑,以及對應的請求方法,請求參數,請求頭等條件,將其綁定到一個控制器方法上。它還可以指定一個返回值的媒體類型,以及一個視圖名稱等屬性。

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {return "Hello, Spring Boot!";
}

4)@GetMapping、@PostMapping、 @PutMapping、 @DeleteMapping、@PatchMapping

這些注解都是 @RequestMapping 的縮寫,它們分別對應了 GET, POST, PUT, DELETE, PATCH 這五種 HTTP 請求方法。它們的作用是簡化 @RequestMapping 的寫法,只需要指定一個請求路徑即可,其他屬性都有默認值。它們的用法和 @RequestMapping 類似,只是更加簡潔。

@GetMapping("/hello")
public String hello() {return "Hello, Spring Boot!";
}@PostMapping("/users")
public User createUser(@RequestBody User user) {return userService.saveUser(user);
}

5)@PathVariable、@RequestParam、@RequestBody、 @RequestHeader、 @CookieValue

這些注解都是用于獲取 HTTP 請求中的數據的注解,它們可以用在控制器方法的參數上。它們的作用是分別從請求路徑,請求參數,請求體,請求頭,或 Cookie 中獲取數據,并將其綁定到方法參數上。它們都可以指定一個參數名,以及一個是否必須的屬性。

@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {return userService.getUserById(id);
}@GetMapping("/users")
public List<User> getUsers(@RequestParam(value = "name", required = false) String name) {return userService.getUsersByName(name);
}@PostMapping("/users")
public User createUser(@RequestBody User user) {return userService.saveUser(user);
}@GetMapping("/hello")
public String hello(@RequestHeader("User-Agent") String userAgent) {return "Hello, your user agent is: " + userAgent;
}@GetMapping("/cookie")
public String cookie(@CookieValue("JSESSIONID") String sessionId) {return "Your session id is: " + sessionId;
}

6)@Autowired、@Resource、@Inject

這些注解都是用于實現依賴注入的注解,它們可以用在字段,構造器,或方法上。它們的作用是從 Spring 容器中獲取一個 bean 實例,并將其賦值給被注解的元素。它們的區別是:

  • @Autowired 是 Spring 提供的注解,它默認按照類型匹配 bean,也可以通過 @Qualifier 指定按照名稱匹配。
  • @Resource 是 Java 標準提供的注解,它默認按照名稱匹配 bean,也可以通過 type 屬性指定按照類型匹配。
  • @Inject 是 Java 標準提供的注解,它和 @Autowired 類似,都是按照類型匹配 bean,但是它需要依賴 JSR-330 的實現,如 Google Guice。
@Service
public class UserService {@Autowiredprivate UserDao userDao;@Resource(name = "userCache")private Cache userCache;@Injectprivate PasswordEncoder passwordEncoder;// ...
}

7)@Bean、@Component、 @Service、@Repository、 @Controller

這些注解都是用于聲明一個 bean 的注解,它們可以用在類上。它們的作用是讓 Spring 容器掃描并識別這些類,將其實例化并加入到容器中,以便其他組件可以使用。它們的區別是:

  • @Bean 是用在方法上的,它表示該方法返回一個 bean 實例,方法所在的類必須被 @Configuration 注解標記。
  • @Component 是一個通用的注解,它表示該類是一個組件,沒有特殊的功能。
  • @Service 是一個業務邏輯層的注解,它表示該類是一個服務類,提供一些業務功能。
  • @Repository 是一個數據訪問層的注解,它表示該類是一個數據訪問對象,提供一些數據操作功能。
  • @Controller 是一個控制器層的注解,它表示該類是一個控制器類,處理 HTTP 請求。
@Configuration
public class AppConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}@Component
public class HelloComponent {public void sayHello() {System.out.println("Hello, Spring Boot!");}
}@Service
public class UserService {// ...
}@Repository
public class UserDao {// ...
}@Controller
public class UserController {// ...
}

8)@Value、 @ConfigurationProperties、 @PropertySource

這些注解都是用于配置屬性的注解,它們可以用在類或字段上。它們的作用是從配置文件或環境變量中獲取一些屬性值,并將其賦值給被注解的元素。它們的區別是:

  • @Value 是用于獲取單個屬性值的,它可以使用 ${…} 占位符或 SpEL 表達式來獲取屬性值,也可以指定一個默認值。
  • @ConfigurationProperties 是用于獲取一組屬性值的,它可以使用 prefix 屬性來指定一個屬性前綴,然后將其下的所有屬性值綁定到一個 bean 的字段上,支持松散綁定和類型轉換,也支持 JSR-303 的數據校驗。
  • @PropertySource 是用于指定一個額外的屬性源的,它可以使用 value 屬性來指定一個或多個屬性文件的路徑,然后將其加載到 Spring 環境中,以便其他注解可以使用。
@Component
@PropertySource("classpath:app.properties")
public class AppConfig {@Value("${app.name}")private String appName;@Value("${app.version:1.0}")private String appVersion;@Value("#{systemProperties['os.name']}")private String osName;// ...
}@Component
@ConfigurationProperties(prefix = "user")
@Validated
public class UserConfig {@NotBlankprivate String name;@Min(18)private int age;private List<String> hobbies;// getters and setters
}

9)@EnableAutoConfiguration

此注解用于啟用 Spring Boot 的自動配置機制。它根據類路徑依賴項和屬性自動配置應用程序。他可以簡化配置過程,從而實現快速開發。

例如

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication {// ...
}

有@EnableAutoConfiguration的情況下:

  • Spring Boot將會根據項目的依賴和配置,自動配置應用程序的各個組件,例如數據源、JPA、Web等。
  • MyService類會被自動掃描并納入Spring容器管理。

沒有@EnableAutoConfiguration的情況下:

  • 我們需要手動配置應用程序的各個組件,例如配置數據源、JPA、Web等,這會增加開發工作量。
  • MyService類不會被自動掃描,需要顯式配置才能被Spring容器管理

如果發現正在應用不需要的特定自動配置類,則可以使用 @EnableAutoConfiguration 的 exclude 屬性 來禁用它們

例如

@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration",
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})

10)@ConditionalOnProperty

此注解用于根據屬性的值有條件地啟用或禁用 bean 或配置。

例如

@Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public class MyConfiguration {// 當啟用時的功能配置
}

11)@Scheduled

此注解用于以固定的時間間隔調度方法的執行。

例如

@Component
public class MyScheduler {@Scheduled(fixedDelay = 5000)public void doSomething() {// 定期執行任務}
}

12)@Cacheable、@CachePut、@CacheEvict

這些注解用于緩存方法結果。它們允許您分別緩存方法的返回值、更新緩存或去除緩存。

@Service
public class MyService {@Cacheable("users")public User getUserById(Long id) {// 從數據庫檢索用戶}@CachePut("users")public User updateUser(User user) {// 更新數據庫和緩存中的用戶}@CacheEvict("users")public void deleteUser(Long id) {// 從數據庫刪除用戶并從緩存中移除}
}

13)@PostConstruct

@PostConstruct注解用于在依賴注入完成后,且在類的初始化之前執行標注的方法。這提供了一個非常方便的生命周期鉤子,允許開發者在對象創建和依賴注入完成后執行初始化代碼。

@Component
public class MyBean {@PostConstructpublic void init() {// 執行初始化操作,如加載配置文件,檢查資源等System.out.println("MyBean is initialized");}
}

在上述代碼中,init方法會在MyBean對象創建并注入所有必要的依賴之后被自動調用。

14)@ExceptionHandler、@ControllerAdvice

@ExceptionHandler注解用于處理Controller層拋出的異常。通過將此注解應用于方法上,可以捕獲特定類型的異常,并對其進行自定義處理。

@ControllerAdvice最常見的用途之一是全局異常處理。通過在類上使用@ControllerAdvice注解,然后在該類中使用@ExceptionHandler注解標注的方法,可以捕獲指定類型的異常,并進行處理。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> handleException(Exception e) {// 構建自定義的響應體,如錯誤信息和錯誤碼return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);}
}

2. 面向切面的編程 (AOP) 注解

這些注解通常用于Spring框架中的面向切面編程(AOP,Aspect-Oriented Programming),于實現面向切面編程,將橫切關注點從核心業務邏輯中分離出來,以提高代碼的可維護性和可重用性。

1)@Aspect

這個注解用于聲明一個類是一個切面類,定義切面類的時候需要添加這個注解。切面類是用來封裝切面邏輯的類,通常包含一個或多個通知方法,以及一個或多個切點表達式。切面類需要被 Spring 容器管理,因此通常也需要添加 @Component 注解。例如:

@Aspect
@Component
public class LogAspect {// 通知方法和切點表達式
}

2)@Pointcut

這個注解用于定義一個切點表達式,指定哪些連接點(即方法執行的點)需要被攔截。切點表達式可以使用 AspectJ 的語法,也可以使用自定義的注解。切點表達式通常定義在一個空的方法上,作為一個標識符,供其他注解引用。例如:

@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {// 空方法,僅用于標識切點
}

這個注解表示,所有 com.example.service 包下的類的所有方法都是切點,需要被攔截。

3)@Before, @After, @AfterReturning, @AfterThrowing, @Around

這些注解都是用于定義通知方法的,指定在切點執行的不同階段執行不同的邏輯。通知方法是用來實現切面功能的方法,通常需要引用一個切點表達式,或者一個切點標識符。這些注解的含義和用法如下:

  • @Before:表示在切點之前執行,可以用來做一些前置處理,如參數校驗,日志打印等。
  • @After:表示在切點之后執行,無論切點是否正常返回或拋出異常,都會執行,可以用來做一些清理工作,如釋放資源,還原狀態等。
  • @AfterReturning:表示在切點正常返回之后執行,可以用來做一些后置處理,如返回結果處理,日志記錄等。
  • @AfterThrowing:表示在切點拋出異常之后執行,可以用來做一些異常處理,如異常日志記錄,事務回滾等。
  • @Around:表示環繞切點執行,可以在切點前后執行自定義的邏輯,也可以控制切點是否執行,以及修改切點的參數和返回值,是最強大也最復雜的通知類型。

例如:

@Before("servicePointcut()")
public void beforeAdvice(JoinPoint joinPoint) {// 獲取方法簽名和參數MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();Object[] args = joinPoint.getArgs();// 打印方法信息和參數System.out.println("Before advice: " + method + ", args: " + Arrays.toString(args));
}@AfterReturning(value = "servicePointcut()", returning = "result")
public void afterReturningAdvice(JoinPoint joinPoint, Object result) {// 獲取方法簽名和返回值MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 打印方法信息和返回值System.out.println("After returning advice: " + method + ", result: " + result);
}@AfterThrowing(value = "servicePointcut()", throwing = "ex")
public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {// 獲取方法簽名和異常MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 打印方法信息和異常System.out.println("After throwing advice: " + method + ", exception: " + ex.getMessage());
}@Around("servicePointcut()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 獲取方法簽名MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 記錄方法開始時間long startTime = System.currentTimeMillis();// 執行切點方法Object result = joinPoint.proceed();// 記錄方法結束時間long endTime = System.currentTimeMillis();// 計算方法耗時long duration = endTime - startTime;// 打印方法信息和耗時System.out.println("Around advice: " + method + ", duration: " + duration + " ms");// 返回結果return result;
}

4)@Order

這個注解用于指定切面類的優先級,當有多個切面類作用于同一個切點時,可以用這個注解來控制執行順序。注解的值越小,優先級越高。例如:

@Aspect
@Component
@Order(1)
public class LogAspect {// ...
}@Aspect
@Component
@Order(2)
public class SecurityAspect {// ...
}

這個注解表示,LogAspect 的優先級高于 SecurityAspect,因此 LogAspect 的通知方法會先于 SecurityAspect 的通知方法執行。

3. 驗證注釋

? 這些注解通常用于Java中的Bean Validation(JSR-380)規范中,用于對JavaBean屬性進行驗證

@Valid、@NotNull、@Size、@Min、@Max、@Email、@Pattern

  • @Valid,用于指示在驗證嵌套對象時應該遞歸執行驗證。通常與復雜對象的屬性一起使用,以確保嵌套對象的所有屬性都被驗證。
  • @NotNull,用于驗證屬性值不能為null。
  • @Size,用于驗證屬性值的長度是否在指定范圍內。
  • @Min,用于驗證屬性值是否大于等于指定的最小值。
  • @Max,用于驗證屬性值是否小于等于指定的最大值。
  • @Email,用于驗證屬性值是否符合Email地址的格式。
  • @Pattern,用于驗證屬性值是否匹配指定的正則表達式。

例如

public class Address {@NotNullprivate String street;// 其他屬性和方法
}public class User {@Validprivate Address address;@NotNullprivate String username;@Size(min = 2, max = 50)private String username;@Min(18)private int age;@Max(100)private int age;@Emailprivate String email;@Pattern(regexp = "^[A-Za-z0-9]+$")private String username;// 其他屬性和方法
}

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

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

相關文章

Java 中notify 和 notifyAll 方法介紹

1. notify 方法 notify() 方法是 Java 中 Object 類的一個方法&#xff0c;它用來喚醒在該對象的監視器&#xff08;monitor&#xff09;上等待的單個線程。如果有多個線程都在該對象上等待&#xff0c;則會隨機喚醒其中一個線程。被喚醒的線程將會嘗試重新獲取對象鎖&#xff…

idea集成git詳解教程(實用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下載git Git - Downloads 一路傻瓜式安裝即可&#xff08;NEXT&#xff09; 2.軟件測試 在Windows桌面空白處&#xff0c;點擊鼠標右鍵&#xff0c;彈出右鍵菜單 Git軟件安裝后&#xff0c;會在右鍵菜單中增加兩個菜單 Git GUI He…

matplotlib繪圖中文亂碼問題

如圖所示&#xff0c;在使用python包matplotlib繪圖時中文文字顯示亂碼&#xff0c;在繪圖前加入以下兩行代碼即可 # 導入包 import matplotlib.pyplot as plt # 解決中文亂碼問題 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False重新運行代…

Linux 進程的前臺/后臺切換

目錄 前言 簡單例子 前言 當你用shell啟動一個程序時&#xff0c;往往他是在前臺工作的。程序會一直占用終端命令行&#xff0c;例如你在前臺解壓的時候必須等著&#xff0c;期間干不了別的事&#xff08;除非另開一個終端&#xff09;。 例如經常用連接到遠程服務器執行腳本…

【知識摘要】一文帶你了解什么是RedLock。

1、什么是RedLock 紅鎖&#xff08;RedLock&#xff09;是一種分布式鎖算法&#xff0c;由 Redis 的作者 Salvatore Sanfilippo&#xff08;也稱為 Antirez&#xff09;設計&#xff0c;用于在分布式系統中實現可靠的鎖機制。它的設計解決了單一 Redis 實例作為分布式鎖可能出…

【Django】執行查詢—跨關系查詢中的跨多值關聯問題

跨多值查詢 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如從 Blog 到 Entry &#xff09;時&#xff0c;對多個屬性進行過濾會產生這樣的問題&#xff1a;是否要求每個屬性都在同一個相關對象中重合。 filter() 先看filter()&#xff0c;通過一個例子看&#xf…

打造無縫滾動體驗:JavaScript中的scrollIntoView()方法實戰指南

在現代Web開發中&#xff0c;提升用戶體驗是至關重要的。通過JavaScript的scrollIntoView()方法&#xff0c;我們可以為用戶創造出流暢而令人愉悅的滾動體驗。本文將深入研究scrollIntoView()的強大功能&#xff0c;并結合實例演示如何在項目中巧妙應用&#xff0c;以打造出無縫…

緩存穿透解決方案之布隆過濾器

布隆過濾器可以快速判斷數據是否存在&#xff0c;避免從數據庫中查詢數據是否存在&#xff0c;減輕數據庫的壓力 布隆過濾器是由一個初值為0的bit數組和N個哈希函數&#xff0c;可以用來快速的判斷某個數據是否存在 當我們想要標記某個數據是否存在時&#xff0c;布隆過濾器會…

Java底層自學大綱_高可用篇

高可用專題_自學大綱所屬類別學習主題建議課時&#xff08;h&#xff09; A 容器化技術001 Docker架構設計原理2.5 A 容器化技術002 Docker部署springboot項目2.5 A 容器化技術003 基于Docker-Compose部署微服務項目2.5 B Nginx實現高可用004 Nginx反向代理&負載均衡&a…

LabVIEW眼結膜微血管采集管理系統

LabVIEW眼結膜微血管采集管理系統 開發一套基于LabVIEW的全自動眼結膜微血管采集管理系統&#xff0c;以提高眼結膜微血管臨床研究的效率。系統集成了自動化圖像采集、圖像質量優化和規范化數據管理等功能&#xff0c;有效縮短了圖像采集時間&#xff0c;提高了圖像質量&#…

idea 多模塊A模塊調用了B模塊的Jar包,而非本地源碼

1&#xff0c;問題描述 對于多模塊的互相調用&#xff0c;比如模塊A&#xff0c;模塊B&#xff0c;模塊C&#xff0c; 這在本地都是可以編輯進行開發的源碼&#xff0c; 按理說是模塊A可以直接點進模塊B的本地源碼&#xff0c; 但是不知道什么原因&#xff0c;導致模塊A點進…

C++小記 - 二叉樹

文章目錄 二叉樹一、二叉樹理論基礎篇二叉樹的種類滿二叉樹完全二叉樹二叉搜索樹平衡二叉搜索樹 二叉樹的存儲方式鏈式存儲&#xff1a;順序存儲&#xff1a;遍歷規則&#xff1a;構造實現&#xff1a; 二叉樹的遍歷方式二叉樹的定義 二、二叉樹的遞歸遍歷遞歸算法的三個要素:遞…

vue+element UI中給指定日期添加標記

1.日期控件中添加:picker-options屬性&#xff0c;即:picker-options“myPickerOptions” <el-date-picker:class"item.scds !null ?xtsjBlue:xtsjRed"v-model"item.date"value-format"yyyy-MM-dd"type"date":picker-options"…

Python中的heapq模塊

Python中的heapq模塊 文章目錄 Python中的heapq模塊1.heapq的方法2.使用heapq創建堆3.使用heapq實現堆排序4.獲取堆中的前n個最大值或最小值Reference heapq模塊實現了堆隊列的算法&#xff0c;即優先隊列算法。heapq其實是實現了一種小頂堆&#xff0c;所以使用pop()方法返回的…

如何進行弱網測試?

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 如今這個高度互聯的時代里&#xff0c;網絡環境對于應用程序的影響越來越重要。 而弱網測試就是…

leetcode--接雨水(雙指針法,動態規劃,單調棧)

目錄 方法一&#xff1a;雙指針法 方法二&#xff1a;動態規劃 方法三&#xff1a;單調棧 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 黑色的是柱子&#xff0c;藍色的是雨水&#xff0c;我們先來觀察一下雨水的分布情況: 雨水落在凹槽之間&#xff0c;在一個凹槽的…

使用js寫一個登錄驗證碼效果

面試題 登錄頁面獲取驗證碼的功能&#xff0c;用戶點擊獲取驗證碼按鈕(id”btn1”)&#xff0c;按文字變為“(N)后獲取驗證碼”&#xff0c;N為倒計對秒數&#xff0c;從 60 開始&#xff0c;每秒減一&#xff0c;減到 0的時候&#xff0c;按鈕文字變為“獲取驗證碼”&#xff…

Beans模塊之工廠模塊Aware

博主介紹:?全網粉絲5W+,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗? 博主作品:《Java項目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【JavaWeb】

Javaweb 數據庫相關概念MySQL數據庫MySQL數據模型SQLDDL--操作數據庫圖形化客戶端工具DML--操作數據DQL數據庫約束 數據庫設計多表查詢事務 數據庫相關概念 數據庫 存儲數據的倉庫&#xff0c;數據是有組織的進行存儲 英文&#xff1a;DataBase&#xff0c;簡稱DB 數據庫管理系…

單元測試數據庫回滾問題

問題現象&#xff1a; 在進行單元測試時&#xff0c;測試執行成功&#xff0c;可是數據庫中的數據沒變 問題解決&#xff1a;單元測試自動回滾&#xff0c;需要加上注解Rollback(false) https://zhhll.icu/2020/javaweb/問題/1.單元測試數據問題/ 本文由 mdnice 多平臺發布