Thuật ngữ “Spring” thường được dùng để chỉ Spring Framework. Spring Framework được chia thành các module. Các ứng dụng có thể chọn module cần thiết. Trọng tâm là các module của bộ chứa lõi (core container), bao gồm mô hình cấu hình (configuration model) và cơ chế chèn phần phụ thuộc (dependency injection mechanism).
Ngoài ra, Spring Framework còn cung cấp hỗ trợ nền tảng cho nhiều kiến trúc ứng dụng khác nhau, bao gồm nhắn tin, truyền dữ liệu và web.
Framework này cũng bao gồm framework web Spring MVC dựa trên Servlet và song song đó là framework web phản ứng Spring WebFlux.
Tính năng của Spring
Spring hỗ trợ quá trình phát triển những ứng dụng Java phức tạp và khó quản lý bằng cách cung cấp một framework tích hợp nhiều công nghệ như:
Lập Trình Hướng Chức Năng (Aspect-oriented Programming – AOP)
Là một phương pháp lập trình trong Spring Framework, AOP tập trung vào chia nhỏ chức năng của ứng dụng thành các khía cạnh riêng lẻ và chèn chúng vào source code một cách linh hoạt.
AOP cung cấp nhiều module hơn cho những tính năng quan trọng xuyên suốt trong các ứng dụng, như:
Ghi nhật ký (Logging)
Bộ nhớ đệm (Caching)
Quản lý giao dịch
Xác thực
Trong AOP, đơn vị module chính là một yếu tố. Điều này cho phép người dùng sử dụng AOP để xây dựng các tùy chỉnh chức năng và khai báo dịch vụ doanh nghiệp.
Chèn phụ thuộc (Dependency Injection – DI)
Dependency Injection là cốt lõi của Spring Framework giúp quản lý và giảm sự phụ thuộc giữa các thành phần trong ứng dụng. Thay vì tạo đối tượng một cách trực tiếp, DI cho phép tạo các đối tượng phụ thuộc bên ngoài một class và cung cấp các đối tượng đó cho một class theo nhiều cách khác nhau, giúp tăng tính linh hoạt, tái sử dụng và kiểm thử của source code.
Chúng ta có thể định nghĩa khái niệm Spring bằng Inversion of Control (IoC – đảo ngược kiểm soát).
Ví dụ: Class X phụ thuộc vào class Y. Sự phụ thuộc này có thể tạo ra nhiều vấn đề trên thực tế, bao gồm cả lỗi hệ thống. Do đó cần phải tránh sự phụ thuộc như vậy. Spring IOC giải quyết các vấn đề phụ thuộc như vậy bằng Dependency Injection. Ở đây, nó chỉ ra rằng class Y sẽ được IoC đưa vào class X.
Plain Old Java Object (POJO)
Trong Spring, POJO là các đối tượng Java thông thường, không phụ thuộc vào bất kỳ framework hay interface nào khác. Sử dụng POJO trong Spring Framework giúp source code trở nên đơn giản, dễ đọc, và dễ bảo trì mà không cần kế thừa các class hay triển khai các interface cụ thể.
Các Module và kiến trúc của Spring Framework
Kiến trúc Spring Framework.
Spring framework được chia thành các module và bao gồm nhiều module cung cấp các chức năng khác nhau để hỗ trợ xây dựng ứng dụng doanh nghiệp.
Các module có thể được phân loại rộng rãi vào bốn lĩnh vực chính: Bộ chứa lõi (Core Container), Truy cập/Tích hợp dữ liệu (Data Access/Integration), Web, và Khác (Miscellaneous).
Bộ chứa lõi (Core Container)
Spring Core: Module này cung cấp chức năng cơ bản của framework Spring, bao gồm IoC và DI. IoC container là trái tim của Spring Framework, chịu trách nhiệm về việc tạo ra và quản lý các thể hiện của JavaBeans.
Spring Beans: Module này cung cấp BeanFactory, là khối xây dựng cơ bản của IoC container, và BeanWrapper, chịu trách nhiệm quản lý vòng đời của một bean. BeanFactory là giao diện cốt lõi để truy cập IoC container, cung cấp các phương thức để truy xuất bean.
Spring Context: Module này cung cấp ApplicationContext, là một phiên bản nâng cao của BeanFactory và cung cấp các tính năng bổ sung như quốc tế hóa và tải nguồn, cùng khả năng xuất bản và tiêu thụ sự kiện.
Spring Expression Language (SpEL): Module này cung cấp một ngôn ngữ biểu diễn mạnh mẽ để truy vấn và thao tác đối tượng trong thời gian chạy. SpEL hỗ trợ một loạt các tính năng, bao gồm truy cập thuộc tính, gọi phương thức, điều kiện, vòng lặp và chuyển đổi kiểu dữ liệu.
Truy cập/Tích hợp dữ liệu cung cấp hỗ trợ tích hợp với cơ sở dữ liệu và các nguồn dữ liệu khác. Phần này bao gồm các module sau:
Spring JDBC: Module này cung cấp một class trừu tượng JDBC đơn giản giảm lượng code cần thiết để làm việc với JDBC. Spring JDBC hỗ trợ quản lý giao dịch, cho phép nhà phát triển quản lý giao dịch cơ sở dữ liệu theo cách khai báo bằng quản lý giao dịch của Spring.
Spring ORM: Module này cung cấp tích hợp với các framework ánh xạ đối tượng-quan hệ (Object-Relational Mapping – ORM) như Hibernate và JPA. Spring ORM cung cấp một class trừu tượng cao cấp trên cơ sở các framework ORM, giúp nhà phát triển viết ít code boilerplate (mã soạn sẵn) và tích hợp các công nghệ ORM dễ dàng với các tính năng khác của Spring như quản lý giao dịch và caching.
Spring Data: Module này cung cấp một mô hình lập trình nhất quán và dễ sử dụng để làm việc với các công nghệ truy cập dữ liệu, bao gồm cơ sở dữ liệu, NoSQL và các dịch vụ dữ liệu dựa trên đám mây. Spring Data cung cấp nhiều tính năng, bao gồm các hoạt động CRUD tự động, tạo truy vấn từ tên phương thức, hỗ trợ phân trang và sắp xếp, tích hợp với quản lý giao dịch của Spring, và nhiều hơn nữa.
Spring Transaction: Module này cung cấp hỗ trợ quản lý giao dịch tuyên bố trong ứng dụng Spring. Spring Transaction hỗ trợ nhiều cấp độ truyền tải và cách ly giao dịch, cho phép nhà phát triển quản lý giao dịch ở các cấp độ khác nhau. Ngoài ra, Spring Transaction hỗ trợ nhiều chiến lược quản lý giao dịch, như sử dụng một quản lý giao dịch JTA hoặc một quản lý giao dịch JDBC đơn giản.
Web cung cấp sự hỗ trợ để xây dựng ứng dụng web và bao gồm các module sau:
Spring MVC: Module này cung cấp một framework Model-View-Controller (MVC) để xây dựng ứng dụng web. Spring MVC cung cấp một loạt các tính năng, bao gồm hỗ trợ xử lý yêu cầu và phản hồi HTTP, xử lý biểu mẫu, ràng buộc dữ liệu, kiểm tra và nhiều tính năng khác. Spring MVC cũng hỗ trợ nhiều công nghệ hiển thị khác nhau, như JSP (JavaServer Pages), Thymeleaf và Velocity, cho phép nhà phát triển chọn công nghệ hiển thị phù hợp nhất với nhu cầu của họ.
Spring WebFlux: Module này cung cấp một mô hình lập trình phản ứng để xây dựng ứng dụng web đòi hỏi độ tương tác và khả năng mở rộng cao. Spring WebFlux hỗ trợ xây dựng ứng dụng web phản ứng sử dụng nhiều công nghệ như Netty, Undertow và các container Servlet 3.1+. Spring WebFlux cũng hỗ trợ nhiều tính năng, bao gồm hỗ trợ truy cập dữ liệu phản ứng, xử lý luồng phản ứng và máy khách HTTP phản ứng.
Spring Web Services: Module này hỗ trợ xây dựng các dịch vụ web dựa trên SOAP và RESTful. Spring Web Services cung cấp hỗ trợ tạo WSDL (Web Services Description Language) từ các class Java và tạo các class Java từ WSDL. Điều này cho phép nhà phát triển xác định hợp đồng (tức là giao diện) của dịch vụ web bằng WSDL và tạo ra các class Java thực hiện dịch vụ web từ WSDL.
Khác bao gồm các module khác cung cấp các chức năng bổ sung, như:
Spring Security: Module này cung cấp các tính năng xác thực và ủy quyền cho ứng dụng Spring. Spring Security hỗ trợ nhiều cơ chế ủy quyền, như kiểm soát quyền dựa trên vai trò và kiểm soát quyền dựa trên biểu thức, hỗ trợ bảo mật các phần khác nhau của ứng dụng bằng cách sử dụng cấu hình bảo mật khác nhau, cho phép các lập trình viên áp dụng các chính sách bảo mật tinh tế.
Spring Integration: Module này hỗ trợ xây dựng kiến trúc động và sự kiện. Spring Integration cung cấp nhiều mô hình tích hợp như truyền tin, định tuyến và biến đổi, hỗ trợ nhiều hệ thống truyền tin khác nhau như JMS, AMQP và Apache Kafka, đồng thời tích hợp với các giao thức khác nhau như FTP, HTTP và TCP.
Spring Batch: Module này hỗ trợ xử lý hàng loạt và tích hợp với các hệ thống doanh nghiệp. Spring Batch cung cấp một loạt các công cụ và tiện ích để xây dựng và quản lý các ứng dụng xử lý hàng loạt , bao gồm hỗ trợ kiểm thử và gỡ lỗi công việc hàng loạt , đăng nhập và giám sát, cũng như tích hợp với các module khác của Spring như Spring Data và Spring Integration.
Spring Cloud: Module này hỗ trợ xây dựng ứng dụng native đám mây bằng các công nghệ Spring. Spring Cloud cung cấp nhiều tính năng cho việc xây dựng ứng dụng native đám mây, như phát hiện dịch vụ, quản lý cấu hình và cân bằng tải, hỗ trợ tích hợp với nhiều nền tảng đám mây khác nhau như AWS và GCP, cũng như sử dụng các công nghệ native đám mây khác như container và serverless computing.
Cách Spring hoạt động
Một ứng dụng web thường bao gồm ba layer chính:
Layer Trình Bày (UI): Xử lý việc hiển thị nội dung và tương tác người dùng.
Layer Logic Doanh Nghiệp: Xử lý các yêu cầu chức năng cơ bản của chương trình.
Layer Truy Cập Dữ Liệu: Giám sát quy trình truy xuất dữ liệu.
Ví dụ, layer trình bày có thể cần liên lạc với layer logic doanh nghiệp, mà sau đó tương tác với layer truy cập dữ liệu. Mỗi tương tác này dẫn đến những gì thường được gọi là phụ thuộc và tạo ra sự kết nối giữa các thành phần hệ thống khác nhau.
Một trong những đặc điểm cốt lõi của Spring là khả năng thực hiện chèn phụ thuộc, đây là một mô hình lập trình cho phép lập trình viên xây dựng kiến trúc tách rời (decoupled architectures). Spring hiểu các chú thích Java khác nhau mà một lập trình viên đặt lên các layer và có thể giúp đảm bảo rằng tất cả các thể hiện được tạo ra đều có phụ thuộc được điền đầy đủ.
Để Spring Framework có thể khởi tạo đối tượng và điền đầy đủ phụ thuộc, lập trình viên chỉ cần nói với Spring đối tượng nào cần quản lý và phụ thuộc là gì cho mỗi layer thông qua các chú thích.
Ví dụ, @Component cho Spring biết layer nào cần quản lý, đánh dấu các đối tượng là các thành phần được quản lý và xác định layer cho chèn phụ thuộc.
Một ví dụ khác là @Autowired cho biết cho Spring cách xử lý việc khởi tạo của layer và bắt đầu tìm kiếm phụ thuộc đó trong các thành phần và layer để tìm một sự tương đồng.