You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot自动配置中构造器注入集合参数来源疑问

List<Jackson2ObjectMapperBuilderCustomizer>参数的注入逻辑

这个参数不需要单独声明对应类型的Bean,是Spring框架原生支持的集合类型注入能力,从Spring 4.x版本就已经存在,不是Spring Boot特有的功能。

Spring的依赖注入核心规则里,针对集合类型有专门的处理逻辑:

  • 当注入位置(构造器参数、@Bean方法参数、字段)声明的依赖类型是List<T>/Set<T>/Map<String, T>这类集合时,Spring不会去容器里找一个类型完全匹配的集合Bean,而是会自动扫描容器中所有类型匹配泛型参数T的Bean,把这些Bean组装成对应集合实例后注入
  • 这个规则对所有注入场景都生效,你看到的@Bean方法参数注入只是其中一种场景

对应到你贴的Jackson配置场景

这里注入的customizers列表,装的是Spring容器中所有实现了Jackson2ObjectMapperBuilderCustomizer接口的Bean实例,这些实例的来源一般有三类:

  • Spring Boot官方Jackson相关自动配置类里注册的默认定制器,比如处理Java8时间类型序列化、枚举默认序列化规则的内置实现
  • 你自己项目中加了@Component注解的自定义Jackson2ObjectMapperBuilderCustomizer实现类
  • 其他第三方starter或者你在自定义配置类中通过@Bean注册的该类型实例

举个自定义定制器的例子,下面这个类只要被Spring扫描到,就会被自动收集到上述列表中,不需要额外配置:

@Component
public class NullIgnoreCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder builder) {
        // 全局配置序列化时忽略null值字段
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

补充个容易踩的坑:如果你手动在Spring容器中注册了一个类型完全为List<Jackson2ObjectMapperBuilderCustomizer>的Bean,Spring会优先注入你手动注册的这个集合,不再自动收集零散的定制器Bean,注入优先级和普通类型的依赖注入保持一致。

内容的提问来源于stack exchange,提问作者yuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:42:15