SpringBoot 与序列化相关问题总结
📝 SpringBoot 与序列化相关问题总结
1. @Bean 方法参数可以注入吗?
可以。
- 带
@Bean的方法本质是一个“工厂方法” - Spring 调用它时会从容器中自动注入参数(类似构造器注入)
示例:
1 | @Bean |
条件:参数必须是 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,必须手动配置序列化器。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 风栖巷!
评论
