Hôm nay, tôi sẽ giúp các bạn tìm hiểu sâu vào cấu trúc của Spring Boot. Việc nắm vững những kiến thức này không chỉ giúp chúng ta sử dụng Spring Boot hiệu quả hơn mà còn cung cấp nền tảng vững chắc để gỡ lỗi và tối ưu hóa ứng dụng.
Các thành phần cốt lõi của Spring Boot
Spring Boot chủ yếu sở hữu bốn thành phần chính:
- Spring Boot Starters
- Spring Boot AutoConfigurator
- Spring Boot CLI
- Spring Boot Actuator
LƯU Ý: Ngoài bốn thành phần chính này, Spring Boot còn có thêm hai thành phần nữa:
- Spring Initializr
- Spring Boot IDEs
Để nhanh chóng khởi tạo các dự án Spring Boot mới, chúng ta có thể sử dụng giao diện web “Spring Initializr” tại URL: https://start.spring.io. Chúng ta có nhiều IDE hỗ trợ Spring Boot như Eclipse IDE, IntelliJ IDEA, Spring STS Suite, v.v. Chúng ta sẽ đi sâu vào hai thành phần này trong các bài viết tới.
Còn bây giờ, chúng ta sẽ lần lượt phân tích chi tiết bốn thành phần chính của Spring Boot.
Spring Boot Starter
Spring Boot Starters là một trong những tính năng hay thành phần cốt lõi quan trọng nhất của Spring Boot Framework. Nhiệm vụ chính của Spring Boot Starter là nhóm các dependency phổ biến hoặc có liên quan lại thành một dependency duy nhất. Chúng ta sẽ khám phá chi tiết tuyên bố này với một ví dụ.
Ví dụ điển hình, chúng ta muốn phát triển một Spring Web Application với Tomcat WebServer. Khi đó, chúng ta cần thêm các dependency JAR tối thiểu sau vào file pom.xml
của Maven hoặc build.gradle
của Gradle:
- File JAR Spring core (
spring-core-xx.jar
) - File JAR Spring Web (
spring-web-xx.jar
) - File JAR Spring Web MVC (
spring-webmvc-xx.jar
) - File JAR Servlet (
servlet-xx.jar
)
Nếu chúng ta muốn thêm chức năng cơ sở dữ liệu, chúng ta cần bổ sung các JAR liên quan đến database như Spring JDBC, Spring ORM, Spring Transaction:
- File JAR Spring JDBC (
spring-jdbc-xx.jar
) - File JAR Spring ORM (
spring-orm-xx.jar
) - File JAR Spring Transaction (
spring-transaction-xx.jar
)
Việc khai báo quá nhiều dependency trong các file build của chúng ta là một công việc tẻ nhạt và cồng kềnh đối với nhà phát triển. Đồng thời, nó còn làm tăng kích thước file build. Vậy giải pháp để tránh việc định nghĩa quá nhiều dependency trong các file build của chúng ta là gì?
Giải pháp chính là thành phần Spring Boot Starter. Spring Boot Starter kết hợp tất cả các JAR liên quan vào một file JAR duy nhất, cho phép chúng ta chỉ cần thêm một dependency duy nhất vào file build của mình.
Thay vì phải thêm 4 file JAR riêng lẻ như trên vào file build, chúng ta chỉ cần thêm duy nhất một file JAR: “spring-boot-starter-web”.
Khi chúng ta thêm dependency “spring-boot-starter-web” vào file build, Spring Boot Framework sẽ tự động tải tất cả các JAR cần thiết và thêm chúng vào classpath của dự án.
Tương tự, file JAR “spring-boot-starter-logging” sẽ tải tất cả các JAR dependency của nó như “jcl-over-slf4j”, “jul-to-slf4j”, “log4j-over-slf4j”, “logback-classic” vào classpath của dự án chúng ta.
- Spring Boot Starter giảm thiểu việc khai báo nhiều dependency.
- Spring Boot Starter đơn giản hóa các dependency của dự án build.
Đó là tất cả về thành phần Spring Boot Starter. Chúng ta sẽ thảo luận chi tiết hơn với các ví dụ về Spring Boot trong những bài viết sắp tới.
Spring Boot AutoConfigurator
Một thành phần cốt lõi quan trọng khác của Spring Boot Framework là Spring Boot AutoConfigurator. Hầu hết các nhà phê bình nền tảng Spring IO (Spring Framework) đều cho rằng: “Phát triển một ứng dụng dựa trên Spring đòi hỏi rất nhiều cấu hình (cấu hình XML hoặc cấu hình Annotation)”. Vậy làm thế nào để giải quyết vấn đề này? Giải pháp chính là Spring Boot AutoConfigurator.
Nhiệm vụ chính của Spring Boot AutoConfigurator là giảm thiểu cấu hình Spring. Khi chúng ta phát triển ứng dụng Spring bằng Spring Boot, chúng ta không cần định nghĩa bất kỳ cấu hình XML nào và gần như không cần hoặc chỉ cần cấu hình Annotation tối thiểu. Thành phần Spring Boot AutoConfigurator sẽ đảm nhiệm việc cung cấp các thông tin đó.
Ví dụ, nếu chúng ta muốn khai báo một ứng dụng Spring MVC sử dụng nền tảng Spring IO, chúng ta cần định nghĩa rất nhiều cấu hình XML như views, view resolvers, v.v. Nhưng nếu chúng ta sử dụng Spring Boot Framework, chúng ta không cần định nghĩa các cấu hình XML đó.
Spring Boot AutoConfigurator sẽ tự động xử lý việc này. Nếu chúng ta sử dụng file JAR “spring-boot-starter-web” trong file build của dự án, Spring Boot AutoConfigurator sẽ tự động giải quyết các views, view resolvers, v.v.
Và Spring Boot cũng giảm thiểu việc định nghĩa cấu hình Annotation. Nếu chúng ta sử dụng @SpringBootApplication
annotation ở cấp độ class, Spring Boot AutoConfigurator sẽ tự động thêm tất cả các annotation cần thiết vào bytecode của lớp Java. Nếu chúng ta đọc tài liệu của Spring Boot, chúng ta có thể tìm thấy định nghĩa sau cho @SpringBootApplication
:
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication
Điều đó có nghĩa là, @SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration
. Đó là tất cả về thành phần Spring Boot AutoConfigurator. Chúng ta sẽ thảo luận chi tiết hơn với các ví dụ về Spring Boot trong những bài viết sắp tới.
LƯU Ý:
- Nói một cách đơn giản, Spring Boot Starter giảm bớt các dependency của bản dựng và Spring Boot AutoConfigurator giảm bớt cấu hình Spring.
- Như chúng ta đã thảo luận, Spring Boot Starter có dependency với Spring Boot AutoConfigurator, Spring Boot Starter tự động kích hoạt Spring Boot AutoConfigurator.
Spring Boot CLI
Spring Boot CLI (Command Line Interface) là một phần mềm của Spring Boot giúp chúng ta chạy và kiểm tra ứng dụng Spring Boot từ cửa sổ lệnh. Khi chúng ta chạy ứng dụng Spring Boot bằng CLI, nó tự động sử dụng các thành phần Spring Boot Starter và Spring Boot AutoConfigurator để giải quyết tất cả các dependency và thực thi ứng dụng.
Chúng ta thậm chí có thể chạy ứng dụng Spring Web chỉ với các lệnh Spring Boot CLI đơn giản. Spring Boot CLI đã giới thiệu lệnh “spring” mới để thực thi các Groovy Scripts từ cửa sổ lệnh.
Ví dụ lệnh “spring”:
spring run HelloWorld.groovy
Ở đây, HelloWorld.groovy
là tên file script Groovy. Tương tự như file mã nguồn Java có đuôi mở rộng .java
, các file script Groovy có đuôi mở rộng .groovy
. Lệnh “spring” thực thi HelloWorld.groovy
và tạo ra kết quả. Thành phần Spring Boot CLI đòi hỏi nhiều bước như cài đặt CLI, thiết lập CLI, phát triển ứng dụng Spring Boot đơn giản và kiểm tra nó. Vì vậy, chúng ta sẽ dành một bài viết khác để thảo luận chi tiết về nó với một số ví dụ về Spring Boot. Hãy tham khảo bài viết tiếp theo của tôi về Spring Boot CLI.
Spring Boot Actuator
Thành phần Spring Boot Actuator cung cấp nhiều tính năng, nhưng hai tính năng chính là:
- Cung cấp các Management EndPoints cho ứng dụng Spring Boot.
- Các chỉ số (Metrics) của ứng dụng Spring Boot.
Khi chúng ta chạy ứng dụng Spring Boot Web bằng CLI, Spring Boot Actuator tự động cung cấp hostname là “localhost” và số cổng mặc định là “8080”. Chúng ta có thể truy cập ứng dụng này bằng endpoint “https://localhost:8080/“.
Chúng ta sử dụng các phương thức yêu cầu HTTP như GET và POST để đại diện cho các Management EndPoints bằng Spring Boot Actuator. Chúng ta sẽ thảo luận chi tiết hơn về Spring Boot Actuator trong các bài viết sắp tới.
Cơ chế hoạt động bên trong của Spring Boot Framework
Luôn luôn được khuyến nghị rằng bạn nên hiểu cách mà Spring Boot Framework giúp giảm bớt các dependency trong quá trình build, cấu hình Spring, v.v. Hiểu cách Spring Boot hoạt động phía bên trong (under-the-hood).
Nếu bạn quen thuộc với ngôn ngữ lập trình Groovy, thì bạn đã biết phần lớn những điều này. Trong Groovy, chúng ta không cần phải thêm một số import và cũng không cần thêm một số dependency vào dự án Groovy. Khi chúng ta biên dịch các script Groovy bằng trình biên dịch Groovy (groovyc), nó sẽ tự động thêm tất cả các lệnh import mặc định rồi tiến hành biên dịch.
Tương tự, ngôn ngữ Groovy có một cơ chế Resolver để tự động tìm và thêm tất cả các file JAR cần thiết vào classpath của dự án Groovy. Spring Boot Framework sử dụng Groovy ở bên trong để tự động thêm một số thành phần mặc định như các lệnh import mặc định, phương thức main()
của ứng dụng, v.v.
Grape là một công cụ giải quyết dependency nhúng. Grape là một trình quản lý dependency JAR được nhúng vào Groovy. Grape cho phép chúng ta nhanh chóng thêm các dependency từ kho lưu trữ Maven vào classpath của dự án để giảm thiểu định nghĩa file build. Mô hình lập trình của Spring Boot Framework chủ yếu được truyền cảm hứng từ mô hình lập trình Groovy. Spring Boot
Framework nội bộ phụ thuộc vào hai thành phần chính này: Groovy và Grape. Bạn có thể tham khảo tài liệu của Grape tại https://docs.groovy-lang.org/latest/html/documentation/grape.html để biết thêm chi tiết.
Đó là tất cả về các thành phần và cơ chế nội bộ của Spring Boot. Chúng ta sẽ thảo luận chi tiết hơn về các thành phần này với một số ví dụ về Spring Boot trong các bài viết sắp tới.
Kết luận
Qua bài viết này, chúng ta đã cùng nhau khám phá sâu sắc các thành phần cốt lõi tạo nên sức mạnh của Spring Boot. Nắm vững những kiến thức này sẽ trang bị cho bạn một công cụ mạnh mẽ để xây dựng các ứng dụng Java hiện đại một cách nhanh chóng, hiệu quả và dễ bảo trì. Bạn sẽ tự tin hơn trong việc cấu hình, triển khai và giám sát các dự án của mình, sẵn sàng đối mặt với những thách thức phức tạp trong phát triển phần mềm.