成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot中如何使用ObjectMapper,老鳥們都是這樣玩的?

開發 前端
使用單例模式進行字符串轉對象時性能可以提升18倍,而對象轉String性能快了驚人的290萬倍,所以在Spring中如何正確的使用ObjectMapper不用我再說了吧~

1. 每次new一個

在SpringBoot項目中要實現對象與Json字符串的互轉,每次都需要像如下一樣new 一個ObjectMapper對象:

public UserEntity string2Obj(String json) throws JsonProcessingException {
 ObjectMapper objectMapper = new ObjectMapper();
 return objectMapper.readValue(json, UserEntity.class);
}

public String obj2String(UserEntity userEntity) throws JsonProcessingException {
 ObjectMapper objectMapper = new ObjectMapper();
 return objectMapper.writeValueAsString(car)
}

這樣的代碼到處可見,有問題嗎?

你要說他有問題吧,確實能正常執行;可你要說沒問題吧,在追求性能的同學眼里,這屬實算是十惡不赦的代碼了。

首先,讓我們用JMH對這段代碼做一個基準測試,讓大家對其性能有個大概的了解。

基準測試是指通過設計科學的測試方法、測試工具和測試系統,實現對一類測試對象的某項性能指標進行定量的和可對比的測試。而JMH是一個用來構建,運行,分析Java或其他運行在JVM之上的語言的 納秒/微秒/毫秒/宏觀 級別基準測試的工具。

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
@Fork(1)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 3, time = 1)
public class JsonJMHTest {
    
    String json = "{\"id\":122345667,\"email\":\"jianzh5@163.com\",\"price\":12.25}";
    UserEntity userEntity = new UserEntity(13345L,"jianzh5@163.com", BigDecimal.valueOf(12.25));
    /**
     * 測試String to Object
     */
    @Benchmark
    public UserEntity objectMapper2ObjTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(json, UserEntity.class);
    }

    /**
     * 測試Object to String
     */
    @Benchmark
    public String objectMapper2StringTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writeValueAsString(userEntity);
    }
  
   public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(JsonJMHTest.class.getSimpleName())
                .build();
        new Runner(opt).run();
    }
}

測試環境

# JMH version: 1.36
# VM version: JDK 17.0.3, OpenJDK 64-Bit Server VM, 17.0.3+7-LTS
# Mac AppleM1/16GB

測試結果

圖片圖片

通過測試結果可以看出,每次new一個ObjectMapper,在實現字符串轉對象時每秒可以完成23萬多次,而實現對象轉Json字符串每秒僅可完成2.7萬次。

那該如何優化,提升性能呢?

2. 單例化

老鳥們都知道,在創建工具類時要將工具類設置成單例的,這樣不僅可以保證線程安全,也可以保證在系統全局只能創建一個對象,避免頻繁創建對象的成本。

所以,我們可以在項目中構建一個ObjectMapper的單例類。

@Getter
public enum ObjectMapperInstance {
    
    INSTANCE;
    
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    ObjectMapperInstance() {
        
    }
}

再次使用JMH對其測試:

@Benchmark
public UserEntity singleten2ObjTest() throws JsonProcessingException {
  ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();
  return objectMapper.readValue(json, UserEntity.class);
}

@Benchmark
public String singleten2StringTest() throws JsonProcessingException {
  ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();
  return objectMapper.writeValueAsString(userEntity);
}

測試結果如下:

圖片圖片

可以看到,使用單例模式,String轉對象的方法每秒可以執行420多萬次,比new ObjectMapper的方式快了18倍;而對象轉String的方法每秒可以執行830萬次,性能提升了300倍(看到結果的一瞬間我傻眼了,一度懷疑是寫錯代碼了)!!!!

3. 個性化配置

當然,在項目中使用ObjectMapper時,有時候我們還需要做一些個性化配置,比如將Long和BigDemical類型的屬性都通過字符串格式進行轉換,防止前端使用時丟失數值精度。

這些類型轉換的格式映射都可以在單例類中配置,代碼如下:

@Getter
public enum ObjectMapperInstance {
    
    INSTANCE;
    
    private final ObjectMapper objectMapper;
    
    ObjectMapperInstance() {
        objectMapper = new ObjectMapper();
        // 注冊自定義模塊
        initialize();
    }
    
    private void initialize() {
        CustomJsonModule customJsonModule = new CustomJsonModule();
        objectMapper.registerModule(customJsonModule);
    }
}

在initialize()方法中給ObjectMapper注冊自定義序列化轉換器。

圖片圖片

第一行是使用注冊自定義序列換轉換器后的效果,給id和price字段都加上了引號。

再來一次JMH測試:

圖片圖片

可以看到,給ObjectMapper額外注冊轉換類型以后性能會受到一定的影響,但對業務影響不大。(啥業務能這么高的請求~)

4. 小結

通過上面的測試,結論已經很清晰了。使用單例模式進行字符串轉對象時性能可以提升18倍,而對象轉String性能快了驚人的290萬倍,所以在Spring中如何正確的使用ObjectMapper不用我再說了吧~

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2023-04-12 08:56:37

RocketMQSpring核心業務

2023-02-04 10:08:40

2021-07-16 08:58:35

SpringBoot

2015-07-15 13:47:13

上網高手

2024-06-13 08:19:08

Controller接口參數

2020-11-16 13:38:31

PostMessage

2021-07-28 06:10:47

拖拽設計器 transmat

2021-09-05 07:55:37

前端Emoji 表情

2024-08-06 09:51:21

SpringHTTPJSON

2024-08-02 08:38:20

Controller接口地址

2018-08-27 15:53:43

編程語言javaPython

2019-05-30 14:58:56

Pythonxml文件

2014-07-15 11:02:20

2013-08-22 10:28:50

.NET MVC.NETRazor

2023-11-30 22:54:15

2018-05-20 11:25:45

520程序員表白

2016-12-28 14:51:46

大數據應用

2021-04-02 06:05:31

Windows 10Windows操作系統

2011-03-09 10:39:13

LAMP簡介

2022-07-24 14:51:31

開源游戲RPG 游戲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩伦理一区二区 | 水蜜桃亚洲一二三四在线 | 中文字幕一区在线观看视频 | 99re热精品视频国产免费 | 国产综合精品一区二区三区 | 久久曰视频 | 男人天堂免费在线 | 黄色网址在线免费观看 | 天天看天天操 | 国产精品日韩欧美一区二区 | 日韩欧美中文字幕在线观看 | 日韩精品一区二区三区在线观看 | 久久成人亚洲 | 日韩欧美精品一区 | 精品无码三级在线观看视频 | 奇米四色在线观看 | 欧美极品视频 | 国产激情一区二区三区 | 久久精品一二三影院 | 国产午夜精品一区二区三区四区 | 琪琪午夜伦伦电影福利片 | 成年人免费网站 | 欧美精品一区二区三区在线 | 亚洲国产成人av好男人在线观看 | 精品一区二区三区日本 | 亚洲一区久久久 | 日韩一区二区在线视频 | 精品丝袜在线 | 自拍偷拍第一页 | 日韩精品久久久久久 | 国产欧美日韩在线观看 | 国产不卡视频在线 | 久久久久久免费精品一区二区三区 | 国产中文区二幕区2012 | 欧美一区二区三区在线观看 | 亚州影院 | 91天堂网 | 国产www在线 | 超碰人人插 | 国产精品完整版 | 美国黄色毛片 |