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 180 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 starterauto-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.exampleArtifact: demoJava: 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à beanApplicationContext 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 Spring — Ngày 14: Bean Validation — @Valid & bộ constraint chuẩn

Ngày 14 của 99 Ngày Spring: Bean Validation khai báo luật ngay trên DTO — @Valid kích hoạt, bộ constraint chuẩn (@NotBlank vs @NotEmpty vs @NotNull, @Size, @Email, @Min/@Max), bẫy int vs Integer, validate object lồng nhau không tự lan, và lỗi 400 gom một lượt.

10 thg 8, 20265 phút0
99 Ngày Java — Ngày 14: Kế thừa (Inheritance)

Ngày 14 của 99 Ngày Java: extends trao gia tài từ lớp cha, override với @Override và super., thứ tự khai sinh cha trước con sau qua super(...), protected trả nợ Ngày 13, và phép thử is-a vs has-a — khi nào nên composition thay vì kế thừa.

10 thg 8, 20266 phút0
99 Ngày Spring — Ngày 13: @RequestBody & DTO — đừng công khai entity ra API

Ngày 13 của 99 Ngày Spring: @RequestBody + Jackson deserialize JSON thành object, DTO là hợp đồng API — chặn lỗ hổng mass assignment chiều vào và rò rỉ dữ liệu chiều ra, request/response DTO khác nhau là bình thường, và Jackson annotations tinh chỉnh hợp đồng JSON.

9 thg 8, 20266 phút9