Spring Boot/Module 01 — Spring Core: tổng quan
~10 phútSpring là gì & nền tảng IoCMiễn phí lượt xem

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, @PostConstruct callback
  • Predict đúng output của lifecycle order (instantiate → populate → @PostConstruct → BPP → ready)
  • Choose giữa @Configuration full-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ônModule 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 package ra 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àiPhút
00 — Tổng quan (đang đọc)10
01 — Spring là gì30
02 — IoC và DI28
03 — ApplicationContext25
04 — Bean lifecycle26
05 — Bean scopes24
06 — @Configuration, @Bean, @Component25
07 — Mini-challenge: build mini IoC30
08 — Tổng kết15
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ả

  1. Đừ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 @Autowired mà không hiểu vấn đề nó giải = học vẹt.
  2. 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.
  3. Bài 04 (lifecycle) yêu cầu bạn predict output trước khi đọc giải thích. SelfCheck Q1 in null rồi in instance — đoán trước, sau đó verify. Đây là kỹ thuật học tốt nhất.
  4. 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.
  5. Sau bài 08, mở lại _meta.json của module này (đường dẫn content/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?