SPRING BOOT SERIES - LẮP RÁP
Thêm Một Bean, Auto-configuration Lặng Lẽ Rút Lui
BACK-OFF - XANH = TẦNG PHÓNG TOBoot nạp auto-config sau user configuration và chỉ tạo default khi condition còn match.
Boot 3.2.5 / Jackson 2
Một bean ObjectMapper làm bean mặc định của Boot back off; pipeline spring.jackson.* -> builder -> mapper không tạo mapper đó.
Cơ chế giữ, diễn viên đổi
@ConditionalOnMissingBean hỏi BeanFactory tại lúc auto-config được xử lý. Có matching bean thì outcome âm.Boot 4.1.0 / Jackson 3
Auto-config chính dùng JsonMapper/XmlMapper; chỉ khai Jackson 2 ObjectMapper không tái hiện cùng collision.
Mức 1 - nhập auto-config candidates
AutoConfigurationImportSelector
Classpath có configuration class chưa đủ để class tự chạy
selectImports(metadata)Đi vàogetAutoConfigurationEntry().getCandidateConfigurations()Đọc danh sách auto-configuration imports đã đăng ký.- Apply exclusionsLoại class bị exclude bởi annotation hoặc property.
- Configuration class filtersLọc nhanh theo metadata/classpath trước khi parse đầy đủ.
- Auto-config xử lý sau user beansĐiều này làm condition back-off có bối cảnh BeanFactory phù hợp.
- Jar config phải được nạp bằng một đường thật
@Import, component scan hoặc AutoConfiguration imports; chỉ nằm trong jar không đủ.
Mức 2 - condition nhìn BeanFactory
OnBeanCondition
@ConditionalOnMissingBean match khi không tìm thấy target
getMatchOutcome()Nhận metadata của bean method/config class.new Spec<>(..., ConditionalOnMissingBean.class)Spec gom type, name, annotation và search strategy.getMatchingBeans(spec)Tìm bean definition phù hợp trong current context hoặc hierarchy.- Có match -> no match outcomeAuto-config bean method bị bỏ qua và report ghi bean nào gây back-off.
- Không có match -> condition matchBoot đăng ký default bean.
- Chỉ an toàn trong auto-config có thứ tựGiữa các user config, registration order chưa hoàn tất có thể làm condition không ổn định.
Mức 3 - Jackson case study
JacksonAutoConfiguration
Properties chỉ có hiệu lực qua bean pipeline thật sự được tạo
Boot 3.2.5
jacksonObjectMapper(builder)@Primary+@ConditionalOnMissingBeancho Jackson 2ObjectMapper.StandardJackson2ObjectMapperBuilderCustomizerĐọcJacksonPropertiesvà áp timezone, naming, features, modules.
Boot 4.1.0
JsonMapper/XmlMapperJackson 3 đổi package sangtools.jacksonvà đổi target bean.JsonMapperBuilderCustomizerCustomizer mới cộng cấu hình vào mapper mặc định thay vì thay bean.- Collision phải test lại theo type mớiBean
ObjectMappercủa Boot 3 không còn là reproduction tương đương.
Phép kiểm: chạy với --debug, tìm JacksonAutoConfiguration trong Conditions Evaluation Report, liệt kê bean mapper + nguồn bean definition, rồi assert timezone/naming module trên chính mapper mà HTTP converter sử dụng.
Tùy biến mà không cướp default
- Ưu tiên customizer đúng versionBoot 3 dùng Jackson2 builder customizer; Boot 4 dùng JsonMapper builder customizer.
- Cô lập mapper riêng của thư việnDùng qualifier và không để bean nội bộ vô tình thành application default.
- Giữ component scan hẹpKhông quét package cha chung với dependency ngoài ý muốn.
Khi KHÔNG được kết luận
- Configuration class trong jar tự động chạyNó cần import, scan hoặc auto-config registration.
- Property bị ignore vì precedenceProperty có thể thắng Environment nhưng không còn bean pipeline đọc nó.
- Reproduction Boot 3 dùng nguyên cho Boot 4Target mapper, package, customizer và một số property đã đổi.