Tham gia cộng đồng học hỏi về Thiết kế hệ thống
Chúng mình đã tạo một nhóm để các bạn có thể cùng chia sẻ và học hỏi về thiết kế hệ thống! 😄 Hãy tham gia để góp phần xây dựng Cộng Đồng System Design Việt Nam ngày càng lớn mạnh nhé! 😍
Cộng Đồng System Design Việt Nam: Nhóm Facebook
Kênh TikTok: TikTok
Giới thiệu về Annotation và AOP trong Spring Boot
Khi lập trình với Java, đặc biệt là trong khung làm việc Spring Boot, các bạn chắc hẳn đã quá quen thuộc với khái niệm annotation. Các annotation như @Component
, @Service
, @Controller
là những ví dụ điển hình. Bạn đã bao giờ nghĩ đến việc tự tạo ra một annotation riêng để phục vụ cho mục đích của mình hay chưa? Hãy cùng nhau khám phá cách tạo một custom annotation nhằm lưu log các Rest API trong ứng dụng Spring Boot!
Bước 1: Chuẩn bị Project
Trước hết, chúng ta cần tạo một project Spring Boot mới. Hãy truy cập vào Spring Initializr và lựa chọn các tùy chọn cùng với các dependencies cần thiết. Nhấn Generate
để tải về project và giải nén thư mục vừa tải. Cấu trúc project của bạn sẽ như sau:
Tạo cấu trúc package
Ta sử dụng các package như sau:
model
: chứa các class mô hình dữ liệu.repository
: chứa các lớp truy cập dữ liệu.controller
: chứa các lớp điều khiển API.
Các class trong package model
- BookDTO: lễ tân sách
java
public class BookDTO {
private long id;
private String name;
private String author;
// Getter và Setter
}
- LogDTO: lễ tân log
java
public class LogDTO {
private Instant time;
private String message;
// Getter và Setter
}
Các class trong package repository
- BookRepository: lưu trữ thông tin sách.
- LogRepository: lưu trữ thông tin log.
Các class trong package controller
- BookController: điều khiển các API cho sách.
- LogController: điều khiển các API cho log hệ thống.
Bước 2: Thêm thư viện Spring AOP
Aspect Oriented Programming (AOP) là kỹ thuật lập trình cho phép tách biệt logic của ứng dụng thành các phần riêng biệt. Trong Spring AOP, có bốn loại advice được hỗ trợ:
- Before advice: chạy trước khi method được thực thi.
- After returning advice: chạy sau khi method trả về kết quả.
- After throwing advice: chạy khi method ném ra exception.
- Around advice: chạy quanh method mà không làm mất các nhiệm vụ khác.
Áp dụng After returning advice
để xử lý lưu log API sau khi method đã thực hiện thành công. Thêm Spring AOP vào ứng dụng bằng cách cập nhật phần dependencies trong file build.gradle
:
groovy
implementation 'org.springframework.boot:spring-boot-starter-aop'
Sau đó, thêm @EnableAspectJAutoProxy
trong class main của bạn.
Bước 3: Định nghĩa custom annotation
Tạo package mới có tên annotation
và khai báo annotation SaveLog
:
java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SaveLog {
String message();
String value();
}
Đánh dấu các method trong controller mà bạn muốn lưu log với annotation @SaveLog
như sau:
java
@SaveLog(message = "Tạo mới sách, với id = ${#booktDTO.getId()}"))
@PostMapping
public BookDTO createBook(@RequestBody BookDTO booktDTO) {
bookRepository.addBook(booktDTO);
return booktDTO;
}
Bước 4: Viết hàm xử lý log
Trong package aop
, tạo class SaveLogAspect
để định nghĩa logic xử lý log:
java
@Aspect
@Component
public class SaveLogAspect {
private final LogRepository logRepository;
// Phương thức xử lý lưu log
}
Bước 5: Kiểm tra và Tận hưởng thành quả
Khởi chạy project và kiểm tra kết quả với Postman:
- Gọi POST
/api/books
để thêm sách. - Gọi GET
/api/books
để lấy danh sách sách. - Cuối cùng, gọi GET
/api/logs
để kiểm tra log ghi lại các hoạt động của API.
Kết luận
Chúng ta đã tạo thành công một custom annotation @SaveLog
để ghi nhận log cho các method trong Rest API. Hy vọng bài viết sẽ mang lại giá trị hữu ích cho các bạn. Nếu bạn có bất kỳ câu hỏi hoặc góp ý, hãy để lại nhận xét nhé! Cảm ơn các bạn đã theo dõi bài viết.
Gửi lời nhắn
Tham gia cộng đồng học hỏi và trao đổi về thiết kế hệ thống cùng chúng mình nhé! 😄
source: viblo