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.

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-weblà 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.jarlà 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.
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
/hellonhư 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=8081vàoapplication.propertiesrồ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!
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.


