将 ObjectMapper 声明为 bean 有啥好处?
Posted
技术标签:
【中文标题】将 ObjectMapper 声明为 bean 有啥好处?【英文标题】:What is the advantage of declaring ObjectMapper as a bean?将 ObjectMapper 声明为 bean 有什么好处? 【发布时间】:2018-10-26 00:51:51 【问题描述】:假设我只想要一个 ObjectMapper
对象的普通实例。将其声明为 bean 有什么好处吗?
@Bean
public ObjectMapper objectMapper()
return new ObjectMapper();
为什么不每次我们需要时都通过new ObjectMapper()
创建一个新的ObjectMapper
?
还是声明为静态对象?
private static final ObjectMapper mapper = new ObjectMapper();
【问题讨论】:
当您使用Bean
声明对象时,spring 将负责管理其生命周期和范围。
ObjectMapper
是线程安全的,可以重复使用,具体取决于对象创建可能需要很长时间,然后重复使用现有实例可能更可取(当它是线程安全的时候)。此外,您可能不想自己控制对象的生命周期,而是让 Spring 为您处理。
【参考方案1】:
这是关于ObjectMapper的API说明
映射器实例是完全线程安全的 只要实例的所有配置发生在任何读取或写入调用之前。如果在第一次使用后修改了映射器的配置,则更改可能会或可能不会生效,并且配置调用本身可能会失败。
这是improve jackson performance的指南:
重用重量级对象:ObjectMapper(数据绑定)和 JsonFactory(流式 API) 在较小程度上,您可能还想重用 ObjectReader 和 ObjectWriter 实例——这只是锦上添花,但它们是完全线程安全且可重用的
总结一下:
ObjectMapper
是线程安全的,只要您没有动态更改配置
ObjectMapper
初始化是个繁重的操作
因此,将您的 ObjectMapper
声明为 @Bean
将:
提高解析性能(解析时无需重新初始化实例)
减少内存使用(创建的对象更少)
您从@Bean
方法返回的ObjectMapper
已完全配置。它是线程安全的。 (但很明显,不要修改@Autowired
实例XD)
为您的应用程序提供通用配置(如时区、空故障转移配置...)
【讨论】:
在您看来,将其声明为 bean 还是像另一个问题 ***.com/questions/3907929/… 中提到的静态对象更好?假设不需要任何配置,只需一个普通的ObjectMapper
即可。
声明为静态就可以了。但是在像 Spring 这样的环境中,恕我直言,您应该将其声明为 bean。 Spring 将为您管理其生命周期。
还有一点是,如果您将 ObjectMapper 作为 bean 注入到其他组件中,您可以在测试这些组件时模拟 ObjectMapper,这将允许以更孤立的方式测试组件。
您还可以使用 static
方法配置一个对象,因为您可以在该字段下具有链接函数或静态范围,我在您的帖子中并没有真正看到 bean 的优势。 . 我宁愿看到缺点,因为您需要 Spring 并且必须一直使用 @Autowired
,当某些测试禁用 Spring 时,这可能会出现问题。以上是关于将 ObjectMapper 声明为 bean 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章
将 responseJSON 解析为 ObjectMapper
Retrofit 或 Jackson ObjectMapper 将“aId”属性映射为小写“aid”
如何在不影响原始 bean 的“客户”的情况下声明另一个 Jackson ObjectMapper?
如何使用 ObjectMapper 和 Realm 对象声明字典