Spring Boot/Module 02 — Spring Boot Foundations: tổng quan
~10 phútSpring Boot FoundationsMiễn phí lượt xem

Module 02 — Spring Boot Foundations: tổng quan

Học gì, vì sao học, học xong làm được gì. 5 trụ cột Boot, auto-configuration bóc tách, externalized config, profiles, logging — nền tảng để làm chủ mọi 'magic' Spring Boot ở mức bytecode.

TL;DR: Module 02 bóc tách magic của Spring Boot — từ 5 trụ cột ra đời năm 2014, cách starter dependencies kéo 200 thư viện tương thích version, đến chuỗi sự kiện AutoConfigurationImportSelector đọc classpath rồi register bean theo điều kiện. Bạn sẽ hiểu 17 PropertySource ưu tiên, viết @ConfigurationProperties record type-safe cho K8s env var, bật đúng profile theo môi trường, và design logging stack JSON cho ELK mà không cần restart app. Sau 4 giờ học, "Spring Boot magic" không còn là hộp đen — mọi thứ đều là Java code bạn đọc được.

Vì sao module này tồn tại

Bạn tạo project Spring Boot mới từ start.spring.io, thêm spring-boot-starter-data-jpa vào pom.xml, set spring.datasource.url trong application.yml — rồi EntityManagerFactory xuất hiện trong container như phép thuật. Bạn không viết dòng config nào cho Hibernate, không khai báo DataSource bean, không setup JpaTransactionManager. Câu hỏi đặt ra: ai làm việc đó và làm như thế nào?

Câu trả lời nằm trong DataSourceAutoConfiguration.java — một class Java 80 dòng với annotation @ConditionalOnClass@ConditionalOnMissingBean. Hiểu class này là hiểu cả hệ thống auto-configuration của Boot. Thế nhưng phần lớn dev dùng Spring Boot 3-5 năm mà chưa bao giờ mở file đó ra đọc — và kết quả là mỗi lần bean không tạo, mỗi lần config không có effect, họ mất hàng giờ loay hoay thay vì 5 phút tra /actuator/conditions.

Module này dạy bạn đọc xuyên thấu hộp đen. Sau module, mỗi lần thấy log Tomcat initialized with port 8080, bạn biết đó là bước 9 trong refresh() — và mỗi lần thấy @ConditionalOnMissingBean, bạn biết đó là cơ chế Boot rút lui để nhường chỗ cho override của bạn. Không còn workaround mù — chỉ còn debug có chủ đích.

Sau module này bạn sẽ

  • Explain 5 trụ cột Spring Boot và vì sao Boot ra đời năm 2014 để xoá boilerplate Spring 4
  • Trace chuỗi sự kiện từ classpath đến bean khi thêm 1 starter — bóc AutoConfigurationImportSelector, file AutoConfiguration.imports, và 12 @ConditionalOn* family
  • Diagnose tại sao 1 autoconfig bean không được tạo bằng /actuator/conditions trong dưới 5 phút
  • Implement type-safe configuration binding với @ConfigurationProperties record + @Validated + relax binding cho K8s env var
  • Choose đúng profile layout (single file vs group vs multi-document YAML) cho multi-environment deployment với DRY
  • Design logging stack cho production: structured JSON (Boot 3.4 ECS) + MDC correlation ID + dynamic log level qua Actuator mà không restart app

Lộ trình module

Bài 01 đặt bức tranh lớn: Spring Boot không phải framework mới mà là 5 lớp đóng gói trên Spring Framework. Bạn sẽ thấy toàn bộ boilerplate Spring 4 (web.xml, applicationContext.xml, Tomcat external, log4j.xml) được thay thế bởi 18 dòng code. Bạn cũng hiểu SpringApplication.run() làm 14 bước trước khi context ready — và bước 12 chính là 12 bước refresh() đã học ở Module 01 bài 03.

Bài 02 bóc starter dependencies đến tận cùng: mở jar spring-boot-starter-web-3.4.0.jar ra thấy không có class nào — chỉ có pom.xml liệt kê transitive deps. Bạn học cách BOM spring-boot-dependencies quản version 200+ thư viện, sự khác biệt giữa spring-boot-starter-parentimport scope, và cách tự viết starter custom cho team enterprise.

Bài 03 là bài quan trọng nhất module — bóc auto-configuration đến mức bytecode. Bạn theo dõi AutoConfigurationImportSelector đọc file AutoConfiguration.imports từ mọi jar, hiểu 12 family annotation @ConditionalOn*, thứ tự @AutoConfigureBefore/After, và cách Boot dùng ASM bytecode reader thay Class.forName() để tối ưu startup. Sau bài này, /actuator/conditions trở thành tool debug đầu tiên bạn mở — không phải last resort.

Bài 04 bóc externalized configuration: 17 PropertySource theo ưu tiên, 2 format file, @Value vs @ConfigurationProperties, records type-safe, relax binding cho K8s UPPER_SNAKE_CASE env var. Bạn học pattern production: non-secret trong git, secret qua K8s Secret hoặc Vault.

Bài 05 đào sâu profiles — không chỉ override property file mà còn toggle bean theo môi trường. @Profile trên @Bean, @Component, @Configuration; profile expression !, |, &; profile groups Boot 2.4+ gom logic thành DRY; multi-document YAML.

Bài 06 bóc logging stack: SLF4J facade + Logback implementation + bridge libs cho JUL/Log4j legacy. Structured logging JSON Boot 3.4 GA, MDC correlation ID cho distributed trace, dynamic log level runtime qua /actuator/loggers POST.

Bài 07 mini-challenge tổng hợp: bạn build 1 Boot app nhỏ, instrument logging để trace toàn bộ vòng đời từ main() → bean instantiate → HTTP request → response. Output là sequence diagram thực tế từ log.

Bài 08 cuối module là tổng kết: cheat sheet, glossary, pitfall tổng hợp code sai/đúng, self-assessment outcomes.

Yêu cầu trước khi bắt đầu

  • Spring Core: đã hoàn thành Module 01 — Spring Core — hiểu IoC container, bean lifecycle, ApplicationContext.refresh() 12 bước, và BeanPostProcessor. Module 02 build trực tiếp trên nền đó.
  • Java 17+ records: biết cú pháp record Foo(String bar) {} — dùng trong @ConfigurationProperties type-safe binding.
  • Maven cơ bản: biết pom.xml, mvn package, dependency:tree — bài 02 bóc sâu BOM và transitive dependency.
  • JDK 21: cài sẵn. Boot 3.4 yêu cầu tối thiểu Java 17; khoá khuyến nghị 21 cho Virtual Threads.
  • IDE: IntelliJ IDEA Community hoặc VS Code + Extension Pack for Java.

Time budget

BàiPhút
00 — Tổng quan (đang đọc)10
01 — Spring Boot giải quyết gì25
02 — Starter dependencies25
03 — Auto-configuration deep dive28
04 — Externalized configuration26
05 — Profiles22
06 — Logging24
07 — Mini-challenge: trace request30
08 — Tổng kết15
Tổng~3.5h đọc + 0.5h lab + buffer = 4h

Khuyến nghị: chia làm 3 ngồi thay vì 1 ngồi 4 giờ liền:

  • Ngồi 1 (~1.5h): bài 00 → 02 (orient + 5 trụ cột + starter/BOM anatomy).
  • Ngồi 2 (~1.5h): bài 03 → 05 (auto-config deep dive + externalized config + profiles).
  • Ngồi 3 (~1.5h): bài 06 (logging) + bài 07 (lab) + bài 08 (recap). Lab cần 1 ngồi liên tục 30 phút — không nên ngắt giữa.

Cách học module này hiệu quả

  1. Mở source code autoconfig khi đọc bài 03. Tìm DataSourceAutoConfiguration trên GitHub Spring Boot. Đọc 80 dòng, chú ý @ConditionalOnClass, @ConditionalOnMissingBean. Sau đó mọi autoconfig khác "click" — tất cả follow cùng pattern. Passive reading chỉ cho bạn biết "annotation này có tồn tại"; đọc code cho bạn biết vì sao.

  2. Sau bài 04, thử override bằng env var. Set SPRING_DATASOURCE_URL=jdbc:postgresql://custom/db trước khi chạy app — kiểm tra relax binding có work không. Thực hành 5 phút này khắc sâu hơn 30 phút đọc lý thuyết về relax binding.

  3. Bài 03 + 05 cần /actuator/conditions/actuator/env. Bật endpoint này trong application.yml ngay từ đầu (management.endpoints.web.exposure.include: '*'). Mỗi bài concept, sau khi đọc, mở browser curl endpoint để thấy state thực tế.

  4. Mini-challenge bài 07 là core của module. Đừng xem gợi ý trước 20 phút tự code. BeanPostProcessor log bean instantiate và LoggingFilter MDC là 2 pattern bạn sẽ dùng lại trong production. Lab không phải "exercise" — là template thực dụng.

  5. Sau bài 08, kiểm tra 6 outcomes trong _meta.json. Với mỗi outcome, tự hỏi: "Tôi có thể giải thích không cần nhìn tài liệu không?" Nếu chưa tự tin outcome nào, quay lại bài tương ứng trước khi vào Module 03 (Web Layer). Module 03 assume bạn đã hiểu auto-config và externalized config ở mức bài 03-04.

Bài này có giúp bạn hiểu bản chất không?