让我们说我只想要一个ObjectMapper
对象的普通实例。将它声明为bean有什么好处吗?
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
为什么不在我们每次需要的时候通过ObjectMapper
创建一个新的new ObjectMapper()
?
或者将其声明为静态对象?
private static final ObjectMapper mapper = new ObjectMapper();
答案 0 :(得分:6)
以下是有关ObjectMapper
的API说明映射器实例完全线程安全 ,前提是实例的所有配置都发生在任何读取或写入调用之前。如果在首次使用后修改映射器的配置,则更改可能会也可能不会生效,配置调用本身可能会失败。
以下是improve jackson performance的指南:
重用重量级对象:ObjectMapper(数据绑定)和JsonFactory(流API) 在较小的程度上,您可能还想重用ObjectReader和ObjectWriter实例 - 这只是一些锦上添花,但它们完全是线程安全且可重用的
总结一下:
ObjectMapper
是线程安全的,只要您没有动态更改配置
ObjectMapper
初始化是一项繁重的操作
因此,请将ObjectMapper
声明为@Bean
:
提高解析性能(因为解析时不需要重新初始化实例)
减少内存使用量(创建的对象减少)
您ObjectMapper
方法返回的@Bean
已完全配置。它是线程安全的。 (但显然,不要修改@Autowired
实例XD)
为您的应用程序提供通用配置(例如时区,null故障转移配置...)