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
相关产品推荐
相关产品推荐

