Trong các ứng dụng Java hiện đại, việc quản lý bean và tiêm phụ thuộc (dependency injection) đóng vai trò quan trọng để đảm bảo ứng dụng linh hoạt, dễ bảo trì và tái sử dụng. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về EzyFox Bean – một thư viện hỗ trợ quản lý bean và dependency injection hiệu quả

1. Cấu trúc Ezyfox Bean

hình ảnh_2024-12-23_011213928.png
  • Ezy Bean Context: Một đối tượng tổng hợp, quản lý tất cả các thuộc tính, singleton và prototype
  • Properties: Ezy Bean Context sẽ giữ tất cả các thuộc tính và tiêm vào các đối tượng singleton và prototype
  • Ezy Singleton Factory: Quản lý tất cả các singleton
  • Ezy Prototype Factory: Quản lý tất cả các prototype

2. Cài đặt Ezyfox Bean

<dependency>
          <groupId>com.tvd12</groupId>
          <artifactId>ezyfox-bean</artifactId>
          <version>1.2.9</version>
</dependency>
- Hoặc các phiên bản khác tại đây

3. Các tính năng của Ezyfox Bean

- Quản lý Singleton

EzyFox Bean tích hợp cơ chế quét package để phát hiện và khởi tạo các singleton được đánh dấu bằng annotation @EzySingleton. Việc này giúp giảm thiểu khối lượng cài đặt thủ công và đảm bảo singleton được quản lý một cách chặt chẽ

Ví dụ:

import com.tvd12.ezyfox.bean.annotation.EzySingleton;
@EzySingleton
public class EmployeeDAO {
    private final DatabaseUtil databaseUtil;
    private static final Logger logger = LoggerFactory.getLogger(EmployeeDAO.class);
    public void addEmployee(Employee employee) {
        executeTransaction(session -> {
            session.save(employee);
            logger.info("Added new employee: {}", employee);
        });
    }
-Quản lý Prototype

EzyFox Bean cho phép tạo các bean prototype, những đối tượng này sẽ được khởi tạo lại mỗi khi được yêu cầu

Ví dụ:

@Setter
@EzyPrototype
public class BookPriceCalculator {
    private Book book;

    @EzyProperty("book.discount")
    private int discount;

    public long calculate() {
        return book.getPrice() - discount;
    }
}
- Quản lý thuộc tính (Properties)

EzyFox Bean tích hợp khả năng đọc các file thuộc tính (định dạng .properties, .yaml, .yml) và tiêm các giá trị vào các bean tương ứng

Ví dụ:

File application.properties

book.name_pattern=[a-zA-Zs]+
book.min_price=1000
Tạo class để map các thuộc tính
@EzyPropertiesBean(prefix = "book")
    public class BookSetting {
        @Property("name_pattern")
        private String namePattern;
        @Property("min_price")
        private long minPrice;
    }
Hay file application.yaml
order:
  max_quantity: 50
  allowed_status: ["NEW", "PROCESSING", "COMPLETED"]
Tạo class để map các thuộc tính
@EzyPropertiesBean(prefix = "order")
public class OrderSetting {
    @Property("max_quantity")
    private int maxQuantity;

    @Property("allowed_status")
    private List<String> allowedStatus;
}
- Liên kết Bean (Binding)

EzyFox Bean cung cấp hai phương pháp liên kết:

Thông qua constructor (ưu tiên).

Thông qua annotation @EzyAutoBind.

@EzySingleton
@AllArgsConstructor
public class BookService {
    private final BookSetting bookSetting;
    private final BookRepository bookRepository;

    public void saveBook(Book book) {
        if (!book.getName().matches(bookSetting.getNamePattern())) {
            throw new IllegalArgumentException("invalid book name");
        }
        bookRepository.save(book);
    }
}
- Ví dụ

Có thể tạo một EzyBeanContext và lấy các bean (singleton hoặc prototype) để sử dụng

public final class EzyFoxBeanExample {
    public static void main(String[] args) {
        final EzyBeanContext beanContext = EzyBeanContext.builder()
            .scan("com.tvd12.ezyfox.example.bean")
            .build();
        final BookController bookController =
            beanContext.getBeanCast(BookController.class);
        final Book book = new Book(1L, "EzyFox in action", 2000);
        bookController.saveBook(book);
        final BookPriceCalculator bookPriceCalculator =
            beanContext.getBeanCast(BookPriceCalculator.class);
        bookPriceCalculator.setBook(book);
        final long bookPrice = bookPriceCalculator.calculate();
        System.out.println("book price: " + bookPrice);
    }
}

Tóm lại

EzyFox Bean mang lại một cách tiếp cận hiện đại và hiệu quả trong việc quản lý bean và dependency injection. Từ đó, giúp các nhà phát triển giảm tải các công việc lặp đi lặp lại, đồng thời nâng cao tính cấu trúc và bảo trì cho ứng dụng của mình.