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

  1. selectImports(metadata)Đi vào getAutoConfigurationEntry().
  2. getCandidateConfigurations()Đọc danh sách auto-configuration imports đã đăng ký.
  3. Apply exclusionsLoại class bị exclude bởi annotation hoặc property.
  4. Configuration class filtersLọc nhanh theo metadata/classpath trước khi parse đầy đủ.
  5. 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.
  6. 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

  1. getMatchOutcome()Nhận metadata của bean method/config class.
  2. new Spec<>(..., ConditionalOnMissingBean.class)Spec gom type, name, annotation và search strategy.
  3. getMatchingBeans(spec)Tìm bean definition phù hợp trong current context hoặc hierarchy.
  4. Có match -> no match outcomeAuto-config bean method bị bỏ qua và report ghi bean nào gây back-off.
  5. Không có match -> condition matchBoot đăng ký default bean.
  6. 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 + @ConditionalOnMissingBean cho Jackson 2 ObjectMapper.
  • StandardJackson2ObjectMapperBuilderCustomizerĐọc JacksonProperties và áp timezone, naming, features, modules.

Boot 4.1.0

  • JsonMapper / XmlMapperJackson 3 đổi package sang tools.jackson và đổ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 ObjectMapper củ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.