Module 01 — Spring Core: tổng quan
Học gì, vì sao học, học xong làm được gì. IoC container, DI, ApplicationContext, bean lifecycle — nền tảng của mọi thứ trong Spring.
TL;DR: Module 01 là nền tảng — bóc tách trái tim Spring là IoC container, không phải web/data/security. Bạn sẽ hiểu Spring không phải magic mà chỉ là reflection + topological sort + lifecycle callback, qua 6 concept lessons + 1 lab build mini IoC + 1 recap. Sau module, bạn implement được 1 mini IoC container 80 dòng từ scratch và biết chính xác Spring làm gì khi gặp @Autowired, @Component, @PostConstruct, @Transactional — điều kiện cần để debug bug bean injection, lifecycle order, và self-call proxy bypass mà không hoang mang. Pitfall lớn nhất bạn sẽ tránh được: @Autowired field NULL trong constructor, circular dependency qua field injection, @PreDestroy không chạy với prototype scope.
Vì sao module này tồn tại
Bạn debug 1 app Spring và thấy @Autowired Foo foo ra null trong constructor. Bạn google, ai cũng nói "field injection bị thế đó", nhưng vì sao thì không ai giải thích cụ thể. Bạn đọc org.springframework.beans.factory.annotation.Autowired Javadoc — chỉ thấy syntax. Bug fix bằng workaround, nhưng tuần sau bạn gặp BeanCurrentlyInCreationException — lại google, lại workaround.
Module này dạy bạn dừng workaround. Hiểu cơ chế bên dưới @Autowired, @Component, @PostConstruct, @Transactional — bạn debug bug Spring nhanh hơn và đọc reference docs đúng chỗ.
Sau module này bạn sẽ
- Explain vì sao Spring tồn tại bằng cách so sánh với Java EE/EJB 2.x trên 3 chiều: vendor lock-in, testability, boilerplate
- Compare 3 hình thức DI (constructor/setter/field) và justify constructor injection với 4 lý do cụ thể
- Diagnose circular dependency và áp dụng đúng 1 trong 3 fix: refactor /
@Lazy/ObjectProvider - Implement IoC container 80 dòng từ scratch: scan
@Component, topological sort, constructor injection,@PostConstructcallback - Predict đúng output của lifecycle order (instantiate → populate →
@PostConstruct→ BPP → ready) - Choose giữa
@Configurationfull-mode CGLIB và lite-mode dựa trên tradeoff cụ thể
Lộ trình module
Bài 01 mở đầu bằng câu hỏi vì sao Spring vẫn dominate năm 2026 — bạn sẽ thấy Spring không phải framework, mà là 5 thứ đóng gói (Framework + Starter + AutoConfig + Embedded server + Actuator). Bài 02 đi vào trái tim: IoC là principle, DI là 1 implementation — phân biệt rõ giúp bạn không "lạm dụng thuật ngữ" như đa số senior. Bài 03 mở ApplicationContext ra: container thực ra chỉ là BeanFactory extend với i18n, event, environment — và refresh() là 12 bước có thứ tự cố định.
Bài 04 và 05 đào sâu nội tại bean: 9 giai đoạn lifecycle (instantiate → populate → init → ready → destroy) và 4 scope (singleton / prototype / request / session). Đây là chỗ pitfall classic xảy ra: @Autowired field trong constructor (null), self-call @Transactional (không qua proxy), @PreDestroy trên prototype (không chạy). Bài 06 chốt 3 cách khai báo bean (@Component / @Bean / @Configuration) — bạn sẽ hiểu vì sao Boot 2.0+ ép CGLIB cho @Configuration full-mode.
Bài 07 là mini-challenge: tự code 1 IoC container 80 dòng. Đây là moment "aha" — Spring không phải magic. Bài 08 cuối module là tổng kết: cheat sheet, glossary, pitfall tổng hợp, self-assessment outcome — 1 trang bookmark cho bạn quay lại sau này.
Yêu cầu trước khi bắt đầu
- Java cơ bản: đã hoàn thành Module 1 — Nhập môn và Module 5 — OOP cơ bản.
- Java OOP nâng cao: đã quen interface, abstract class, generics — xem Module 6 — Kế thừa và đa hình.
- Maven hoặc Gradle: biết cách
mvn packagera jar. (Module 02 sẽ đi sâu hơn.) - JDK 21: cài đặt sẵn (Spring 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 / Ultimate, hoặc VS Code + Extension Pack for Java.
Time budget
| Bài | Phút |
|---|---|
| 00 — Tổng quan (đang đọc) | 10 |
| 01 — Spring là gì | 30 |
| 02 — IoC và DI | 28 |
| 03 — ApplicationContext | 25 |
| 04 — Bean lifecycle | 26 |
| 05 — Bean scopes | 24 |
06 — @Configuration, @Bean, @Component | 25 |
| 07 — Mini-challenge: build mini IoC | 30 |
| 08 — Tổng kết | 15 |
| Tổng | ~3.5h đọc + 0.5h lab + buffer = 6h |
Khuyến nghị: chia làm 3 ngồi thay vì 1 ngồi 6 giờ liền:
- Ngồi 1 (~2h): bài 00 → 02 (orient + nền tảng IoC/DI).
- Ngồi 2 (~2h): bài 03 → 06 (container nội tại + lifecycle + scope + bean declaration).
- Ngồi 3 (~2h): bài 07 (lab) + bài 08 (recap). Lab cần 1 ngồi liên tục 30-60 phút để code, không nên ngắt giữa.
Cách học module này hiệu quả
- Đừng skip section "Bài toán cốt lõi" của bài 01-02. Đó không phải fluff — là frame để hiểu mọi annotation Spring. Nhảy thẳng vào
@Autowiredmà không hiểu vấn đề nó giải = học vẹt. - Khi bài 02 nói "constructor injection được khuyến nghị", hãy thử ngược. Viết 1 service với field injection, test bằng
new Service()plain — bạn sẽ thấy NPE rồi mới nhớ được lý do. Active retrieval > passive reading. - Bài 04 (lifecycle) yêu cầu bạn predict output trước khi đọc giải thích. SelfCheck Q1 in
nullrồi in instance — đoán trước, sau đó verify. Đây là kỹ thuật học tốt nhất. - Mini-challenge bài 07 là core. Đừng đọc lời giải trước. Code 30 phút, kẹt thì xem gợi ý (callout). Lời giải chỉ xem cuối, đối chiếu với code của bạn. Bạn sẽ học gấp 5 lần.
- Sau bài 08, mở lại
_meta.jsoncủa module này (đường dẫncontent/courses/spring/01-spring-core/_meta.json) — đọc 6 outcomes. Nếu chưa tự tin từng outcome, quay lại bài tương ứng trước khi vào Module 02.
Bài này có giúp bạn hiểu bản chất không?