Tại sao Spring Bean được gọi là xương sống của ứng dụng?

Bean là một trong những khái niệm quan trọng của Spring Framework. Do vậy việc hiểu rõ nó là rất quan trọng để bạn có thể tìm hiểu sâu hơn về Spring và sử dụng nó một cách có hiệu quả.

Chúng ta sẽ cùng nhau tìm hiểu khái niệm về Bean ngay sau đây.

Spring Bean là gì?

Spring Beans chính là những Java Object mà từ đó tạo nên khung sườn của một ứng dụng Spring. Chúng được cài đặt, lắp ráp và quản lý bởi Spring IoC container.

Khái niệm trên trong có vẽ ngắn gọn, tuy nhiên thật khó để hiểu nếu bạn thiếu kiến thức về Spring IoC container. Do vậy chúng ta sẽ cùng nhau tìm hiểu nó ở phần sau.

Inversion of Control

Inversion of Control viết tắt là IoC là một quá trình trong đó một object định nghĩa các dependency (phụ thuộc) mà không cần phải khởi tạo chúng.Việc khởi tạo các dependency này được chuyển giao cho IoC container.

Để làm rõ hơn IoC chúng ta tiến hành với ví dụ sau với Company class

public class Company {
    private Address address;

    public Company(Address address) {
        this.address = address;
    }

    // getter, setter and other properties
}

Và Address class.

public class Address {
    private String street;
    private int number;

    public Address(String street, int number) {
        this.street = street;
        this.number = number;
    }

    // getters and setters
}

Trong lập trình truyền thống, để khởi tạo một Company object chúng ta sẽ làm như sau:

Address address = new Address("High Street", 1000);
Company company = new Company(address);

Cách này không có gì sai, nhưng hãy tưởng tượng ứng dụng của bạn trở nên lớn hơn và có đến hàng chục, hàng trăm class. Đôi lúc chúng ta muốn sử dụng duy nhất một instance của một class trong toàn bộ ứng dụng, ví dụ như bạn có một class DataSource dùng để lưu trữu các thông tin kết nối đến database thì trong ứng dụng thật chất chúng ta chỉ cần duy nhất một instance của nó và được sử dụng ở nhiều nơi khác nhau.

Để làm được điều như trên thật sự là rất phức tạp, đây chính là lúc chúng ta cần đến Inversion of Control.

Thay vì tự khởi tạo và quản lý các dependency trong một class, nó có thể lấy chúng từ một vùng chứa gọi là IoC container. Tất cả những gì chúng ta cần làm là cung cấp cho container các thông tin cấu hình metadata thích hợp.

Định nghĩa Bean trong Spring

Trong Spring chúng ta có thể định nghĩa một Bean thông qua 2 annotation là @Component@Bean annotation, điểm khác nhau giữa chúng là @Component được dùng để chú thích cho một class trong khi @Bean được dùng để chú thích trên method.

Đầu tiên, chúng ta sẽ đánh dấu Company class với @Component annotation

@Component
public class Company {
    private Address address;

    public Company(Address address) {
        this.address = address;
    }

    // getter, setter and other properties
}

Dưới đây là Config class cung cấp các metadata cho IoC container:

@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
    @Bean
    public Address getAddress() {
        return new Address("High Street", 1000);
    }
}

Khi class được đánh dấu với @Configuration nó sẽ được xem là một trong những class cung cấp các thông tin cấu hình cho ứng dụng, vì vậy chúng sẽ được đọc và khởi tạo đầu tiên.

Trong Config class khởi tạo một Bean với kiểu dữ liệu là Address. Ngoài ra nó còn sử dụng @ComponentScan annotation dùng để hướng dẫn cho IoC container tìm kiếm và khởi tạo một Bean mới trong package chứa Company class từ đó nó cũng tạo ra một Bean có kiểu Company.

Khi Spring IoC container khởi tạo các object có kiểu dữ liệu AddressCompany chúng được gọi là các Spring Bean được quản lý bởi IoC container. Bất cứ nơi nào cần sử dụng chúng sẽ đều phải yêu cầu đến IoC container và nó sẽ trả về những Bean đã khởi tạo trước đó.

Kết bài

Qua bài viết ngắn này hy vọng các bạn thể hiểu được khái niệm về Bean trong Spring, đây là một khái niệm cốt lỗi của Spring mà bạn thật sự phải hiểu rõ để có thể tiến xa hơn với Spring Framework.

Nguồn tham khảo

https://www.baeldung.com/spring-bean#3-bean-configuration

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x