Spring Framework

Kiến trúc của Spring framework

Trong bài này chúng ta sẽ tìm hiểu về kiến trúc của Spring Framework, các thành phần chính và vai trò của chúng trong ứng dụng Spring. Kiến trúc tổng quan của Spring được mô tả trong hình dưới đây.

Spring architecture
  1. Data access/Integration

    1. Spring JDBC - Java Database Connectivity

      • Cung cấp các APIs giúp làm việc với JDBC dễ dàng hơn.
      • Giảm thiểu boilerplate code (mã lặp đi lặp lại) chẳng hạn như quản lý kết nối, xử lý ngoại lệ, v.v.
      • Cung cấp các lớp tiện ích như JdbcTemplate, NamedParameterJdbcTemplate,v.v. để đơn giản hóa truy vấn SQL.
    2. Spring ORM - Object Relational Mapping

      • Hỗ trợ tích hợp, cấu hình và quản lý giao dịch khi làm việc với các framework ORM như Hibernate, JPA, JDO, và iBatis, v.v.
    3. Spring OXM - Object XML Mapping

      • Chuyển đổi (marshal) dữ liệu từ đối tượng Java thành XML hoặc ngược lại (unmarshal) dữ liệu từ XML thành đối tượng Java.
      • Tích hợp với các dịch vụ bên ngoài thông qua giao tiếp XML (SOAP, cấu hình, file XML).
    4. Spring JMS - Java Message Service

      Cung cấp các công cụ và API để tích hợp và làm việc với các hệ thống nhắn tin dựa trên JMS - một tiêu chuẩn của Java được thiết kế cho giao tiếp không đồng bộ (asynchronous) giữa các hệ thống hoặc ứng dụng.

      • Gửi thông điệp (Message Producer).
      • Nhận thông điệp (Message Consumer)
      • Quản lý giao dịch khi làm việc với hệ thống nhắn tin.
      • Tích hợp với các hệ thống message broker như ActiveMQ, RabbitMQ, IBM MQ, và Kafka.
    5. Transactions

      • Quản lý giao dịch trong ứng dụng, hỗ trợ các cơ chế như Declarative transaction management (thông qua annotation @Transactional) hoặc Programmatic transaction management (thông qua API).
      • Xử lý các giao dịch phân tán thông qua JTA (Java Transaction API).
  2. Web

    1. Web

      1. Spring Web

        • Xử lý HTTP Request và HTTP Response.
        • Cung cấp khả năng xử lý đa ngôn ngữ và theme.
        • Hỗ trợ tải file thông qua form HTML (multipart file upload).
      2. Spring MVC

        • DispatcherServlet là thành phần trung tâm, chịu trách nhiệm định tuyến và xử lý yêu cầu HTTP.
        • Handler Mapping có nhiệm vụ xác định controller sẽ xử lý yêu cầu dựa trên URL.
        • View Resolver thực hiện chuyển đổi tên view (trả về từ controller) thành giao diện cụ thể (JSP, Thymeleaf).
    2. Servlet

      Spring cho phép tích hợp chặt chẽ với Servlet API để xây dựng các ứng dụng dựa trên Java EE và sử dụng DispatcherServlet làm nền tảng cho việc xử lý các yêu cầu HTTP.

      DispatcherServlet là một lớp mở rộng từ HttpServlet, đóng vai trò trung tâm trong Spring MVC. Quy trình xử lý một HTTP Request được thực hiện theo thứ tự như sau:

      • Nhận yêu cầu từ client.
      • Gửi yêu cầu tới thành phần thích hợp dựa trên cấu hình Handler Mapping.
      • Xử lý logic trong controller
      • Chuyển dữ liệu và tên view tới View Resolver.
      • Render giao diện và gửi kết quả về client thoogn qua HTTP Response.
    3. WebSocket

      WebSocket là một giao thức giao tiếp hai chiều, cho phép client và server trao đổi dữ liệu liên tục mà không cần tạo nhiều kết nối HTTP. WebSocket thường được sử dụng để xây dựng các ứng dụng thời gian thực như chat, thông báo hoặc game, v.v.

      • STOMP (Simple Text Oriented Messaging Protocol) là giao thức nhắn tin thường được sử dụng cùng với WebSocket, cho phép gửi và nhận thông điệp theo các chủ đề (topic).
      • Message Broker là thành phần xử lý định tuyến thông điệp giữa client và server.
    4. Portlet

      Portlet là một thành phần web được thực thi trong một container gọi là Portlet Container. Portlet không tạo ra các HTTP Response trực tiếp mà được sử dụng trong các ứng dụng portal.

      Spring Portlet MVC là một biến thể của Spring MVC được tối ưu hóa cho các ứng dụng cổng thông tin.

      Spring Portlet sử dụng PortletDispatcherServlet để xử lý các HTTP Request, các thành phần chính bao gồm:

      • Action Requests: Xử lý các yêu cầu từ người dùng.
      • Render Requests: Xử lý hiển thị nội dung lên giao diện.
      • Resource Requests: Xử lý yêu cầu tài nguyên (như tải file).
  3. AOP và Aspects

    Mô hình lập trình AOP cho phép tổ chức các chức năng được sử dụng ở nhiều nơi trong ứng dụng thành các logic riêng biệt, không liên quan trực tiếp đến logic chính của ứng dụng. Spring AOP bao gồm các thành phần sau đây:

    1. Aspect

      Spring Aspect là mô-đun chứa các chức năng liên quan đến cross-cutting concerns (ví dụ như logging, bảo mật, transaction). Một Aspect thường được triển khai bằng cách sử dụng các annotation như @Aspect.

    2. Join Point - Điểm liên kết

      Là một điểm trong ứng dụng - nơi có thể chèn thêm logic từ một aspect ví dụ như trước khi gọi một phương thức hoặc sau khi gọi một phương thức.

    3. Advice - Chỉ dẫn

      Spring Advice là hành động thực hiện tại một Join Point cụ thể, Spring có các loại Advice như sau:

      • Before Advice: Thực thi trước khi gọi một phương thức.
      • After Advice: Thực thi sau khi phương thức hoàn thành (dù thành công hay thất bại).
      • After Returning Advice: Thực thi sau khi phương thức trả về giá trị.
      • After Throwing Advice: Thực thi khi phương thức throw exception.
      • Around Advice: Thực thi cả trước và sau gọi phương thức.
    4. Pointcut - Điểm cắt

      Spring Pointcut là một biểu thức xác định các Join Point mà Advice sẽ áp dụng, được định nghĩa bằng cách sử dụng cú pháp AspectJ.

    5. Weaving - Kết hợp

      Spring Weaving là quá trình liên kết các aspect vào mã nguồn của ứng dụng, Spring hỗ trợ cơ chế runtime weaving.

  4. Instrumentation

    Spring Instrumentation là một thành phần của Spring framework hỗ trợ thay đổi hành vi của ứng dụng tại thời điểm thực thi (runtime) bằng cách sử dụng các công cụ như proxy và bytecode manipulation. Thành phần này cung cấp khả năng tích hợp với Instrumentation API của Java, giúp thực hiện các tác vụ như đo lường hiệu năng, tạo proxy động, hoặc sửa đổi bytecode, v.v.

    Spring Instrumentation hoạt động dựa trên Java Instrumentation API và CGLIB hoặc JDK Proxy, đảm nhận các nhiệm vụ chính sau đây:

    • Thay đổi hoặc thêm logic vào ứng dụng tại thời điểm thực thi bao gồm các thay đổi mà không cần sửa lại mã nguồn, hỗ trợ AOP, tạo proxy động hoặc agent.
    • Hỗ trợ quản lý proxy trong Spring - một thành phần quan trọng trong việc triển khai AOP, quản lý giao dịch hoặc lazy initialization.
    • Tích hợp với các công cụ như APM (Application Performance Monitoring) để theo dõi hiệu năng và trạng thái tại thời điểm thực thi.
  5. Messaging

    Cho phép các thành phần của ứng dụng giao tiếp với nhau thông qua các hệ thống gửi/nhận tin nhắn (message broker).

    • Hỗ trợ các hệ thống xử lý bất đồng bộ hoặc tích hợp với các hệ thống phân tán.
    • Tương thích với các giao thức như JMS (Java Message Service), RabbitMQ, Kafka, v.v.

  6. Core Container

    Core Container là thành phần cơ bản và quan trọng nhất của Spring, cung cấp các chức năng cốt lõi để phát triển ứng dụng Spring.

    1. Spring Core

      Spring Core là module cốt lõi của Spring, cung cấp cơ sở cho các thành phần khác trong framework. Spring Core chịu trách nhiệm xử lý các logic IoC và DI, hai lớp quan trọng nhất của Spring Core là:

      • BeanFactory: Đây là interface cơ bản của container Spring, giúp khởi tạo và quản lý các bean.
      • ApplicationContext: Kế thừa BeanFactory và bổ sung thêm các chức năng như event handling, internationalization (i18n), truy cập các tài nguyên, v.v.
    2. Spring Beans

      Quản lý các đối tượng (beans) trong ứng dụng bao gồm việc khởi tạo, cấu hình và quản lý vòng đời của các beans.

      Bean có thể được cấu hình theo nhiều cách khác nhau chẳng hạn như sử dụng XML, annotations hoặc Java-based configuration.

      Các lớp quan trọng của Beans bao gồm:

      • BeanFactory: Cung cấp API để khởi tạo và quản lý các bean.
      • ApplicationContext: Kế thừa BeanFactory và bổ sung thêm nhiều tính năng nâng cao ví dụ như hỗ trợ Internationalization (i18n), xử lý sự kiện, v.v.
    3. Spring Context

      Cung cấp môi trường để các ứng dụng Spring hoạt động, về bản chất Spring Context là một container Spring kế thừa BeanFactory và bổ sung thêm các chức năng để quản lý các bean theo bối cảnh của ứng dụng.

      Các lớp quan trọng của Spring Context bao gồm:

      • ApplicationContext: Cung cấp các tính năng như quản lý sự kiện ( event handling ), hỗ trợ quốc tế hóa, và khả năng truy xuất tài nguyên từ các file properties hoặc nguồn bên ngoài.
      • GenericWebApplicationContext: Sử dụng trong các ứng dụng web, hỗ trợ thêm tính năng cấu hình Spring Web MVC và Spring WebFlux.
      • AnnotationConfigApplicationContext: Phục vụ cấu hình bean thông qua annotations.
    4. SpEL - Spring Expression Language

      SpEL là một ngôn ngữ biểu thức mạnh mẽ của Spring framework, được thiết kế để xử lý và tính toán giá trị các biểu thức trong ứng dụng Spring.

      SpLE rất linh động và được áp dụng trong nhiều tình huống khác nhau ví dụ như truy cập thuộc tính của đối tượng; gọi phương thức; truy cập phần tử của mảng, danh sách hoặc tập hợp; gọi hàm tích hợp; thực hiện các toán tử so sánh, toán tử điều kiện, v.v.

  7. Test

    Spring cung cấp một bộ công cụ mạnh mẽ để kiểm thử ứng dụng

    • Unit Testing: Các công cụ để kiểm thử các bean và chức năng trong ứng dụng.
    • Integration Testing: Hỗ trợ kiểm thử tích hợp các thành phần của hệ thống.