java - 我应该为所有对 Servlet 的 doGet/doPost 调用实例化一个共享 Gson 对象吗?
问题描述
目前,我正在使用 Google 的 Gson 类将传入的 Ajax JSON 字符串解析为 Java pojo,作为 doGet/doPost 任务的一部分。我以通常的方式从 JSON 字符串中实例化一个新的 Gson 对象:
JsonObj jsonObj = new Gson().fromJson(jsonStr, jsonObj.class);
问题是我是否应该在 servlet 初始化中实例化一个共享的 gson 对象,以避免new Gson()
在每个 servlet doGet/doPost 调用中执行此操作。
在这里为每个序列化实例化一个新的 GSON 实例?我了解到 Gson 不是单例,并且可以使用 GsonBuilder 进行一些自定义,但这不是我的情况。我担心共享 Gson 对象的多线程行为。
解决方案
简单的答案:Gson
是线程安全的,您可以在 servlet 之间共享它。请参阅:可以将 Gson 实例用作模型 bean 中的静态字段(重用)吗?
但是您应该将JSON
序列化/反序列化逻辑与业务逻辑分离。例如,在Spring中是由*HttpMessageConverter层完成的。因此,第一步是创建Gson
对象的共享 bean,第二步是创建允许在需要时交换实现的抽象层。如果你web-app
无论如何都在写,Spring
是一个不错的选择。
推荐阅读
- android - Android ViewModels:数据类是否应该公开 livedata 属性?
- python-3.x - 无法将给定日期转换为来自 df['dateformat'] 在 python 中的所需日期格式
- reporting-services - 在 ssrs 的两个不同页面中显示来自一个数据集(分组依据)的两个 tablix 上的数据
- javascript - 在我滚动页面之前,React Hooks 不会改变对象状态
- c - 用 C 创建一个简单的注册和登录系统
- isabelle - `overloading` 和 `adhoc_overloading` 有什么区别?
- html - 如何在单击链接时更改引导主题
- r - 自升级到 v2.40.0 后,topGO 出现错误
- ios - 您的应用程序的状态已更改为 Invalid Binary
- python - 数据传播在机器学习中是好是坏,以及为什么