Backend

99 Ngày Spring — Ngày 02: Spring Boot & project đầu tiên

SSite Admin
30 tháng 07, 2026 4 phút đọc 297 lượt xem
99 Ngày Spring — Ngày 02: Spring Boot & project đầu tiên

Hôm qua bạn đã hiểu IoC và DI — trái tim của Spring. Hôm nay chúng ta bắt tay vào thực hành: dùng Spring Initializr tạo project Spring Boot đầu tiên, hiểu starter và auto-configuration là gì, rồi chạy ứng dụng web đầu tiên của series trong chưa đầy 10 phút.

Sketchnote Ngày 02: Spring Boot và project đầu tiên

Spring Boot khác gì Spring?

Spring Framework cho bạn IoC container và cả hệ sinh thái — nhưng thời kỳ đầu, dựng một project Spring đồng nghĩa với cấu hình rất nhiều thứ: khai báo bean, cài server, nối các thư viện đúng phiên bản. Spring Boot (2014) ra đời để xóa sạch phần cực nhọc đó với ba vũ khí:

  • Starter — gói dependency đóng sẵn theo nhu cầu: khai một dòng spring-boot-starter-web là có đủ Spring MVC, Jackson, Tomcat với phiên bản đã được kiểm chứng khớp nhau.

  • Auto-configuration — Boot nhìn vào classpath và tự cấu hình: thấy Tomcat thì dựng web server, thấy driver PostgreSQL thì chuẩn bị DataSource.

  • Embedded server — Tomcat nằm ngay trong ứng dụng; chạy java -jar app.jar là xong, không cần cài server ngoài.

Triết lý chung: convention over configuration — Boot chọn sẵn phương án hợp lý, bạn chỉ cấu hình khi muốn khác đi.

Tạo project với Spring Initializr

Mở start.spring.io — cỗ máy sinh project chính chủ của Spring — và chọn:

  • Project: Maven — Language: Java — Spring Boot: bản 3.x mới nhất (không chọn SNAPSHOT).

  • Group: com.example — Artifact: demo — Java: 21.

  • Dependencies: bấm ADD và chọn Spring Web — đủ cho hôm nay.

Bấm GENERATE, giải nén file zip và mở bằng IntelliJ hoặc VS Code. Trong IntelliJ, chọn đúng JDK 21 ở Project Structure là mọi dấu đỏ biến mất.

Starter — một dòng, cả bộ đồ nghề

Mở pom.xml, bạn sẽ thấy dependency web chỉ vỏn vẹn:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Không cần số phiên bản — parent spring-boot-starter-parent đã quản lý tất cả để mọi thư viện khớp nhau. Đây là lý do project Spring Boot hiếm khi gặp "dependency hell" như thời cấu hình tay.

@SpringBootApplication và auto-configuration

File Java duy nhất được sinh sẵn là main class:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication thực chất là ba annotation gộp một:

  • @Configuration — class này có thể khai báo bean (học kỹ ngày 06).

  • @ComponentScan — quét package hiện tại trở xuống để tìm bean (ngày 05).

  • @EnableAutoConfiguration — bật cơ chế Boot tự cấu hình theo classpath (ngày 10 ta sẽ mổ xẻ cách nó hoạt động).

Còn SpringApplication.run(...) chính là lệnh khởi động IoC container bạn học hôm qua: tạo ApplicationContext, đăng ký bean, rồi bật embedded Tomcat.

Bệ phóng — Spring Boot đưa ứng dụng cất cánh trong vài giây

Chạy ứng dụng

$ ./mvnw spring-boot:run
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.2)

... Tomcat started on port 8080 (http) ...
... Started DemoApplication in 1.8 seconds ...

Dòng log đáng giá nhất: Tomcat started on port 8080. Ứng dụng web của bạn đang sống! Mở http://localhost:8080 sẽ thấy trang lỗi Whitelabel — hoàn toàn bình thường, vì ta chưa khai báo endpoint nào. Thêm nhanh một endpoint để chào sân:

@RestController
public class HelloController {
    @GetMapping("/hello")
    String hello() {
        return "Xin chào từ Spring Boot!";
    }
}

Restart, mở http://localhost:8080/hello — và đó, dòng chữ đầu tiên do Spring Boot của bạn phục vụ. REST controller sẽ được học bài bản từ ngày 11; hôm nay chỉ cần nếm thử vị chiến thắng.

Bài tập nhỏ

  • Tự tạo project trên start.spring.io với Java 21 + Spring Web, chạy được Tomcat started on port 8080.

  • Thêm endpoint /hello như trên và đổi thông điệp thành tên của bạn.

  • Đổi port bằng cách thêm server.port=8081 vào application.properties rồi restart — bạn vừa chạm vào externalized configuration (ngày 08).

Kết luận

Bạn đã tạo và chạy ứng dụng Spring Boot đầu tiên, hiểu starter gói dependency thế nào, auto-configuration đoán ý bạn ra sao, và @SpringBootApplication che giấu những gì. Ngày 03, chúng ta đào sâu vào IoC container và bean — ApplicationContext thực sự chứa gì bên trong? Hẹn gặp lại!

S

Site Admin

Engineer and writer. Building things with TypeScript and distributed systems.

Bình luận (0)

Bạn cần đăng nhập bằng Google để bình luận.

Hãy là người bình luận đầu tiên.

Bài viết liên quan

99 Ngày Java — Ngày 58: Optional

Optional là công cụ cho kiểu trả về — không field, không tham số, không bọc collection; chuỗi map/flatMap/filter thay kim tự tháp if; orElse luôn tính tham số còn orElseGet lười, orElseThrow cho “không có là lỗi” — và các anti-pattern isPresent + get, orElse(null).

23 thg 9, 20269 phút9
99 Ngày Spring — Ngày 58: Spring Boot Actuator

Boot 3 mặc định chỉ lộ health; bản đồ endpoint an toàn và nguy hiểm; HealthIndicator tự viết với liveness tách khỏi readiness cho Kubernetes, info từ build và git, metrics Micrometer với tag hữu hạn — và ba lớp khóa: cổng riêng, SecurityFilterChain với EndpointRequest, exclude env/heapdump/threaddump.

23 thg 9, 202610 phút5
So sánh EasyExcel và Apache Fesod: khác biệt thật nằm ở đâu?

Fesod là hậu duệ của EasyExcel, cùng engine SAX/SXSSF. Khác biệt kiểm chứng được: vòng đời dự án, POI 5.2.5 vs 5.5.1, các API mới (numRows, csv(), headerMergeStrategy) và độ bền với file xấu — không phải hiệu năng gấp nhiều lần.

23 thg 9, 20268 phút1