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/
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
và @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
và @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
và @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
và @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.
Bình luận