IoC Container và dependency graph
Container không chỉ “new object hộ”; nó đọc metadata, xây object graph, quản lý lifecycle và cung cấp extension points cho toàn framework.
BeanFactory và ApplicationContext
BeanFactory là nền tảng tạo và tra cứu bean. ApplicationContext mở rộng với event, resource loading, message resolution, environment và tự động phát hiện post-processors. Ứng dụng Boot thường dùng implementation phù hợp servlet, reactive hoặc non-web.
BeanDefinition
BeanDefinition là recipe gồm class hoặc factory method, scope, constructor args, properties, init/destroy, lazy, primary và qualifiers. Nguồn có thể là @Component scanning, @Bean, XML hoặc programmatic registration. Container hợp nhất metadata trước khi tạo singleton.
Dependency resolution
Autowiring theo type; nhiều candidate dùng @Primary, @Qualifier, generic metadata hoặc bean name fallback. Collection injection lấy tất cả candidate có thứ tự. ObjectProvider hỗ trợ optional, lazy và multiple lookup nhưng không nên che dependency bắt buộc.
@Configuration
class PaymentConfiguration {
@Bean PaymentGateway gateway(HttpClient client, PaymentProperties props) {
return new HttpPaymentGateway(client, props.endpoint());
}
}
Ưu tiên constructor injection vì dependency explicit, object có thể immutable, dễ test ngoài container và fail fast khi thiếu wiring. Field injection che dependency bắt buộc và làm object khó khởi tạo trong unit test.
Configuration class
@Configuration class có thể được enhanced để lời gọi giữa @Bean methods trả bean do container quản lý. “Lite mode” trên component thường không intercept inter-bean call giống full configuration. Tránh gọi factory method như method Java thường nếu lifecycle semantics quan trọng.
Component scanning và boundary
Scanning thường bắt đầu từ package của application. Đặt main class quá cao có thể scan ngoài ý muốn. Library hoặc starter nên đăng ký có chủ đích, không bắt consumer scan package nội bộ. Explicit configuration hữu ích khi object graph quan trọng hoặc cần nhiều implementation.
Environment và resources
Environment chứa profiles và property sources; Resource abstraction thống nhất classpath, file và URL. Không dùng profile cho mọi business variation. Property resolution là runtime configuration, không phải secret management.
Circular dependency
Constructor cycle không thể tạo object graph và thường phản ánh hai service thiếu boundary. Setter hoặc field cycle từng có thể được giải bằng early reference nhưng tạo bean chưa hoàn thiện và proxy complexity; cấu hình Boot hiện đại chủ động hạn chế. Cách sửa bền vững là tách responsibility, domain event hoặc mediator đúng nghĩa.