我应该为所有 doGet/doPost 对 Servlet 的调用实例化一个共享的 Gson 对象吗?
Should I instantiate a shared Gson object for all doGet/doPost calls to a Servlet?
目前我正在使用 Google 的 Gson class 将传入的 Ajax JSON 字符串解析为 Java pojos,作为 doGet/doPost任务。我以通常的方式从 JSON 字符串中实例化一个新的 Gson 对象:
JsonObj jsonObj = new Gson().fromJson(jsonStr, jsonObj.class);
问题是我是否应该在 servlet 初始化中实例化一个共享的 gson 对象,以避免在每个 servlet doGet/doPost 调用中执行 new Gson()
。
这里 我了解到 Gson 不是单例,并且可以使用 GsonBuilder 进行一些自定义,但这不是我的情况。
我担心共享 Gson 对象的多线程行为。
简单回答:Gson
是线程安全的,您可以在 servlet 之间共享它。参见:Is it OK to use Gson instance as a static field in a model bean (reuse)?
但是您应该将 JSON
serialization/deserialization 逻辑与您的业务逻辑分离。例如,在 Spring is done by *HttpMessageConverter 层。因此,第一步是创建 Gson
对象的共享 bean,第二步是创建允许在需要时交换实现的抽象层。如果你写的是web-app
,那么Spring
是个不错的选择。
目前我正在使用 Google 的 Gson class 将传入的 Ajax JSON 字符串解析为 Java pojos,作为 doGet/doPost任务。我以通常的方式从 JSON 字符串中实例化一个新的 Gson 对象:
JsonObj jsonObj = new Gson().fromJson(jsonStr, jsonObj.class);
问题是我是否应该在 servlet 初始化中实例化一个共享的 gson 对象,以避免在每个 servlet doGet/doPost 调用中执行 new Gson()
。
这里
简单回答:Gson
是线程安全的,您可以在 servlet 之间共享它。参见:Is it OK to use Gson instance as a static field in a model bean (reuse)?
但是您应该将 JSON
serialization/deserialization 逻辑与您的业务逻辑分离。例如,在 Spring is done by *HttpMessageConverter 层。因此,第一步是创建 Gson
对象的共享 bean,第二步是创建允许在需要时交换实现的抽象层。如果你写的是web-app
,那么Spring
是个不错的选择。