Written By : Nguyễn Mạnh Cường

(đã biên dịch và bổ sung thêm)

Email liên hệ: ngmanhcuong2001@gmail.com
Nguồn bài viết gốc : https://springframework.guru/spring-framework-annotations/

Giải thích các Annotations trong SpringBoot

Các biến thể @RequestMapping được tổng hợp

Spring framework 4.3 đã giới thiệu các biến thể cấp phương thức sau của chú thích @RequestMapping để diễn đạt tốt hơn ngữ nghĩa của các phương thức được chú thích. Sử dụng các chú thích này đã trở thành cách tiêu chuẩn để xác định các điểm cuối. Chúng hoạt động như một trình bao bọc cho @RequestMapping.
Các chú thích này có thể được sử dụng với Spring MVC và Spring WebFlux.

@GetMapping

Chú thích này được sử dụng để ánh xạ các yêu cầu HTTP GET vào các phương thức xử lý cụ thể. @GetMapping là một chú thích được soạn thảo hoạt động như một phím tắt cho
@RequestMapping(method = RequestMethod.GET)

@PostMapping

Chú thích này được sử dụng để ánh xạ các yêu cầu HTTP POST vào các phương thức xử lý cụ thể. @PostMapping là một chú thích được soạn thảo hoạt động như một phím tắt cho @RequestMapping (method = RequestMethod.POST)

@PutMapping

Chú thích này được sử dụng để ánh xạ các yêu cầu HTTP PUT vào các phương thức xử lý cụ thể. @PutMapping là một chú thích được soạn thảo hoạt động như một phím tắt cho @RequestMapping (method = RequestMethod.PUT)

@PatchMapping

Chú thích này được sử dụng để ánh xạ các yêu cầu HTTP PATCH vào các phương thức xử lý cụ thể. @PatchMapping là một chú thích được soạn thảo hoạt động như một phím tắt cho @RequestMapping (method = RequestMethod.PATCH)

@DeleteMapping

Chú thích này được sử dụng để ánh xạ các yêu cầu HTTP DELETE vào các phương thức xử lý cụ thể. @DeleteMapping là một chú thích được soạn thảo hoạt động như một phím tắt cho @RequestMapping (method = RequestMethod.DELETE)

@ExceptionHandler

Chú thích này được sử dụng ở cấp phương pháp để xử lý ngoại lệ ở cấp bộ điều khiển. Chú thích @ExceptionHandler được sử dụng để xác định lớp ngoại lệ mà nó sẽ bắt. Bạn có thể sử dụng chú thích này trên các phương thức sẽ được gọi để xử lý một ngoại lệ. Giá trị @ExceptionHandler có thể được đặt thành một mảng các kiểu Ngoại lệ. Nếu một ngoại lệ được ném ra khớp với một trong các kiểu trong danh sách, thì phương thức được chú thích bằng @ExceptionHandler phù hợp sẽ được gọi.

@InitBinder

Chú thích này là chú thích cấp phương thức đóng vai trò xác định các phương thức khởi tạo WebDataBinder - một DataBinder liên kết tham số yêu cầu với các đối tượng JavaBean. Để tùy chỉnh liên kết dữ liệu tham số yêu cầu, bạn có thể sử dụng phương thức chú thích @InitBinder trong bộ điều khiển của chúng tôi. Các phương thức được chú thích với @InitBinder tất cả các loại đối số mà các phương thức xử lý hỗ trợ.

Các phương thức chú thích @InitBinder sẽ được gọi cho mỗi yêu cầu HTTP nếu bạn không chỉ định phần tử giá trị của chú thích này. Phần tử giá trị có thể là một hoặc nhiều tên biểu mẫu hoặc các tham số yêu cầu mà phương thức liên kết init được áp dụng.

@Mappings and @Mapping

Chú thích này được sử dụng trên các trường. Chú thích @Mapping là chú thích meta cho biết chú thích ánh xạ web. Khi ánh xạ các tên trường khác nhau, bạn cần định cấu hình trường nguồn thành trường đích của nó và để làm điều đó, bạn phải thêm chú thích @Mappings. Chú thích này chấp nhận một mảng @Mapping có trường nguồn và trường đích.

@MatrixVariable

Chú thích này được sử dụng để chú thích các đối số của phương thức xử lý yêu cầu để Spring có thể đưa vào các bit có liên quan của URI ma trận. Các biến ma trận có thể xuất hiện trên bất kỳ phân đoạn nào, mỗi biến được phân tách bằng dấu chấm phẩy. Nếu một URL chứa các biến ma trận, thì mẫu ánh xạ yêu cầu phải thể hiện chúng bằng mẫu URI. Chú thích @MatrixVariable đảm bảo rằng yêu cầu được khớp với các biến ma trận chính xác của URI.

@PathVariable

Chú thích này được sử dụng để chú thích các đối số của phương thức xử lý yêu cầu. Chú thích @RequestMapping có thể được sử dụng để xử lý các thay đổi động trong URI nơi giá trị URI nhất định hoạt động như một tham số. Bạn có thể chỉ định tham số này bằng cách sử dụng một biểu thức chính quy. Chú thích @PathVariable có thể được sử dụng để khai báo tham số này.

@RequestAttribute

Chú thích này được sử dụng để liên kết thuộc tính yêu cầu với một tham số phương thức xử lý. Spring truy xuất giá trị thuộc tính được đặt tên để điền tham số được chú thích bằng @RequestAttribute. Trong khi chú thích @RequestParam được sử dụng liên kết các giá trị tham số từ chuỗi truy vấn, thì @RequestAttribute được sử dụng để truy cập các đối tượng đã được điền ở phía máy chủ.

@RequestBody

Chú thích này được sử dụng để chú thích các đối số của phương thức xử lý yêu cầu. Chú thích @RequestBody chỉ ra rằng một tham số phương thức phải được liên kết với giá trị của phần thân yêu cầu HTTP. HttpMessageConveter chịu trách nhiệm chuyển đổi từ thông báo yêu cầu HTTP sang đối tượng.

@RequestHeader

Chú thích này được sử dụng để chú thích các đối số của phương thức xử lý yêu cầu. Chú thích @RequestHeader được sử dụng để ánh xạ tham số bộ điều khiển để yêu cầu giá trị tiêu đề. Khi Spring ánh xạ yêu cầu, @RequestHeader sẽ kiểm tra tiêu đề với tên được chỉ định trong chú thích và liên kết giá trị của nó với tham số phương thức trình xử lý. Chú thích này giúp bạn lấy chi tiết tiêu đề trong lớp bộ điều khiển.

@RequestParam

Chú thích này được sử dụng để chú thích các đối số của phương thức xử lý yêu cầu. Đôi khi bạn nhận được các tham số trong URL yêu cầu, chủ yếu là trong các yêu cầu GET. Trong trường hợp đó, cùng với chú thích @RequestMapping, bạn có thể sử dụng chú thích @RequestParam để truy xuất tham số URL và ánh xạ nó tới đối số phương thức. Chú thích @RequestParam được sử dụng để liên kết các tham số yêu cầu với một tham số phương thức trong bộ điều khiển của bạn.

@ResponseBody

Chú thích này được sử dụng để chú thích các phương thức xử lý yêu cầu. Chú thích @ResponseBody tương tự như chú thích @RequestBody. Chú thích @ResponseBody chỉ ra rằng loại kết quả phải được viết thẳng trong nội dung phản hồi ở bất kỳ định dạng nào bạn chỉ định như JSON hoặc XML. Spring chuyển đổi đối tượng được trả về thành một phần tử phản hồi bằng cách sử dụng HttpMessageConveter.

@ResponseStatus

Chú thích này được sử dụng trên các phương thức và các lớp ngoại lệ. @ResponseStatus đánh dấu một phương thức hoặc lớp ngoại lệ bằng mã trạng thái và lý do phải được trả về. Khi phương thức xử lý được gọi, mã trạng thái được đặt thành phản hồi HTTP, mã này sẽ ghi đè thông tin trạng thái được cung cấp bởi bất kỳ phương tiện nào khác. Một lớp bộ điều khiển cũng có thể được chú thích bằng @ResponseStatus sau đó được kế thừa bởi tất cả các phương thức @RequestMapping.

@ControllerAdvice

Chú thích này được áp dụng ở cấp lớp. Như đã giải thích trước đó, đối với mỗi bộ điều khiển, bạn có thể sử dụng @ExceptionHandler trên một phương thức sẽ được gọi khi một ngoại lệ nhất định xảy ra. Nhưng điều này chỉ xử lý những ngoại lệ xảy ra trong bộ điều khiển mà nó được xác định. Để khắc phục sự cố này, bây giờ bạn có thể sử dụng chú thích @ControllerAdvice. Chú thích này được sử dụng để xác định các phương thức @ExceptionHandler, @InitBinder@ModelAttribute áp dụng cho tất cả các phương thức @RequestMapping. Vì vậy, nếu bạn xác định chú thích @ExceptionHandler trên một phương thức trong lớp @ControllerAdvice, nó sẽ được áp dụng cho tất cả các bộ điều khiển.

@RestController

Chú thích này được sử dụng ở cấp độ lớp học. Chú thích @RestController đánh dấu lớp là bộ điều khiển nơi mọi phương thức trả về một đối tượng miền thay vì một khung nhìn. Bằng cách chú thích một lớp với chú thích này, bạn không cần thêm @ResponseBody vào tất cả phương thức RequestMapping nữa. Điều đó có nghĩa là bạn không còn sử dụng trình phân giải chế độ xem hoặc gửi html để phản hồi. Bạn chỉ cần gửi đối tượng miền dưới dạng phản hồi HTTP ở định dạng được người tiêu dùng hiểu như JSON.
@RestController là một chú thích tiện lợi kết hợp @Controller@ResponseBody.

@RestControllerAdvice

Chú thích này được áp dụng trên các lớp Java. @RestControllerAdvice là một chú thích tiện lợi kết hợp @ControllerAdvice@ResponseBody. Chú thích này được sử dụng cùng với chú thích @ExceptionHandler để xử lý các ngoại lệ xảy ra trong bộ điều khiển.

@SessionAttributes

Chú thích này được áp dụng ở cấp loại cho một trình xử lý cụ thể. Chú thích @SessionAtrributes được sử dụng khi bạn muốn thêm một đối tượng JavaBean vào một phiên. Điều này được sử dụng khi bạn muốn giữ đối tượng trong phiên trong thời gian ngắn. @SessionAttributes được sử dụng cùng với @ModelAttribute.
Hãy xem xét ví dụ này.

@ModelAttribute("person")
public Person getPerson(){} 
// within the same controller as above snippet
@Controller
@SeesionAttributes(value="person", types={Person.class})
public class PersonController{}

Tên @ModelAttribute được gán cho giá trị @SessionAttributes @SessionAttributes có hai phần tử. Phần tử giá trị là tên của phiên trong mô hình và phần tử loại là loại thuộc tính phiên trong mô hình.

Chú thích đám mây mùa xuân

@EnableConfigServer

Chú thích này được sử dụng ở cấp độ lớp học. Khi phát triển một dự án với một số dịch vụ, bạn cần phải có một cách thức tập trung và đơn giản để định cấu hình và truy xuất các cấu hình về tất cả các dịch vụ mà bạn sẽ phát triển. Một lợi thế của việc sử dụng máy chủ cấu hình tập trung là bạn không cần phải ghi nhớ vị trí mỗi cấu hình được phân phối trên nhiều thành phần được phân phối.
Bạn có thể sử dụng chú thích @EnableConfigServer của Spring cloud để khởi động máy chủ cấu hình mà các ứng dụng khác có thể nói chuyện.

@EnableDiscoveryClient

Chú thích này được áp dụng cho các lớp Java. Để yêu cầu bất kỳ ứng dụng nào tự đăng ký với Eureka, bạn chỉ cần thêm chú thích @EnableDiscoveryClient vào điểm nhập ứng dụng. Ứng dụng hiện đã được đăng ký với Eureka sử dụng phần tóm tắt Spring Cloud Discovery Client để thẩm vấn sổ đăng ký cho máy chủ và cổng của chính ứng dụng đó.

@EnableCircuitBreaker

Chú thích này được áp dụng trên các lớp Java có thể hoạt động như bộ ngắt mạch. Mẫu bộ ngắt mạch có thể cho phép một dịch vụ vi mô tiếp tục hoạt động khi một dịch vụ liên quan bị lỗi, ngăn sự cố xảy ra theo tầng. Điều này cũng cho phép dịch vụ bị lỗi có thời gian để khôi phục.
Lớp được chú thích bằng @EnableCircuitBreaker sẽ giám sát, mở và đóng bộ ngắt mạch.

@HystrixCommand

Chú thích này được sử dụng ở cấp phương pháp. Thư viện Hystrix của Netflix cung cấp việc triển khai mẫu Circuit Breaker. Khi bạn áp dụng bộ ngắt mạch cho một phương pháp, Hystrix sẽ theo dõi các lỗi của phương pháp đó. Khi lỗi tích lũy đến một ngưỡng, Hystrix sẽ mở mạch để các lần gọi tiếp theo cũng thất bại. Bây giờ Hystrix chuyển hướng các cuộc gọi đến phương thức và chúng được chuyển đến các phương thức dự phòng được chỉ định.
Hystrix tìm kiếm bất kỳ phương thức nào được chú thích bằng chú thích @HystrixCommand và gói nó vào một proxy được kết nối với bộ ngắt mạch để Hystrix có thể giám sát nó.
Hãy xem xét ví dụ sau:

@Service
public class BookService{
    private final RestTemplate restTemplate; 
    public BookService(RestTemplate rest){
      this.restTemplate =   rest;
    }                                           
  @HystrixCommand(fallbackMethod = "newList")                                                                     public String bookList(){
    URI uri = URI.create("http://localhost:8081/recommended");                                                      return this.restTemplate.getForObject(uri, String.class);  
  }
  public String newList(){
    return "Cloud native Java";
  }
}

Ở đây @HystrixCommand được áp dụng cho phương thức ban đầubookList ().
Chú thích @HystrixCommand có newList là phương thức dự phòng. Vì vậy, vì lý do nào đó nếu Hystrix mở mạch trênbookList (),
bạn sẽ có một danh sách sách giữ chỗ sẵn sàng cho người dùng.

Chú thích của Spring Framework DataAccess

@Transactional

Chú thích này được đặt trước định nghĩa giao diện, phương thức trên giao diện, định nghĩa lớp hoặc phương thức công khai trên lớp. Chỉ sự hiện diện của @Transactional là không đủ để kích hoạt hành vi giao dịch. @Transactional chỉ đơn giản là một siêu dữ liệu có thể được sử dụng bởi một số cơ sở hạ tầng thời gian chạy. Cơ sở hạ tầng này sử dụng siêu dữ liệu để định cấu hình các bean thích hợp với hành vi giao dịch.
Chú thích hỗ trợ thêm cấu hình như:

  • Kiểu lan truyền của giao dịch
  • Mức độ cô lập của giao dịch
  • Thời gian chờ cho hoạt động được bao bọc bởi giao dịch
  • Cờ chỉ đọc - một gợi ý cho nhà cung cấp liên tục rằng giao dịch phải chỉ được đọc
    Các quy tắc khôi phục cho giao dịch

Chú thích dựa trên bộ nhớ cache

@Cacheable

Chú thích này được sử dụng trên các phương thức. Cách đơn giản nhất để kích hoạt hành vi bộ nhớ cache cho một phương thức là chú thích nó bằng @ Cacheable và tham số hóa nó bằng tên của bộ nhớ cache nơi kết quả sẽ được lưu trữ.

@Cacheable("addresses")
public String getAddress(Book book){...}

Trong đoạn mã trên, phương thức getAddress được liên kết với các địa chỉ có tên trong bộ nhớ cache. Mỗi khi phương thức được gọi, bộ đệm sẽ được kiểm tra để xem liệu lệnh gọi đã được thực thi hay chưa và không cần phải lặp lại.

@CachePut

This annotation is used on methods. Whenever you need to update the cache without interfering the method execution, you can use the @CachePut annotation. That is, the method will always be executed and the result cached.

@CachePut("addresses")
public String getAddress(Book book){...}

Việc sử dụng @CachePut@Cacheable trên cùng một phương thức không được khuyến khích vì phương thức trước buộc thực thi để thực hiện cập nhật bộ đệm, phương pháp sau khiến việc thực thi phương thức bị bỏ qua bằng cách sử dụng bộ đệm.

@CacheEvict

Chú thích này được sử dụng trên các phương thức. Nó không phải là bạn luôn muốn điền vào bộ nhớ cache với ngày càng nhiều dữ liệu. Đôi khi bạn có thể muốn xóa một số dữ liệu bộ nhớ cache để bạn có thể điền vào bộ nhớ cache một số giá trị mới. Trong trường hợp này, hãy sử dụng chú thích @CacheEvict.

@CacheEvict(value="addresses", allEntries="true")
public String getAddress(Book book){...}

Ở đây, một phần tử bổ sung allEntries được sử dụng cùng với tên bộ đệm sẽ được làm trống. Nó được đặt thành true để xóa tất cả các giá trị và chuẩn bị giữ dữ liệu mới.

@CacheConfig

Chú thích này là chú thích cấp độ lớp. Chú thích @CacheConfig giúp sắp xếp hợp lý một số thông tin trong bộ nhớ cache tại một nơi. Việc đặt chú thích này trên một lớp sẽ không bật bất kỳ thao tác lưu vào bộ nhớ đệm nào. Điều này cho phép bạn lưu trữ cấu hình bộ nhớ cache ở cấp lớp để bạn không phải khai báo nhiều lần.

Thực thi tác vụ và chú thích lên lịch

@Scheduled

Chú thích này là chú thích cấp phương pháp. Chú thích @Scheduled được sử dụng trên các phương thức cùng với siêu dữ liệu trình kích hoạt. Phương thức với @Scheduled phải có kiểu trả về void và không được chấp nhận bất kỳ tham số nào.
Có nhiều cách khác nhau để sử dụng chú thích @Scheduled:

@Scheduled(fixedDelay=5000)
public void doSomething() {
  // something that should execute periodically   
}

Trong trường hợp này, khoảng thời gian từ khi kết thúc lần thực thi cuối cùng đến khi bắt đầu lần thực hiện tiếp theo được cố định. Các nhiệm vụ luôn đợi cho đến khi hoàn thành nhiệm vụ trước.

@Scheduled(fixedRate=5000)
public void doSomething() { 
  // something that should execute periodically 
}

Trong trường hợp này, sự bắt đầu của việc thực thi tác vụ không chờ đợi sự hoàn thành của việc thực thi trước đó.

@Scheduled(initialDelay=1000,fixedRate=5000)
public void doSomething() { 
 // something that should execute periodically after an initial delay  
}

Nhiệm vụ được thực thi ban đầu với độ trễ và sau đó tiếp tục với tốc độ cố định đã chỉ định.

@Async

Chú thích này được sử dụng trên các phương thức để thực thi từng phương thức trong một luồng riêng biệt. Chú thích @Async được cung cấp trên một phương thức để việc gọi phương thức đó sẽ xảy ra không đồng bộ. Không giống như các phương thức được chú thích bằng @Scheduled, các phương thức được chú thích bằng @Async có thể nhận đối số. Chúng sẽ được gọi theo cách bình thường bởi người gọi trong thời gian chạy chứ không phải bởi một tác vụ đã lên lịch.
@Async có thể được sử dụng với cả phương thức kiểu trả về void và phương thức trả về giá trị. Tuy nhiên, các phương thức có giá trị trả về phải có giá trị trả về được nhập trong Tương lai.