0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng dẫn xây dựng custom annotation để lưu log Rest API trong ứng dụng Spring Boot sử dụng AOP

Đăng vào 2 tuần trước

• 3 phút đọc


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 Copy
public class BookDTO {
    private long id;
    private String name;
    private String author;

    // Getter và Setter
}
  • LogDTO: lễ tân log
java Copy
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 Copy
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 Copy
@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 Copy
@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 Copy
@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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào