0
0
Lập trình
TT

🌱 Hiểu rõ về Vòng đời Bean trong Spring

Đăng vào 1 tháng trước

• 5 phút đọc

Chủ đề:

KungFuTech

🌱 Hiểu rõ về Vòng đời Bean trong Spring

Trong Spring Framework, beans là nền tảng của bất kỳ ứng dụng nào. Chúng đại diện cho các đối tượng mà Spring quản lý trong IoC (Inversion of Control) container. Để thực sự khai thác sức mạnh của Spring, việc hiểu rõ cách thức tạo ra, khởi tạo và tiêu hủy các bean là rất quan trọng - hay nói cách khác, đó là vòng đời của chúng.


🔄 Vòng đời của Bean trong Spring

Khi bạn khai báo một bean bằng cách sử dụng chú thích (@Component) hoặc cấu hình (@Bean), Spring sẽ hoàn toàn kiểm soát nó. Dưới đây là quy trình vòng đời điển hình:

  1. Khởi tạo Bean
    Spring tạo ra một thể hiện bean (thông qua constructor hoặc phương thức factory).

  2. Tiêm phụ thuộc
    Các phụ thuộc cần thiết được tiêm vào các trường, phương thức setter, hoặc constructor của bean.

  3. Giao diện Aware (Tùy chọn)
    Nếu bean của bạn triển khai giao diện aware, Spring sẽ cung cấp thêm ngữ cảnh:

    • BeanNameAware → cung cấp tên của bean.
    • BeanFactoryAware → cho phép truy cập vào bean factory.
    • ApplicationContextAware → cho phép truy cập vào application context.
  4. BeanPostProcessor - Trước khi khởi tạo
    Bất kỳ BeanPostProcessor nào đã đăng ký có thể thao tác với bean trước khi khởi tạo.

  5. Giai đoạn Khởi tạo

    • Nếu bean triển khai InitializingBean, phương thức afterPropertiesSet() sẽ được gọi.
    • Nếu bean định nghĩa một phương thức khởi tạo, Spring sẽ gọi nó.
    • Nếu được chú thích bằng @PostConstruct, phương thức đó sẽ được thực thi tại đây.
  6. BeanPostProcessor - Sau khi khởi tạo
    Beans có thể được bọc hoặc cải tiến sau khi khởi tạo (ví dụ: tạo proxy cho AOP).

  7. Bean Sẵn sàng sử dụng
    Tại giai đoạn này, bean đã được khởi tạo hoàn toàn và có thể được sử dụng trong ứng dụng.

  8. Giai đoạn Tiêu hủy
    Khi application context bị đóng:

    • Nếu bean triển khai DisposableBean, phương thức destroy() sẽ được chạy.
    • Bất kỳ phương thức @PreDestroy hoặc phương thức tiêu hủy tùy chỉnh nào sẽ được thực thi.

✅ Tùy chọn Hook Vòng đời

Spring cung cấp nhiều cách để kết nối vào vòng đời này.

1. Sử dụng @PostConstruct@PreDestroy (Hiện đại & Được khuyến nghị)

java Copy
@Component
public class MyBean {
    @PostConstruct
    public void init() {
        System.out.println("Bean đã được khởi tạo: tài nguyên đã mở");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("Bean đã bị tiêu hủy: tài nguyên đã được giải phóng");
    }
}

2. Sử dụng InitializingBeanDisposableBean

java Copy
@Component
public class MyBean implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() {
        System.out.println("afterPropertiesSet() đã được gọi");
    }

    @Override
    public void destroy() {
        System.out.println("destroy() đã được gọi");
    }
}

3. Định nghĩa Phương thức Init và Destroy trong @Bean

java Copy
@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public MyBean myBean() {
        return new MyBean();
    }
}
java Copy
public class MyBean {
    public void customInit() {
        System.out.println("Phương thức khởi tạo tùy chỉnh");
    }

    public void customDestroy() {
        System.out.println("Phương thức tiêu hủy tùy chỉnh");
    }
}

4. Sử dụng BeanPostProcessor (Cho các vấn đề chéo)

java Copy
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        System.out.println("Trước khởi tạo: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("Sau khởi tạo: " + beanName);
        return bean;
    }
}

📊 Hình ảnh hóa Vòng đời

Copy
[Khởi tạo] 
     ↓
[Tiêm phụ thuộc]
     ↓
[Giao diện Aware]
     ↓
[BeanPostProcessor (Trước Khởi tạo)]
     ↓
[Giai đoạn Khởi tạo → @PostConstruct / afterPropertiesSet() / initMethod()]
     ↓
[BeanPostProcessor (Sau Khởi tạo)]
     ↓
[Bean Sẵn sàng sử dụng]
     ↓
[Giai đoạn Tiêu hủy → @PreDestroy / destroy() / destroyMethod()]

🔎 So sánh Nhanh Các Phương pháp

Phương pháp Khi nào sử dụng
@PostConstruct / @PreDestroy ✅ Khuyến nghị trong các ứng dụng Spring hiện đại
InitializingBean / DisposableBean Hữu ích khi bạn muốn ràng buộc trực tiếp với các giao diện
initMethod / destroyMethod trong @Bean Hữu ích khi bạn không kiểm soát lớp bean (ví dụ: bean bên thứ ba)
BeanPostProcessor Cho các vấn đề chéo (logging, proxying, monitoring)

📝 Kết luận

Vòng đời Bean trong Spring cung cấp cho bạn nhiều điểm móc để quản lý tài nguyên, khởi tạo kết nối, và thực hiện dọn dẹp.

  • Sử dụng @PostConstruct@PreDestroy cho hầu hết các trường hợp.
  • Quay lại initMethod/destroyMethod cho các bean bên ngoài.
  • Sử dụng BeanPostProcessor cho các tình huống nâng cao.

Việc thành thạo vòng đời này đảm bảo rằng các bean của bạn là hiệu quả, đáng tin cậy và an toàn tài nguyên trong suốt thời gian tồn tại của ứng dụng Spring của bạn.


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