Trong bài viết này, chúng ta sẽ tìm hiểu về các thuật ngữ quan trọng trong Spring Framework, một công cụ không thể thiếu trong việc phát triển ứng dụng Java hiện đại.
Spring là gì?
Spring là một framework phát triển ứng dụng Java được hàng triệu lập trình viên sử dụng. Nó giúp tạo ra các ứng dụng có hiệu năng cao, dễ kiểm thử và bảo trì hơn.
- Spring có kích thước nhẹ, chỉ khoảng 2MB cho phiên bản cơ bản.
- Maven là mã nguồn mở, được phát triển với sự đóng góp từ các cộng đồng lớn.
- Spring Framework được xây dựng dựa trên hai nguyên tắc thiết kế chính là Dependency Injection và Aspect Oriented Programming.
- Spring có thể được sử dụng cho phát triển Java Web, ứng dụng di động và Java Desktop.
Mục tiêu chính của Spring là giúp phát triển các ứng dụng J2EE một cách dễ dàng hơn dựa trên mô hình sử dụng POJO (Plain Old Java Object).
Spring Framework Overview
Ưu điểm khi sử dụng Spring Framework
Spring cung cấp cho lập trình viên khả năng sử dụng POJOs, giúp đơn giản hóa khâu phát triển và quản lý ứng dụng. Việc sử dụng POJOs giúp giảm thiểu sự phụ thuộc vào EJB, các luồng chạy và cấu hình phức tạp. Spring được cấu trúc theo kiểu module. Dù số lượng các gói và lớp khá nhiều, nhưng bạn chỉ cần quan tâm đến những gì cần thiết cho dự án của mình.
Spring hỗ trợ nhiều công nghệ khác nhau như ORM Framework, các logging framework, JEE và các thư viện quản lý lịch trình (như Quartz hoặc JDK Timer). Modun Web của Spring được thiết kế theo mô hình MVC, từ đó cung cấp đầy đủ tính năng để thay thế các web framework khác như Struts.
Các thuật ngữ quan trọng trong Spring Framework
Spring Bean
Spring Bean là các đối tượng trong Spring Framework, được khởi tạo thông qua Spring Container. Bất kỳ class Java POJO nào cũng có thể trở thành Spring Bean nếu được cấu hình và khởi tạo thông qua container bằng cách cung cấp các thông tin cấu hình (như file config .xml, .properties, v.v.).
Các Bean Scopes trong Spring
Có 6 scope được định nghĩa cho Spring Bean:
- Singleton: Chỉ duy nhất một thể hiện của bean sẽ được tạo cho mỗi container. Đây là scope mặc định cho Spring Bean. Khi sử dụng scope này, cần đảm bảo các bean không chia sẻ các biến/thuộc tính không an toàn.
- Prototype: Một thể hiện của bean sẽ được tạo ra cho mỗi lần yêu cầu.
- Request: Tương tự như prototype scope, nhưng sử dụng cho ứng dụng web, một thể hiện bean sẽ được tạo cho mỗi yêu cầu HTTP.
- Session (dành cho web): Mỗi thể hiện bean sẽ được tạo cho mỗi phiên HTTP.
- Application (dành cho web): Với scope này, mỗi ServletContext sẽ có một bean instance được tạo ra.
- Websocket (dành cho web): Mỗi một socket kết nối đến server sẽ có một bean instance được tạo ra.
Bean Scope Diagram
Dependency Injection (DI)
Dependency Injection là một kỹ thuật, một design pattern cho phép loại bỏ sự phụ thuộc cứng nhắc và làm cho ứng dụng của bạn dễ mở rộng và bảo trì hơn. Trong Spring, có hai cách thực hiện Dependency Injection:
- Qua hàm khởi tạo (Constructor).
- Sử dụng setter (Setter method).
IoC (Inversion of Control)
Inversion of Control giúp thay đổi luồng điều khiển của chương trình một cách linh hoạt. Spring IoC: IoC Container là thành phần thực hiện IoC. Trong Spring, Spring Container sẽ tạo ra các đối tượng, lắp ráp chúng lại với nhau, cấu hình các đối tượng và quản lý vòng đời của chúng từ lúc tạo ra cho đến khi bị hủy bỏ.
Spring Container sử dụng DI để quản lý các thành phần, đối tượng nhằm tạo nên một ứng dụng. Các thành phần này được gọi là Spring Bean. Để tạo đối tượng, cấu hình và lắp ráp chúng, Spring Container sẽ lấy thông tin từ các file XML và thực thi.
Để hiểu rõ hơn về IoC và Dependency Injection, hãy xem qua ví dụ sau:
public interface HelloWorld {
void sayHello();
}
public class SpringHelloWorld implements HelloWorld {
@Override
public void sayHello() {
System.out.println("Spring say hello !");
}
}
public class HibernateHelloWorld implements HelloWorld {
@Override
public void sayHello() {
System.out.println("Hibernate say hello !");
}
}
public class HelloWorldService {
private HelloWorld helloWorld;
public HelloWorldService() {
// Khởi tạo một đối tượng
helloWorld = new SpringHelloWorld();
}
}
Trong ví dụ trên, HelloWorldService đang điều khiển việc tạo đối tượng HelloWorld. Tại sao chúng ta không chuyển việc tạo HelloWorld cho một bên thứ ba xử lý thay vì làm ở HelloWorldService? Điều này thể hiện khái niệm “Inversion of Control”. Và IoC Container sẽ đóng vai trò quản lý việc tạo ra cả HelloWorldService lẫn HelloWorld.
Dependency Injection Process
Hy vọng rằng qua bài viết này, bạn sẽ hiểu rõ hơn về Spring Framework cũng như các thuật ngữ quan trọng trong nó, giúp bạn sử dụng hiệu quả trong lập trình Java Web với công nghệ Spring MVC, Spring Boot.
Để tìm hiểu sâu hơn về lập trình Java từ cơ bản đến nâng cao, hãy tham gia ngay khoá học lập trình Java Fullstack của chúng tôi tại comdy.vn.