将ObjectMapper声明为Bean有什么好处?

wlt*_*eng 2 java oop static json jackson

假设我只想要ObjectMapper对象的普通实例。将其声明为bean有什么好处?

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper();
}
Run Code Online (Sandbox Code Playgroud)

为什么不每当我们需要时就制作一个新ObjectMappernew ObjectMapper()

还是将其声明为静态对象?

private static final ObjectMapper mapper = new ObjectMapper();
Run Code Online (Sandbox Code Playgroud)

Mạn*_*yễn 6

这是关于ObjectMapper的API注释

映射器实例是完全线程安全的, 前提是实例的所有配置都在ANY读取或写入调用之前进行。如果在首次使用后修改了映射器的配置,则更改可能会或可能不会生效,并且配置调用本身可能会失败。

这是改善杰克逊性能的准则:

重用重量级的对象:ObjectMapper(数据绑定)和JsonFactory(流API)在较小程度上,您可能还想重用ObjectReader和ObjectWriter实例-这只是锦上添花,但它们完全是线程化的,安全且可重复使用

总结一下:

  • ObjectMapper 是线程安全的,只要您没有即时更改配置

  • ObjectMapper 初始化是一项繁重的操作

因此,声明你ObjectMapper@Bean意愿:

  • 提高解析性能(因为在解析时不需要重新初始化实例)

  • 减少内存使用(创建更少的对象)

  • ObjectMapper@Bean方法返回的信息已完全配置。这是线程安全的。(但显然不要修改@Autowired实例XD)

  • 为您的应用程序提供通用配置(例如时区,空故障转移配置...)