将 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 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

为 ObjectMapper 创建多个 bean

将 responseJSON 解析为 ObjectMapper

自定义对象映射器 bean 更改打开 Feign 客户端的默认属性/自动配置的 objectMapper bean

如何在不覆盖 Spring Boot 使用的情况下定义自定义 ObjectMapper bean

如何使用 ObjectMapper 和 Realm 对象声明字典

将一个类声明为Spring的bean的注解小结