Khám phá Spring Beans: Vòng đời và IoC Container

Đăng ngày: 28-09-2025 17:40
Dependency InjectionSpring BeansIoC ContainerScopeSingletonPrototype@Service

Chào mừng bạn đến với bài viết thứ ba trong series về Spring và Spring Boot! Ở bài viết này, chúng ta sẽ khám phá sâu hơn về Spring Beans. Chúng ta sẽ tìm hiểu về vòng đời của chúng và cách IoC Container quản lý chúng.

Đi sâu vào "trái tim" của Spring: IoC Container

IoC (Inversion of Control) Container là thành phần cốt lõi của Spring Framework. Nó chịu trách nhiệm khởi tạo, cấu hình và quản lý các đối tượng (Beans) trong ứng dụng. Thay vì để các đối tượng tự tạo và quản lý dependencies của chúng, IoC Container sẽ đảm nhận vai trò này.

Điều này mang lại nhiều lợi ích, bao gồm giảm sự phụ thuộc giữa các đối tượng. Nó cũng giúp tăng tính linh hoạt và khả năng bảo trì của ứng dụng. IoC Container hoạt động dựa trên nguyên tắc Dependency Injection (DI). DI cho phép container cung cấp các dependencies cần thiết cho một đối tượng thông qua constructor, setter method hoặc field injection.

Các loại Scope của Bean

Scope của Bean định nghĩa phạm vi tồn tại và số lượng instance của một Bean trong ứng dụng. Spring cung cấp nhiều loại scope khác nhau, nhưng hai loại phổ biến nhất là singleton và prototype.

Singleton

Với scope singleton, chỉ có một instance duy nhất của Bean được tạo ra cho mỗi IoC Container. Tất cả các request đến Bean này đều sẽ sử dụng cùng một instance. Đây là scope mặc định cho các Beans trong Spring.

Prototype

Với scope prototype, một instance mới của Bean sẽ được tạo ra mỗi khi có một request đến Bean đó. Mỗi request sẽ nhận được một instance riêng biệt.

Ngoài ra, Spring còn cung cấp các scope khác như request, session, application, websocket, và global-session. Các scope này thường được sử dụng trong các ứng dụng web.

Stereotype Annotations

Stereotype annotations là các annotation đặc biệt được sử dụng để đánh dấu các classes như là các thành phần trong Spring application. Chúng giúp Spring dễ dàng phát hiện và quản lý các Beans.

@Service

Annotation `@Service` được sử dụng để đánh dấu một class là một service component. Nó thường được sử dụng cho các class chứa logic nghiệp vụ của ứng dụng. Services thường giao tiếp với các repositories để truy xuất và lưu trữ dữ liệu.

@Repository

Annotation `@Repository` được sử dụng để đánh dấu một class là một repository component. Nó thường được sử dụng cho các class chịu trách nhiệm truy cập dữ liệu từ cơ sở dữ liệu. Repositories thường sử dụng các công nghệ như JDBC, JPA, hoặc Spring Data JPA để tương tác với cơ sở dữ liệu.

@Controller

Annotation `@Controller` được sử dụng để đánh dấu một class là một controller component. Nó thường được sử dụng trong các ứng dụng web để xử lý các request từ client. Controllers thường gọi các services để thực hiện logic nghiệp vụ và trả về response cho client.

Các annotation này không chỉ giúp Spring nhận biết các Beans, mà còn cung cấp thêm thông tin ngữ nghĩa về vai trò của Bean trong ứng dụng.

Vòng đời của Bean và các Lifecycle Annotations

Spring container quản lý vòng đời của các bean. Vòng đời bao gồm các giai đoạn khởi tạo, sử dụng và hủy bỏ. Spring cung cấp các lifecycle annotations để cho phép bạn thực hiện các hành động tùy chỉnh trong các giai đoạn khác nhau của vòng đời Bean.

@PostConstruct

Annotation `@PostConstruct` được sử dụng để đánh dấu một method sẽ được gọi sau khi Bean đã được khởi tạo và tất cả các dependencies đã được inject. Method này thường được sử dụng để thực hiện các tác vụ khởi tạo bổ sung, chẳng hạn như khởi tạo kết nối đến cơ sở dữ liệu hoặc tải cấu hình.

@PreDestroy

Annotation `@PreDestroy` được sử dụng để đánh dấu một method sẽ được gọi trước khi Bean bị hủy bỏ bởi IoC Container. Method này thường được sử dụng để giải phóng các tài nguyên mà Bean đang sử dụng, chẳng hạn như đóng kết nối đến cơ sở dữ liệu hoặc giải phóng bộ nhớ.

Các lifecycle annotations giúp bạn kiểm soát vòng đời Bean một cách chi tiết, đảm bảo rằng các tác vụ khởi tạo và giải phóng tài nguyên được thực hiện đúng thời điểm.

Để sử dụng các annotation này, bạn cần enable chúng trong cấu hình Spring. Điều này có thể được thực hiện bằng cách thêm `@Bean(initMethod = "init", destroyMethod = "destroy")` hoặc sử dụng `` trong file cấu hình XML.

Ngoài ra, Spring còn cung cấp các interfaces như `InitializingBean` và `DisposableBean` để bạn có thể implement các phương thức `afterPropertiesSet()` và `destroy()` tương ứng.

Ví dụ minh họa

Dưới đây là một ví dụ minh họa cách sử dụng các annotation trên:


@Service
public class MyService {

    @Autowired
    private MyRepository repository;

    @PostConstruct
    public void init() {
        System.out.println("MyService is initialized");
    }

    public void doSomething() {
        repository.getData();
        System.out.println("MyService is doing something");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("MyService is destroyed");
    }
}

@Repository
public class MyRepository {
    public void getData() {
        System.out.println("Getting data from repository");
    }
}

Trong ví dụ này, `MyService` là một service component sử dụng `MyRepository` để truy xuất dữ liệu. Method `init()` sẽ được gọi sau khi `MyService` được khởi tạo, và method `destroy()` sẽ được gọi trước khi `MyService` bị hủy bỏ.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu sâu hơn về Spring Beans, vòng đời của chúng và cách IoC Container quản lý chúng. Chúng ta cũng đã khám phá các scope của Bean, các stereotype annotations và lifecycle annotations. Hy vọng rằng bài viết này sẽ giúp bạn hiểu rõ hơn về "trái tim" của Spring Framework và áp dụng nó vào các dự án của mình. Hãy tiếp tục khám phá các khía cạnh khác của Spring để trở thành một Spring developer chuyên nghiệp!

0 Bình luận