Cấu hình đối tượng Bean trong Spring Framework bằng XML

1. Cấu hình cơ bản thẻ Bean

Thẻ <bean> được sử dụng để định nghĩa các đối tượng mà bạn muốn Spring Container quản lý và khởi tạo. Theo mặc định, Spring sẽ sử dụng constructor không tham số để tạo thực thể. Nếu lớp không có constructor không tham số, việc khởi tạo sẽ thất bại.

  • id: Định danh duy nhất của Bean trong Spring Container.
  • class: Đường dẫn đầy đủ (package + tên lớp) của lớp cần khởi tạo.

2. Phạm vi hoạt động của Bean (Bean Scope)

Thuộc tính scope xác định cách Spring tạo và quản lý vòng đời của đối tượng.

Giá trị Mô tả
singleton (Mặc định) Chỉ có duy nhất một thực thể được tạo ra trong suốt vòng đời của container.
prototype Mỗi lần yêu cầu (getBean), Spring sẽ tạo ra một thực thể mới.
<!-- Ví dụ cấu hình scope -->
<bean id="productService" class="com.example.service.ProductServiceImpl" scope="singleton"></bean>
<bean id="orderTask" class="com.example.task.OrderTask" scope="prototype"></bean>

Sự khác biệt về vòng đời:

  • Singleton: Đối tượng được khởi tạo ngay khi Spring Container tải cấu hình. Nó tồn tại song song với container và chỉ bị hủy khi container đóng lại.
  • Prototype: Đối tượng chỉ được tạo khi ứng dụng gọi phương thức getBean(). Spring không quản lý toàn bộ vòng đời của prototype bean; sau khi giao đối tượng cho client, việc giải phóng bộ nhớ sẽ do Garbage Collector (GC) của Java đảm nhận.

3. Cấu hình phương thức khởi tạo và hủy (Lifecycle Callbacks)

Bạn có thể chỉ định các phương thức thực thi ngay sau khi Bean được tạo hoặc ngay trước khi Bean bị hủy.

Interface dịch vụ:

public interface MessageService {
    void sendMessage();
}

Lớp triển khai:

public class MessageServiceImpl implements MessageService {
    public void onStartup() {
        System.out.println("Hệ thống khởi khởi tạo dịch vụ...");
    }

    public void onShutdown() {
        System.out.println("Đang dọn dẹp tài nguyên trước khi đóng...");
    }

    @Override
    public void sendMessage() {
        System.out.println("Gửi thông báo thành công.");
    }
}

Cấu hình XML:

<bean id="messageService" 
      class="com.example.service.MessageServiceImpl" 
      init-method="onStartup" 
      destroy-method="onShutdown">
</bean>

4. Các phương thức khởi tạo Bean

Sử dụng Constructor không tham số

Đây là cách phổ biến nhất, Spring gọi trực tiếp constructor mặc định của lớp.

Sử dụng Factory tĩnh (Static Factory)

Spring sẽ gọi một phương thức static của một lớp Factory để lấy thực thể đối tượng.

// Lớp Factory
public class ServiceFactory {
    public static MessageService createInstance() {
        return new MessageServiceImpl();
    }
}

// Cấu hình XML
<bean id="messageService" class="com.example.factory.ServiceFactory" factory-method="createInstance"></bean>

Sử dụng Factory không tĩnh (Instance Factory)

Đầu tiên, một Bean đại diện cho Factory phải được khởi tạo, sau đó Spring gọi phương thức từ thực thể Factory đó.

// Lớp Factory thực thể
public class ProviderManager {
    public MessageService getService() {
        return new MessageServiceImpl();
    }
}

// Cấu hình XML
<bean id="manager" class="com.example.factory.ProviderManager"></bean>
<bean id="messageService" factory-bean="manager" factory-method="getService"></bean>

Cách thực thi và kiểm tra:

public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    MessageService service = (MessageService) context.getBean("messageService");
    service.sendMessage();
    // Đóng container để kích hoạt destroy-method
    context.close();
}

Thẻ: Spring Framework Java Dependency Injection Inversion of Control XML Configuration

Đăng vào ngày 22 tháng 7 lúc 04:23