Spring Boot là gì: Chi tiết cách xây dựng ứng dụng với Spring Boot

Spring Boot là một framework giúp bạn nhanh chóng và dễ dàng xây dựng các ứng dụng Spring độc lập, sẵn sàng cho môi trường production. Nếu bạn là lập trình viên Java muốn tìm hiểu một phương pháp phát triển ứng dụng hiện đại, bài viết này sẽ giúp bạn nắm được kiến thức nền tảng về Spring Boot và có thể tự tay xây dựng những ứng dụng đầu tiên của mình.

Đọc bài viết này để biết thêm chi tiết:

  • Spring Boot là gì? Tại sao nên chọn Spring Boot?
  • Các khái niệm cốt lõi của Spring Boot
  • Xây dựng ứng dụng đầu tiên với Spring Boot
  • Hệ sinh thái Spring Boot

Spring Boot là gì? Phù hợp với dự án nào?

Spring Boot là một framework mã nguồn mở dựa trên Java, giúp đơn giản hóa việc phát triển các ứng dụng Spring độc lập, sẵn sàng cho môi trường production. Nó loại bỏ phần lớn công việc cấu hình phức tạp thường thấy trong các dự án Spring truyền thống, cho phép bạn tập trung vào việc viết logic nghiệp vụ.

Đặc biệt framework này rất phù hợp với những dự án như:

  • Microservices: Khả năng tạo các ứng dụng nhỏ, độc lập và dễ dàng triển khai làm cho Spring Boot trở thành lựa chọn hàng đầu để xây dựng kiến trúc microservices.
  • Ứng dụng web và RESTful API: Cung cấp sẵn các công cụ và thư viện để phát triển nhanh chóng các ứng dụng web và API.
  • Ứng dụng cần khởi động nhanh (Rapid Application Development – RAD): Với tính năng “convention over configuration” (ưu tiên quy ước hơn cấu hình) và “auto-configuration” (tự động cấu hình), Spring Boot giúp giảm thiểu thời gian thiết lập ban đầu, đẩy nhanh quá trình phát triển.
  • Các ứng dụng cần tích hợp dễ dàng với hệ sinh thái Spring: Nếu bạn đã quen thuộc với Spring Framework (ví dụ: Spring Data, Spring Security), Spring Boot giúp tận dụng tối đa các module này một cách dễ dàng.
  • Dự án cần sự linh hoạt và khả năng mở rộng: Spring Boot dễ dàng tùy chỉnh và mở rộng khi dự án phát triển.

Đọc thêm: Spring là gì? Spring Framework là gì?

Vì sao nên chọn Spring Boot?

Khi bắt tay vào một dự án Java mới hoặc tìm cách tối ưu hóa quy trình phát triển hiện tại, câu hỏi “Nên sử dụng công nghệ nào?” luôn được đặt ra. Spring Boot đã nhanh chóng trở thành một lựa chọn hàng đầu cho nhiều lập trình viên và doanh nghiệp, và dưới đây là những lý do thuyết phục tại sao bạn nên cân nhắc sử dụng framework này:

Đơn giản hóa việc thiết lập

Một trong những rào cản lớn khi bắt đầu với Spring Framework truyền thống là khối lượng cấu hình ban đầu. Spring Boot giải quyết triệt để vấn đề này:

  • Giảm thiểu cấu hình: Bạn sẽ nói lời tạm biệt với những file XML cấu hình dài dòng hoặc vô số các lớp Java-based config phức tạp. Spring Boot giảm thiểu tối đa lượng code boilerplate bạn cần phải viết.
  • “Convention over Configuration” (Ưu tiên quy ước hơn cấu hình): Spring Boot áp dụng triết lý này bằng cách cung cấp các cấu hình mặc định cực kỳ hợp lý cho hầu hết các trường hợp phổ biến. Điều này có nghĩa là bạn chỉ cần can thiệp và tùy chỉnh khi thực sự có nhu cầu đặc biệt, thay vì phải định nghĩa mọi thứ từ đầu.

Tự động cấu hình (Auto-Configuration)

Đây là một trong những “phép màu” của Spring Boot, giúp tăng tốc đáng kể quá trình khởi tạo dự án:

  • Cơ chế thông minh: Spring Boot tự động cấu hình ứng dụng của bạn dựa trên các thư viện (dependencies) mà bạn đã thêm vào classpath. Nó sẽ “quan sát” và thiết lập những gì cần thiết để các thành phần này hoạt động cùng nhau một cách trơn tru.
  • Ví dụ thực tế: Nếu bạn thêm spring-boot-starter-web vào dự án, Spring Boot sẽ tự động hiểu rằng bạn đang xây dựng một ứng dụng web. Nó sẽ tự cấu hình những thứ như DispatcherServlet, Jackson (thư viện xử lý JSON), Embedded Tomcat, và nhiều thứ khác mà không cần bạn phải viết một dòng code cấu hình nào.

Quản lý thư viện tiện lợi với Starter Dependencies (Các gói phụ thuộc)

Một trong những lý do thuyết phục nhất để chọn Spring Boot chính là cách nó giải quyết nỗi ám ảnh về quản lý thư viện và đảm bảo tính tương thích giữa chúng. Thay vì phải vật lộn với việc tìm kiếm, khai báo và kiểm tra từng dependency riêng lẻ, Spring Boot giới thiệu khái niệm “Starters” – các gói phụ thuộc tiện lợi.

Về bản chất, Starters là những khai báo được định nghĩa sẵn (trong file POM cho Maven hoặc khai báo dependencies cho Gradle) gom nhóm tất cả các thư viện cần thiết cho một chức năng cụ thể. Điều này có nghĩa là:

Ví dụ:

  • spring-boot-starter-data-jpa: Bao gồm mọi thứ bạn cần để làm việc với cơ sở dữ liệu quan hệ sử dụng JPA, bao gồm Spring Data JPA, Hibernate, và các trình kết nối JDBC.
  • spring-boot-starter-security: Cung cấp các thư viện cần thiết để tích hợp Spring Security vào ứng dụng của bạn.

Lợi ích: Chỉ cần thêm một starter, bạn sẽ có ngay một bộ thư viện đầy đủ và tương thích, giúp bạn tránh khỏi việc phải tìm kiếm, khai báo từng dependency riêng lẻ và lo lắng về xung đột phiên bản.

Đơn giản hóa triển khai nhờ máy chủ nhúng (Embedded Servers)

Yếu tố then chốt khiến Spring Boot trở nên hấp dẫn và được tin dùng rộng rãi là vì sự đơn giản và linh hoạt trong việc triển khai nhờ máy chủ nhúng (Embedded Servers), giúp đơn giản hóa quá trình triển khai ứng dụng.

Với Spring Boot, bạn sẽ được trải nghiệm:

  • Không còn gánh nặng cài đặt và cấu hình máy chủ riêng: Spring Boot tích hợp sẵn các máy chủ web phổ biến như Tomcat, Jetty, hoặc Undertow ngay bên trong ứng dụng của bạn. Điều này có nghĩa là bạn không cần phải cài đặt hay quản lý một máy chủ ứng dụng Java riêng biệt.
  • Đóng gói và chạy ứng dụng chỉ bằng một file JAR duy nhất: Thay vì phải tạo các file WAR phức tạp và triển khai lên một máy chủ bên ngoài, ứng dụng Spring Boot của bạn có thể được đóng gói thành một file .jar độc lập, sẵn sàng để chạy. Chỉ với một lệnh đơn giản java -jar ten-ung-dung.jar, ứng dụng của bạn đã có thể hoạt động.

Sự tiện lợi này mang lại nhiều ưu điểm lớn: 

  • Tăng tốc độ phát triển và kiểm thử: Việc khởi động và chạy ứng dụng trở nên nhanh chóng, giúp rút ngắn chu kỳ phát triển.
  • Đơn giản hóa quy trình triển khai (deployment): Việc triển khai chỉ đơn giản là sao chép file JAR và chạy nó, cực kỳ hiệu quả trong các môi trường CI/CD.
  • Lý tưởng cho kiến trúc Microservices: Khả năng đóng gói thành một đơn vị độc lập, dễ dàng quản lý và nhân bản làm cho Spring Boot trở thành lựa chọn hoàn hảo để xây dựng các microservices.

Tính năng sẵn sàng cho Production (Production-Ready Features)

Một lợi ích ưu việt của Spring Boot chính là nó trang bị sẵn cho bạn những tính năng mạnh mẽ để vận hành và giám sát ứng dụng một cách chuyên nghiệp (Production-Ready Features), giúp bạn tự tin triển khai sản phẩm.

Thay vì phải tự xây dựng các cơ chế phức tạp, Spring Boot cung cấp

Khả năng giám sát và quản lý toàn diện với Spring Boot Actuator

Đây là một công cụ vô giá, mở ra hàng loạt “cửa sổ” (endpoint HTTP) để bạn theo dõi sát sao “sức khỏe” và hoạt động của ứng dụng. Bạn có thể dễ dàng kiểm tra tình trạng (/health), xem các chỉ số vận hành quan trọng như bộ nhớ, CPU, số lượng request (/metrics), truy cập thông tin tùy chỉnh (/info), hay kiểm tra các biến môi trường và cấu hình đang được áp dụng (/env).

Điều này giúp việc chẩn đoán sự cố và tối ưu hiệu năng trở nên trực quan và hiệu quả hơn rất nhiều.

Linh hoạt tối đa trong quản lý cấu hình với Externalized Configuration

Spring Boot cho phép bạn tách biệt hoàn toàn cấu hình ra khỏi mã nguồn. Bạn có thể dễ dàng thay đổi cài đặt ứng dụng (ví dụ: thông tin kết nối database, cổng server) thông qua các file application.properties hoặc application.yml, sử dụng biến môi trường của hệ thống, hoặc thậm chí truyền tham số trực tiếp khi khởi chạy ứng dụng. Điều này giúp việc điều chỉnh ứng dụng cho các môi trường khác nhau mà không cần biên dịch lại code trở nên đơn giản.

Quản lý môi trường chuyên nghiệp với Profiles (Hồ sơ cấu hình)

Dễ dàng định nghĩa và kích hoạt các bộ cấu hình riêng biệt cho từng môi trường cụ thể như phát triển (dev), kiểm thử (test), hay sản phẩm (prod). Điều này đảm bảo ứng dụng của bạn luôn chạy với những thiết lập phù hợp nhất cho từng giai đoạn, giảm thiểu rủi ro và tăng tính ổn định.

Việc tích hợp sẵn những công cụ này không chỉ tiết kiệm thời gian phát triển mà còn đảm bảo ứng dụng của bạn có khả năng chống chịu tốt hơn, dễ dàng quản lý và bảo trì hơn khi đưa vào vận hành thực tế. Đây chính là sự khác biệt mà Spring Boot mang lại, giúp bạn tập trung vào logic nghiệp vụ thay vì loay hoay với các vấn đề hạ tầng.

Hưởng lợi từ hệ sinh thái Spring rộng lớn 

Lý do cuối cùng, nhưng không kém phần quan trọng, để chọn Spring Boot chính là việc bạn được hưởng lợi từ toàn bộ sức mạnh và sự trưởng thành của hệ sinh thái Spring rộng lớn:

  • Tích hợp liền mạch: Nó hoạt động hoàn hảo và tích hợp dễ dàng với các dự án Spring phổ biến khác như Spring Data (truy cập dữ liệu), Spring Security (bảo mật), Spring Cloud (phát triển microservices), Spring Batch (xử lý tác vụ hàng loạt), và nhiều hơn nữa.
  • Cộng đồng lớn mạnh và tài liệu phong phú: Với lịch sử phát triển lâu dài, Spring sở hữu một cộng đồng người dùng và nhà phát triển khổng lồ trên toàn thế giới. Do đó bạn có thể dễ dàng tìm thấy tài liệu hướng dẫn, ví dụ thực tế để học hỏi và tìm sự hỗ trợ khi gặp vấn đề.

Tóm lại, việc chọn Spring Boot đồng nghĩa với việc bạn chọn một lộ trình phát triển Java nhanh hơn, hiệu quả hơn, ít cấu hình hơn và được trang bị đầy đủ các công cụ cần thiết để xây dựng cũng như vận hành các ứng dụng hiện đại, từ những dự án nhỏ cho đến các hệ thống microservices phức tạp.

Đọc thêm: Spring Framework và hệ sinh thái vững chắc cho ứng dụng Java

Các khái niệm cốt lõi của Spring Boot

Để khai thác tối đa sức mạnh và sự linh hoạt của Spring Boot, việc nắm vững các khái niệm nền tảng là vô cùng quan trọng. Những khái niệm này là chìa khóa giúp bạn hiểu cách Spring Boot đơn giản hóa và tăng tốc quá trình phát triển ứng dụng Java.

Khái niệmĐịnh nghĩa Cách thức hoạt động
@SpringBootApplicationAnnotation “cửa ngõ” ở lớp chính của ứng dụng Spring Boot, kết hợp của @Configuration, @EnableAutoConfiguration, và @ComponentScan.Kết hợp đánh dấu lớp là nguồn cấu hình bean (@Configuration), kích hoạt tự động cấu hình (@EnableAutoConfiguration), và quét các component trong package (@ComponentScan).
Auto-configuration (Tự động cấu hình)Spring Boot tự động thiết lập ứng dụng dựa trên các thư viện (dependencies) bạn thêm vào.Spring Boot quét và tự tạo các thành phần cần thiết. Ví dụ: có thư viện database thì tự kết nối.
Starters (Các “gói khởi động”)Là các bộ dependency được đóng gói sẵn cho từng chức năng cụ thể (web, data, security…).Thêm một starter là tự động có đủ các thư viện liên quan, tương thích với nhau.
Spring Boot Actuator (Bộ tiện ích quản lý & giám sát)Cung cấp các công cụ sẵn có để theo dõi và quản lý ứng dụng khi đang chạy.Thêm Actuator sẽ có các đường dẫn (endpoint) để xem sức khỏe, thông số, môi trường của ứng dụng.
Externalized Configuration (Cấu hình bên ngoài)Cho phép tách biệt cấu hình ra khỏi code ứng dụng, giúp ứng dụng chạy trên nhiều môi trường khác nhau mà không cần sửa đổi code.Nạp cấu hình từ nhiều nguồn theo thứ tự ưu tiên (ví dụ: command-line, biến môi trường, file .properties bên ngoài/trong JAR). Phổ biến nhất là file application.properties hoặc .yml. Profiles cho phép cấu hình riêng theo môi trường (application-{profile}.properties).

@SpringBootApplication

Đây là một annotation “cửa ngõ” mà bạn sẽ thấy ở lớp chính (main class) của hầu hết mọi ứng dụng Spring Boot. Nó không phải là một phép màu đơn lẻ mà là sự kết hợp của ba annotation quan trọng khác:

  • @Configuration: Đánh dấu lớp này là một nguồn định nghĩa các bean (đối tượng được quản lý bởi Spring IoC container). Các phương thức được đánh dấu @Bean trong lớp này sẽ tạo ra các bean mà Spring sẽ quản lý.
  • @EnableAutoConfiguration: Kích hoạt cơ chế tự động cấu hình “thần kỳ” của Spring Boot. Spring Boot sẽ dựa vào các thư viện (JAR files) có trong classpath để đoán và tự động cấu hình những gì cần thiết cho ứng dụng của bạn.
  • @ComponentScan: Yêu cầu Spring quét các component (ví dụ: @Controller, @Service, @Repository, @Component) trong package hiện tại của lớp chứa annotation này và các package con của nó. Điều này cho phép Spring tự động phát hiện và đăng ký các bean mà bạn đã định nghĩa.

Auto-Configuration (Tự động cấu hình) 

Cơ chế tự động cấu hình là một trong những lý do chính khiến Spring Boot trở nên mạnh mẽ và dễ sử dụng. Cách hoạt động có thể được tóm tắt như sau:

Quét classpath: Khi ứng dụng khởi động, Spring Boot sẽ kiểm tra các thư viện (JAR files) mà bạn đã thêm vào dự án (thông qua Maven hoặc Gradle).

Áp dụng cấu hình có điều kiện: Dựa trên sự hiện diện (hoặc vắng mặt) của các lớp hoặc bean nhất định, Spring Boot sẽ quyết định có nên áp dụng một cấu hình cụ thể hay không. Việc này được thực hiện thông qua các annotation điều kiện như:

  • @ConditionalOnClass: Chỉ áp dụng cấu hình nếu một lớp cụ thể có mặt trong classpath. Ví dụ, nếu DataSource.class có mặt, Spring Boot sẽ cố gắng cấu hình một DataSource.
  • @ConditionalOnMissingBean: Chỉ tạo một bean nếu chưa có bean nào cùng kiểu được người dùng định nghĩa. Điều này cho phép bạn ghi đè cấu hình mặc định của Spring Boot một cách dễ dàng.
  • Và nhiều annotation @Conditional… khác (@ConditionalOnBean, @ConditionalOnProperty, v.v.) giúp Spring Boot đưa ra các quyết định cấu hình thông minh. 

Tóm lại, Spring Boot cố gắng “đoán” và thiết lập những cấu hình phổ biến nhất giúp bạn, nhưng vẫn cho phép bạn tùy chỉnh hoặc thay thế khi cần.

Starters (Các gói phụ thuộc khởi đầu)

Starters là một trong những ý tưởng tuyệt vời nhất của Spring Boot, giúp đơn giản hóa việc quản lý dependency (các thư viện phụ thuộc) một cách đáng kể.

Vai trò chính: Mỗi “starter” là một bộ mô tả dependency tiện lợi, bao gồm một tập hợp các dependency khác nhau thường được sử dụng cùng nhau cho một mục đích cụ thể. Thay vì phải khai báo hàng chục dependency riêng lẻ và lo lắng về phiên bản tương thích, bạn chỉ cần khai báo một starter.

Ví dụ các starters phổ biến:

  • spring-boot-starter-web: Dành cho việc xây dựng ứng dụng web, bao gồm RESTful APIs, sử dụng Spring MVC. Nó tự động mang theo Tomcat (máy chủ nhúng mặc định) và các thư viện cần thiết khác.
  • spring-boot-starter-data-jpa: Để làm việc với cơ sở dữ liệu quan hệ sử dụng JPA (Java Persistence API), thường đi kèm với Hibernate.
  • spring-boot-starter-security: Tích hợp Spring Security để bảo vệ ứng dụng của bạn.
  • spring-boot-starter-test: Cung cấp các thư viện cần thiết cho việc viết unit test và integration test (như JUnit, Mockito, Spring Test).
  • spring-boot-starter-actuator: Thêm các tính năng giám sát và quản lý ứng dụng. Việc sử dụng starters giúp file cấu hình build (ví dụ pom.xml của Maven) của bạn gọn gàng hơn và giảm thiểu nguy cơ xung đột phiên bản giữa các thư viện.

Spring Boot Actuator (Bộ tiện ích quản lý & giám sát)

Khi ứng dụng của bạn đã được triển khai và chạy trên môi trường production, việc giám sát và quản lý nó là vô cùng cần thiết. Spring Boot Actuator cung cấp các tính năng này “out-of-the-box”:

Các endpoint hữu ích: Actuator exposé (công khai) một loạt các endpoint HTTP (hoặc JMX) để bạn có thể kiểm tra tình trạng và tương tác với ứng dụng. Một số endpoint quan trọng bao gồm:

  • /actuator/health: Cung cấp thông tin về “sức khỏe” của ứng dụng (ví dụ: trạng thái kết nối cơ sở dữ liệu, dung lượng ổ đĩa).
  • /actuator/info: Hiển thị các thông tin tùy chỉnh về ứng dụng mà bạn có thể cấu hình.
  • /actuator/metrics: Cung cấp các chỉ số chi tiết về hiệu suất ứng dụng (ví dụ: bộ nhớ sử dụng, số lượng request, thời gian phản hồi).
  • /actuator/env: Liệt kê các thuộc tính cấu hình từ tất cả các nguồn môi trường.
  • /actuator/loggers: Cho phép xem và thay đổi mức độ log của ứng dụng một cách linh hoạt khi ứng dụng đang chạy.

Cách bật và cấu hình Actuator:

  • Để sử dụng, bạn chỉ cần thêm dependency spring-boot-starter-actuator vào file pom.xml (hoặc build.gradle).
  • Mặc định, không phải tất cả các endpoint đều được exposé qua HTTP vì lý do bảo mật. Bạn có thể cấu hình những endpoint nào được exposé và cách chúng được bảo vệ thông qua file application.properties (hoặc application.yml). Ví dụ, để exposé tất cả các endpoint (không khuyến khích cho môi trường production nếu không có bảo mật chặt chẽ):

Để chỉ exposé /health/info:

Externalized Configuration (Cấu hình bên ngoài)

Spring Boot cho phép bạn tách biệt cấu hình ra khỏi code ứng dụng, giúp ứng dụng của bạn có thể chạy trên nhiều môi trường khác nhau mà không cần sửa đổi code.

Thứ tự ưu tiên của các nguồn cấu hình: Spring Boot có một hệ thống phân cấp rõ ràng khi nạp cấu hình từ nhiều nguồn khác nhau. Các nguồn có độ ưu tiên cao hơn sẽ ghi đè lên các nguồn có độ ưu tiên thấp hơn. Theo tài liệu của Spring Boot (và Baeldung cũng đề cập), thứ tự ưu tiên (từ cao xuống thấp, một cách tổng quát) bao gồm:

  1. Tham số dòng lệnh (Command-line arguments).
  2. Thuộc tính hệ thống Java (Java System properties – System.getProperties()).
  3. Biến môi trường hệ điều hành (OS environment variables).
  4. Thuộc tính từ SPRING_APPLICATION_JSON (JSON nhúng trong biến môi trường hoặc thuộc tính hệ thống).
  5. Các file application-{profile}.properties (hoặc .yml) bên ngoài JAR của bạn (cho profile cụ thể).
  6. Các file application.properties (hoặc .yml) bên ngoài JAR của bạn (chung).
  7. Các file application-{profile}.properties (hoặc .yml) bên trong JAR của bạn (trong classpath, cho profile cụ thể).
  8. Các file application.properties (hoặc .yml) bên trong JAR của bạn (trong classpath, chung).
  9. Annotation @PropertySource trên các lớp @Configuration.
  10. Cấu hình mặc định (thông qua SpringApplication.setDefaultProperties).

Cách sử dụng application.properties / application.yml

Đây là cách phổ biến nhất để định nghĩa cấu hình. Bạn tạo file application.properties (dạng key=value) hoặc application.yml (dạng YAML) trong thư mục src/main/resources. Spring Boot sẽ tự động nạp các thuộc tính từ file này. 

Ví dụ trong application.properties

server.port=8081

spring.application.name=my-app

Sử dụng Profiles (application-{profile}.properties)

Profiles cho phép bạn định nghĩa các bộ cấu hình khác nhau cho các môi trường khác nhau (ví dụ: dev, test, prod). 

Bạn tạo các file cấu hình tương ứng, ví dụ: application-dev.properties, application-prod.properties.

Sau đó, bạn có thể kích hoạt một hoặc nhiều profile khi chạy ứng dụng, ví dụ bằng cách đặt thuộc tính spring.profiles.active=dev trong application.properties hoặc thông qua biến môi trường, tham số dòng lệnh.

Hướng dẫn xây dựng ứng dụng đầu tiên với Spring Boot

Lý thuyết là vậy, nhưng cách tốt nhất để hiểu Spring Boot chính là bắt tay vào xây dựng một ứng dụng thực tế. Trong phần này, chúng ta sẽ cùng nhau tạo một ứng dụng “Hello World” đơn giản với Spring Boot, sử dụng một REST Controller.

Chuẩn bị 

Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các công cụ cần thiết sau trên máy tính của mình:

1. Java Development Kit (JDK): Spring Boot 3.x yêu cầu JDK 17 trở lên. Bạn có thể tải JDK từ Oracle hoặc các nhà cung cấp OpenJDK khác như Adoptium.

Kiểm tra phiên bản Java của bạn bằng lệnh:

java -version

2. Công cụ xây dựng (Build Tool): Bạn cần một trong hai công cụ quản lý dependency và xây dựng dự án phổ biến là Maven hoặc Gradle. Hầu hết các IDE đã tích hợp sẵn hoặc bạn có thể cài đặt riêng.

Kiểm tra phiên bản Maven:

mvn -version

Kiểm tra phiên bản Gradle:

gradle -version

3. IDE (Integrated Development Environment): Một IDE tốt sẽ giúp quá trình code và quản lý dự án dễ dàng hơn. Các lựa chọn phổ biến bao gồm:

Sử dụng Spring Initializr (start.spring.io)

Cách nhanh nhất và dễ dàng nhất để tạo cấu trúc dự án Spring Boot là sử dụng Spring Initializr. Đây là một công cụ web do đội ngũ Spring cung cấp và cũng được tích hợp sẵn trong hầu hết các IDE hiện đại.

1. Truy cập: Mở trình duyệt và truy cập https://start.spring.io/

2. Cấu hình dự án:

  • Project: Chọn Maven Project (hoặc Gradle Project nếu bạn quen thuộc hơn). Chúng ta sẽ dùng Maven trong ví dụ này.
  • Language: Chọn Java.
  • Spring Boot: Chọn phiên bản ổn định mới nhất (tránh các phiên bản SNAPSHOT hoặc M nếu bạn muốn sự ổn định). Ví dụ: 3.3.0 (tại thời điểm viết bài).
  • Project Metadata:
    • Group: Thường là tên miền đảo ngược của tổ chức/cá nhân bạn (ví dụ: com.example).
    • Artifact: Tên dự án của bạn (ví dụ: my-first-app hoặc hello-springboot).
    • Name: Tên dự án (thường giống Artifact).
    • Description: Mô tả ngắn về dự án (ví dụ: Demo project for Spring Boot).
    • Package name: Tên package gốc cho code Java của bạn (ví dụ: com.example.demo).
    • Packaging: Chọn Jar (để chạy ứng dụng như một file JAR độc lập với máy chủ nhúng).
    • Java: Chọn phiên bản Java bạn đã cài đặt (ví dụ: 17).
  • Dependencies:
    • Nhấp vào nút “ADD DEPENDENCIES…”
    • Tìm và chọn Spring Web: Starter này cần thiết để xây dựng ứng dụng web, bao gồm các RESTful API và nó sẽ tự động thêm Apache Tomcat làm máy chủ nhúng mặc định.
    • (Tùy chọn) Tìm và chọn Lombok: Một thư viện tiện ích giúp giảm thiểu code boilerplate (ví dụ: getters, setters, constructors) bằng các annotation.

3. Tạo và tải dự án: Sau khi điền đầy đủ thông tin, nhấp vào nút “GENERATE”. Một file ZIP chứa cấu trúc dự án sẽ được tải về máy tính của bạn.

Import dự án vào IDE

  1. Giải nén file ZIP vừa tải về.
  2. Mở IDE của bạn và chọn “Open” hoặc “Import Project”, sau đó trỏ đến thư mục dự án vừa giải nén. IDE sẽ tự động nhận diện và tải các dependencies đã khai báo trong pom.xml (nếu dùng Maven).

Cấu trúc dự án

Sau khi import, bạn sẽ thấy cấu trúc thư mục cơ bản của một dự án Spring Boot như sau (ví dụ với Maven):

  • pom.xml (hoặc build.gradle): File định nghĩa dự án, quản lý các thư viện phụ thuộc (dependencies) và cách build dự án.
  • src/main/java: Chứa mã nguồn Java của ứng dụng.
  • MyFirstAppApplication.java (tên có thể khác tùy theo Artifact bạn đặt): Đây là lớp chính chứa phương thức main() và được đánh dấu bằng annotation @SpringBootApplication. Đây là điểm khởi đầu của ứng dụng.
  • src/main/resources: Chứa các tài nguyên như file cấu hình (application.properties), tài nguyên tĩnh, templates.
  • src/test/java: Chứa mã nguồn cho các bài kiểm thử (tests).

Tạo một REST Controller đơn giản

Bây giờ, chúng ta sẽ tạo một API endpoint đơn giản trả về một lời chào.

  • Tạo package controller: Trong src/main/java/com/example/demo (hoặc package gốc của bạn), tạo một package mới tên là controller.
  • Tạo class HelloController: Trong package controller vừa tạo, tạo một class Java mới tên là HelloController.java.
  • Viết code cho HelloController: Mở file HelloController.java và thêm đoạn code sau:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // Đánh dấu đây là một REST controller
public class HelloController {

    @GetMapping("/hello") // Ánh xạ HTTP GET request đến "/hello"
    public String sayHello() {
        return "Hello, World RESTful with Spring Boot!";
    }
}

Trong đó:

  • @RestController: Kết hợp @Controller@ResponseBody, báo hiệu rằng các giá trị trả về từ phương thức sẽ được ghi trực tiếp vào HTTP response body.
  • @GetMapping("/hello"): Ánh xạ các HTTP GET request đến đường dẫn /hello vào phương thức sayHello().

Chạy ứng dụng

Chạy từ IDE:

  • Mở file MyFirstAppApplication.java.
  • Nhấp chuột phải và chọn "Run 'MyFirstAppApplication.main()'".

Chạy bằng Maven (trong terminal): ./mvnw spring-boot:run

Chạy bằng Gradle (trong terminal): ./gradlew bootRun

Khi ứng dụng khởi động thành công, bạn sẽ thấy log output tương tự:

Tomcat started on port(s): 8080 (http) with context path 

Kiểm tra

  • Mở trình duyệt web và truy cập: http://localhost:8080/hello
  • Hoặc sử dụng curl trong terminal: curl http://localhost:8080/hello

Bạn sẽ thấy kết quả: Hello, World RESTful with Spring Boot!

Hệ sinh thái Spring 

Spring Boot không chỉ là một framework độc lập mà còn là một phần của một hệ sinh thái Spring rộng lớn hơn. Việc tích hợp dễ dàng với các dự án Spring khác giúp mở rộng đáng kể khả năng của ứng dụng Spring Boot. Dưới đây là một số dự án liên quan thường được sử dụng:

Spring Data

  • Mục đích: Đơn giản hóa việc truy cập và tương tác với các kho dữ liệu khác nhau.
  • Tính năng nổi bật: Cung cấp một mô hình lập trình nhất quán để truy cập dữ liệu từ các nguồn khác nhau như cơ sở dữ liệu quan hệ (sử dụng JPA với Hibernate), cơ sở dữ liệu NoSQL (MongoDB, Cassandra), các kho lưu trữ key-value (Redis),…
  • Lợi ích: Giảm thiểu code boilerplate cho các thao tác CRUD (Create, Read, Update, Delete) thông qua các Repository interface.
  • Ví dụ Starter: spring-boot-starter-data-jpa, spring-boot-starter-data-mongodb, spring-boot-starter-data-redis.

Spring Security

  • Mục đích: Cung cấp các giải pháp toàn diện về bảo mật cho ứng dụng Java.
  • Tính năng nổi bật: Hỗ trợ xác thực (authentication – ai là người dùng?) và phân quyền (authorization – người dùng được làm gì?). Cung cấp các cơ chế bảo vệ chống lại các tấn công phổ biến như CSRF, Session Fixation. Tích hợp dễ dàng với OAuth2, JWT, LDAP và nhiều cơ chế xác thực khác.
  • Lợi ích: Giúp xây dựng các ứng dụng an toàn và bảo mật một cách mạnh mẽ và linh hoạt.
  • Ví dụ Starter: spring-boot-starter-security.

Spring Cloud

Mục đích: Cung cấp các công cụ và framework để xây dựng các ứng dụng phân tán và kiến trúc microservices trên nền tảng đám mây.

Tính năng nổi bật:

  • Service Discovery (ví dụ: Netflix Eureka, Consul): Cho phép các microservice tự động tìm thấy và giao tiếp với nhau.
  • Configuration Server (ví dụ: Spring Cloud Config): Quản lý cấu hình tập trung cho các microservice.
  • Circuit Breaker (ví dụ: Resilience4j, trước đây là Netflix Hystrix): Tăng khả năng chịu lỗi của hệ thống bằng cách ngăn chặn các lỗi lan truyền.
  • API Gateway (ví dụ: Spring Cloud Gateway): Cung cấp một điểm vào duy nhất cho tất cả các request đến hệ thống microservices.
  • Load Balancing (ví dụ: Spring Cloud LoadBalancer, trước đây là Netflix Ribbon): Phân phối tải giữa các instance của microservice.

Lợi ích: Đơn giản hóa việc phát triển và triển khai các hệ thống microservices phức tạp, có khả năng mở rộng và chịu lỗi cao.

Ví dụ Starter: Các starters riêng cho từng module của Spring Cloud (ví dụ: spring-cloud-starter-netflix-eureka-client, spring-cloud-starter-config-client, spring-cloud-starter-gateway).

Spring WebFlux

  • Mục đích: Hỗ trợ phát triển các ứng dụng web phản ứng (reactive), không chặn (non-blocking), có khả năng xử lý đồng thời cao với tài nguyên hệ thống hiệu quả.
  • Tính năng nổi bật: Sử dụng mô hình lập trình reactive dựa trên Project Reactor (Flux và Mono) để xử lý các luồng dữ liệu bất đồng bộ. Phù hợp cho các ứng dụng cần thông lượng cao, độ trễ thấp, và các ứng dụng streaming.
  • Lợi ích: Xây dựng các ứng dụng có khả năng mở rộng tốt hơn và phản hồi nhanh hơn, đặc biệt trong các kịch bản có nhiều I/O bound operations.
  • Ví dụ Starter: spring-boot-starter-webflux.

Thymeleaf / Apache Freemarker (Template Engines)

Mục đích: Dành cho việc render giao diện người dùng phía máy chủ (server-side rendering).

Tính năng nổi bật:

  • Thymeleaf: Một template engine hiện đại cho Java, cho phép tạo các template HTML tự nhiên (có thể mở trực tiếp trên trình duyệt mà không bị lỗi). Tích hợp tốt với Spring MVC.
  • Freemarker: Một template engine mạnh mẽ và linh hoạt khác, cũng được sử dụng rộng rãi.

Lợi ích: Cho phép xây dựng các trang web động nơi HTML được tạo ra trên server trước khi gửi về trình duyệt.

Ví dụ Starter: spring-boot-starter-thymeleaf, spring-boot-starter-freemarker.

Tóm lại: Việc hiểu và biết cách kết hợp các dự án này trong hệ sinh thái Spring Boot sẽ giúp bạn xây dựng được những ứng dụng Java mạnh mẽ, linh hoạt và đáp ứng được các yêu cầu đa dạng của các dự án hiện đại.

Các câu hỏi thường gặp về Spring Boot

“Fat JAR” (hoặc “Executable JAR”) trong Spring Boot là gì?

Khi bạn đóng gói một ứng dụng Spring Boot (thường là với spring-boot-maven-plugin hoặc spring-boot-gradle-plugin), nó sẽ tạo ra một file JAR “béo” (fat JAR).

File JAR này chứa tất cả các dependencies cần thiết của ứng dụng (bao gồm cả máy chủ nhúng như Tomcat) để ứng dụng có thể chạy độc lập bằng lệnh java -jar ten-ung-dung.jar mà không cần cài đặt máy chủ bên ngoài.

Làm thế nào để loại trừ một Auto-Configuration cụ thể?

Bạn có thể loại trừ một lớp Auto-Configuration cụ thể bằng cách sử dụng thuộc tính exclude của annotation @SpringBootApplication (hoặc @EnableAutoConfiguration).

Ví dụ:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    // ...
}

Spring Initializr là gì và tại sao tôi nên sử dụng nó?

Spring Initializr là một công cụ web (và cũng được tích hợp trong nhiều IDE) giúp bạn nhanh chóng tạo cấu trúc dự án Spring Boot ban đầu. Bạn nên sử dụng Spring Initializr vì nó giúp:

  • Chọn phiên bản Spring Boot, ngôn ngữ (Java, Kotlin, Groovy), công cụ build (Maven/Gradle).
  • Dễ dàng thêm các “starter” dependencies cần thiết cho dự án.
  • Tạo ra một dự án với cấu trúc chuẩn, sẵn sàng để import vào IDE và bắt đầu code.
  • Tiết kiệm thời gian thiết lập ban đầu và giảm thiểu lỗi cấu hình.

Tôi có thể tạo dự án Spring Boot mà không cần Spring Initializr không?

Có, bạn hoàn toàn có thể. Bạn có thể tự tạo file pom.xml hoặc build.gradle, khai báo các dependencies cần thiết và cấu trúc thư mục thủ công. Tuy nhiên, việc này tốn thời gian hơn, dễ xảy ra lỗi và không được khuyến khích, đặc biệt là đối với người mới bắt đầu. Spring Initializr giúp chuẩn hóa và đơn giản hóa quá trình này.

“Dependencies” trong Spring Initializr là gì?

“Dependencies” trong Spring Initializr chính là các Spring Boot Starters hoặc các thư viện khác mà bạn muốn thêm vào dự án của mình. Ví dụ, nếu bạn muốn xây dựng ứng dụng web, bạn sẽ thêm dependency “Spring Web”.

Nếu muốn làm việc với cơ sở dữ liệu JPA, bạn thêm “Spring Data JPA”. Spring Initializr sẽ tự động thêm các khai báo cần thiết vào file pom.xml (Maven) hoặc build.gradle (Gradle) của bạn.

Tổng kết

Spring Boot đã cách mạng hóa cách chúng ta phát triển ứng dụng Java bằng cách loại bỏ phần lớn cấu hình boilerplate và cung cấp một cách tiếp cận “có quan điểm” để xây dựng các ứng dụng độc lập, sẵn sàng cho production. Với các tính năng mạnh mẽ như tự động cấu hình, starter dependencies, máy chủ nhúng và Actuator, Spring Boot giúp lập trình viên tập trung vào việc viết business logic, từ đó tăng tốc độ phát triển và nâng cao năng suất.

Qua hướng dẫn này, bạn đã làm quen với các khái niệm cốt lõi, cách xây dựng một ứng dụng đơn giản và hiểu được vị trí của Spring Boot trong hệ sinh thái Spring rộng lớn. Đây chỉ là bước khởi đầu. Spring Boot còn rất nhiều tiềm năng để bạn khám phá và ứng dụng vào các dự án phức tạp hơn, từ các ứng dụng web truyền thống đến các hệ thống microservices hiện đại.

Đọc thêm: Spring Java là gì: Hướng dẫn chi tiết cách bắt đầu với Spring

TÁC GIẢ
Tien Tran
Tien Tran

iOS Developer

Có 4 năm kinh nghiệm trong lĩnh vực phát triển ứng dụng mobile, được chứng minh qua lịch sử làm việc ở các công ty lớn (VCCorp, KiotViet, Vega Fintech). Với đam mê tìm hiểu, nghiên cứu những kiến thức chuyên môn cần có của một lập trình viên mobile hiện nay như Swift, Objective C, Flutter, Kotlin,... Tiến mong muốn chia sẻ kinh nghiệm làm việc và truyền cảm hứng cho mọi người muốn theo đuổi con đường trở thành một nhà phát triển ứng dụng di động chuyên nghiệp trong tương lai.