问:springboot老项目原本有使用objectmapper,自己写了个myJacksonconfig创建一个用于特殊处理的myobjectmapper,并在服务类中@qualifier指定用自己的对象。那原本代码未指定名称的会使用哪一个呢?
答:
这种写法:
-
自己写 MyJacksonConfig ,手动 new 一个 ObjectMapper,并给它起个名字(比如 myObjectMapper )
-
在服务类里用 @Qualifier("myObjectMapper") 或直接 @Resource 指名用它
那么:
原本没指定名字、没加 @Qualifier 的地方,依然用 SpringBoot 默认的 ObjectMapper,不会用到你自定义的。
为什么?
SpringBoot 对 ObjectMapper 的默认规则是:
-
SpringBoot 自动配置里,自带一个 jacksonAutoConfiguration
-
它会注册一个 主 ObjectMapper Bean,且是 @Primary
-
你自己写的 myObjectMapper 只是另一个普通 Bean,没有 @Primary
所以:
- 用 @Autowired private ObjectMapper objectMapper;
→ 注入 默认主Bean
- 用 @Autowired @Qualifier("myObjectMapper")
→ 注入 你自己的
你现在的结构行为总结
-
全局默认:Spring 自带的 ObjectMapper
-
你指定名字:你自己特殊处理的 myObjectMapper
-
两者互不干扰
如果你想让全局都用你自己的
只需要加一个 @Primary:
java
@Bean("myObjectMapper")
@Primary // 加这个
public ObjectMapper myObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 你的特殊配置
return mapper;
}
加了之后:
-
所有不指定名字的地方,都会用你这个
-
原来自动配置的默认的被覆盖,现在你的是默认的
一句话记忆:
谁加 @Primary,谁就是默认;不加,默认永远是 SpringBoot 自带的那个。
======
问:如果我要给自己写的加primary,jacksonAutoConfiguration是怎么处理的?
答:给自己的 @Bean 加上 @Primary
SpringBoot 自带的 JacksonAutoConfiguration 会自动失效、不生效。
原理一句话:SpringBoot 的自动配置类 JacksonAutoConfiguration 上有个条件:
java
@ConditionalOnMissingBean(ObjectMapper.class)
意思是:
只有当容器里还没有任何 ObjectMapper Bean 时,它才会创建默认的那个。
你自己写了:
java
@Bean
@Primary
public ObjectMapper myObjectMapper() { ... }
那么:
-
你的 Bean 先注册
-
JacksonAutoConfiguration 发现已经有 ObjectMapper 了
-
它直接跳过,不创建默认 ObjectMapper
最终效果
-
容器里 只有你这一个 ObjectMapper
-
所有 @Autowired ObjectMapper
→ 全都用你这个
- 你不需要担心冲突、覆盖、混乱
你最终最稳的写法
java
@Configuration
public class MyJacksonConfig {
@Bean
@Primary // 加这个
public ObjectMapper objectMapper() { // 建议名字就叫 objectMapper,更干净
ObjectMapper mapper = new ObjectMapper();
// 你的各种配置
return mapper;
}
}
总结
-
自己写 + @Primary
-
默认自动配置自动消失
-
全局统一用你这个