📝 SpringBoot 与序列化相关问题总结

1. @Bean 方法参数可以注入吗?

可以。

  • @Bean 的方法本质是一个“工厂方法”
  • Spring 调用它时会从容器中自动注入参数(类似构造器注入)

示例:

1
2
3
4
@Bean
public MyService myService(UserRepository userRepository) {
return new MyService(userRepository);
}

条件:参数必须是 Spring 管理的 Bean,否则会报错。


2. 什么是序列化器?

序列化器(Serializer)就是对象与可传输格式之间的转换器。

它的作用是:

  • Java 对象 → JSON / byte[] / XML
  • JSON / byte[] / XML → Java 对象

不同系统之间无法直接传输 Java 对象,所以序列化器用于:

  • HTTP
  • Redis
  • Kafka
  • 文件存储
  • 消息队列

3. SpringMVC 为什么返回 JSON?

因为 Spring Boot 自动配置了:

1
MappingJackson2HttpMessageConverter

所以 Controller 返回对象时,自动使用 Jackson 序列化器

1
User 对象 → JSON 字符串 → 浏览器

4. 为什么 RedisTemplate 需要设置 Key 的序列化器?

Redis 本质只能存 byte[]
如果不设置:

  • Spring 默认使用 JdkSerializationRedisSerializer
  • Redis 中的 key 变成不可读乱码,如:
1
\xAC\xED\x00\x05t\x00\x04name

设置:

1
redisTemplate.setKeySerializer(new StringRedisSerializer());

效果:

  • key 是正常字符串
  • 可读、可维护、可查询

5. Spring MVC 用 Jackson,为什么 Redis 不自动用 Jackson?

因为:

✔ SpringMVC 是“HTTP 层”,专门用 Jackson 来做 JSON 转换

这是框架自动配置。

❌ RedisTemplate 是“存储层”,不是 HTTP

它默认用 JDK 序列化,不会自动选择 Jackson。

原因:

  • Redis 存储格式不一定是 JSON(可能是 JDK/Kryo/Protostuff)
  • Spring 无法预设你的存储格式需求
  • 所以必须开发者 手动配置序列化器

示例:

1
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

6. Spring 各组件序列化器对比

场景 默认序列化器 是否自动使用 Jackson?
Spring MVC Controller 返回 JSON Jackson ✔ 是
RedisTemplate JDK 序列化 ❌ 否
RabbitTemplate JDK 序列化 ❌ 否
KafkaTemplate 字节序列化 ❌ 否
HttpMessageConverter Jackson ✔ 是

🎯 总结一句话

Spring Boot 只有在 HTTP JSON 场景(MVC)会自动使用 Jackson。
RedisTemplate 等非 HTTP 组件不会自动用 Jackson,必须手动配置序列化器。