Java常用的開發庫推薦

Java3y發表於2022-01-05

我是3y,一年CRUD經驗用十年的markdown程式設計師??‍?

今天來講講來給大家聊聊開發提速的東西了:工具包Lombok常用庫

01、什麼是工具包

基本上,每個專案裡都有一個包,叫做utils。這個包專門承載我們自己專案的工具類,比如常見的DateUtilsHttpUtilsCollections

所謂Utils就是:這個東西我們用得很多,但是原API不夠好用,於是我們給它封裝為一個比較通用的方法

如果是初學者,很多時候遇到這種類似的工具類也不會直接自己開寫,會先去搜尋引擎裡找一通。找到了之後,看起來覺得可以就直接一個ctrl+c ,一個ctrl +v 往自己的main方法一貼,搞點測試資料,看能不能work起來。

能work起來,那就給它取個名字,放在utils包下。一頓操作過後,發現自己這操作姿勢就是完美!

殊不知,你想要的工具類很可能人家已經寫好對應的jar包,比某搜尋引擎查到的某部落格的程式碼可靠多了。

知道有此類jar 的人用得一直很香,不知道的人可能就一直缺什麼就去拷貝什麼,程式碼搞得非常髒亂。

02、Java工具包推薦

在Java領域裡,在業內比較出名的工具包有兩個:commonsguava

國人維護的一個工具包:Hutool

如果有相關的需求的話,我們在專案程式碼中可以儘可能使用這些工具包。它們的程式碼一般情況下都會比我們自己寫的要好,而且工具類就是為了幫我們減少重複性程式碼的,多用會使專案的可讀性變得更高。

至於它們能幹什麼,如果沒了解過的可以先逛下他們的Guide,稍微瞭解下這些工具包封裝了什麼功能。等到自己要意識到需要封裝某個功能時,先把這些工具包的文件給逛一遍,真的找不到時,沒有再自己實現

不要重複造輪子,不要重複造輪子,不要重複造輪子。

我貼下這些工具包的連結? 大家如果對這個不瞭解的話,建議去看看

我擷取hutool文件的一部分資訊,大家稍微可以感受下,我個人認為還是比較全的:

模組介紹
hutool-aopJDK動態代理封裝,提供非IOC下的切面支援
hutool-bloomFilter布隆過濾,提供一些Hash演算法的布隆過濾
hutool-cache簡單快取實現
hutool-core核心,包括Bean操作、日期、各種Util等
hutool-cron定時任務模組,提供類Crontab表示式的定時任務
hutool-crypto加密解密模組,提供對稱、非對稱和摘要演算法封裝
hutool-dbJDBC封裝後的資料操作,基於ActiveRecord思想
hutool-dfa基於DFA模型的多關鍵字查詢
hutool-extra擴充套件模組,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等)
hutool-http基於HttpUrlConnection的Http客戶端封裝
hutool-log自動識別日誌實現的日誌門面
hutool-script指令碼執行封裝,例如Javascript
hutool-setting功能更強大的Setting配置檔案和Properties封裝
hutool-system系統引數呼叫封裝(JVM資訊等)
hutool-jsonJSON實現
hutool-captcha圖片驗證碼實現
hutool-poi針對POI中Excel和Word的封裝
hutool-socket基於Java的NIO和AIO的Socket封裝
hutool-jwtJSON Web Token (JWT)封裝實現

03、Lombok

我是在實習的時候接觸Lombok這個工具的。他給我的第一感受就是:再也不用自己生成set/get方法了

其實用上了IDE以後,生成set/get方法就是一個快捷鍵的事,但是每當我們要增加/刪除/修改類的屬性時,我們都需要額外去為這些變動去生成一次。不過,這好像也不是事。畢竟增加/刪除/修改的工作也不是特別多。

其實Lombok能做的事不僅僅只有set/get方法,用上了以後我還是比較推薦用的。像@Builder@Slf4j@Data這些註解我在專案中是經常用到的,如果還對Lombok不瞭解的話,可以去它的官網觀望一波。

https://projectlombok.org/features/all

有沒有人會好奇Lombok它是怎麼做到的?曾經有個群裡的小夥伴有遇到過這個面試題:你知道Lombok的原理是什麼嗎?

這個我在《對線面試官》系列的第一篇《註解》曾經聊過。其實不是特別複雜的東西,我們只要能想出Java的編譯時大致的步驟以及註解的基礎知識,這題就能答上了。

  1. 註解是有生命週期的@Retention有SOURCE、CLASS和RUNTIME 三個常量,使用Lombok的註解就是SOURCE階段的
  2. .java檔案被編譯的時候,稍微簡化下可以總結為幾個步驟:語法分析->語義分析->註解處理->class檔案
  3. JDK提供了Hook,我們想要在編譯時期做註解相關的事,可以繼承AbstractProcessor 並實現process方法(Lombok就是這麼幹的)

04、JSON庫

現在Java後端開發基本上是離不開JSON了,所以我們需要有JSON庫幫我們做序列化和反序列化

  • 前後端介面之間的互動基本上都是JSON格式了
  • 我們有的時候為了方便,也會直接把資料直接轉成JSON儲存起來(這裡的儲存可以是MySQL,可以是HBase,可以是Redis 等等)
  • ...

寫到這裡,我翻看了下我以前大學時候的學習筆記。我以前剛學JSON的時候,那時候跟著視訊在學Spring和Strtus2,他倆都內建了JSON的解析庫。我當時的水平,跟著視訊學習調個API對我沒什麼難度的,所以也不以為然。

沒想到,那時候視訊教程還教我:如果拋離了Spring和Struts2環境下,那該怎麼方便地操作JSON,然後在classpath果斷引入了json-lib的包...看回以前大學的筆記,真的是回憶滿滿...

不扯別的了,說回現在吧。現在Java後端一般使用比較多的JSON庫有fastjsonGsonJackson

我以前在公司用FastJson比較多的,API使用非常簡單,日常用得也很舒服。但是,我是經歷過曾經要強制升級fastjson版本的人!應該是19年吧,那時候安全團隊告訴我們需要強制升級fastjson的版本,大概就是fastjson有漏洞,一定得升級。這我們作為庫的使用方,沒辦法,那隻能升級吧。

結果,沒過幾天。安全團隊又拉了個群,說還是得升級xxx版本以上,之前升級過的版本還有問題...團隊內為了升級fastjson版本也遇到過其他的坑,反正就被弄得很煩。

網上也有很多對比這幾個JSON庫的文章(主要的指標是效能、穩定),有興趣的小夥伴可以去讀讀。

不過,austin專案還是選擇fastjson作為JSON主要的序列化庫(多點包容

05、HTTP庫

本來HTTP庫我是已經忘的了。但正當我要實現傳送簡訊功能的時候,我才恍然想起,HTTP也是經常用到的啊!於是火急地在傳送文章之前補充下。

不知道你們第一次用Java呼叫HTTP的時候,是什麼心情。在我印象裡,就覺得這東西複雜得一批,調個HTTP真麻煩!後來,工作了以後,在專案裡已經有大佬封裝過HTTP啦。但還是有的時候,覺得HTTP呼叫就是那麼的複雜(哎,各種頭資訊,一不小心設定錯,那就是半天)

但不管怎麼樣,HTTP呼叫是非常常見的,很多公司對外的介面幾乎都會提供HTTP呼叫。比如我們呼叫騰訊的API下發微信類訊息,呼叫各個渠道商傳送簡訊等等等。

扯遠了,還是先回到HTTP庫吧。在Java生態中,HTTP庫可以大致分為三類:

  • HttpURLConnection
  • Apache HttpClient
  • OkHttp

HttpURLConnection是JDK原始提供的HTTP庫,它是沒有實現HTTP連線池的(連線池還是非常重要的,池的概念我在這就不過於解釋了)。我之前專案用的HTTP庫都是Apache HttpClient 基礎上封裝的(Apache 出品的質量也有保證),而OkHttp可以說是後起之秀了(現在安卓端的HTTP庫基本都是基於OkHttp)

一般我們使用這些HTTP工具庫,都需要在原生的基礎上再寫Utils來簡化對HTTP的呼叫,有Utils環境下就會有各類的工具包:

  • 比如,上面提到的Hutool就對原生的HttpURLConnection進行封裝(不過其封裝是沒用執行緒池)
  • Square公司對自己出品的OkHttp又進行二次封裝,開源出Retrofit(這個在安卓用得很多)
  • Spring環境下提供RestTemplate 多種訪問遠端Http服務的方法(預設情況下是無執行緒池的,但可以使用Apache HttpClientOkHttp將其封裝至RestTemplate
  • SpringCloud環境下提供OpenFeign進而呼叫HTTP服務
  • 國產HTTP工具庫Forest: 對HttpclientOkHttp進行封裝
  • ...

這次我選擇OkHtpp作為austin的http庫

為什麼OkHtpp?向前看吧,OkHtpp作為Http庫確實現在已然成為標杆(至少在安卓火爆了,很多公司的SDK下都用的Okhttp作為Http庫的依賴了)。在Spring環境下RestTemplate也不太好用,我這專案又沒上SpringCloud,自然就沒用上OpenFeignRetrofit在安卓用得比較多(Java後端貌似相對較少)。

所以我選擇了OkHttp

06、總結

這篇文章是來講austin專案所使用到的工具包,對這些已經懂的人看完可能會覺得有點水,沒必要。

但有很多想要跟我一起學習這個專案的同學很多都是沒做過專案的,所以我還是覺得有必要發出來總結下。很多時候我們所做的東西,別人覺得很low,其實就在於資訊差

我覺得閱讀這篇文章的,肯定也會有某些已經工作的小夥伴是沒聽說過Lombok、沒用過Guava這類工具的(Commons應該多多少少都會用過,可能是潛在地用了,但不知道是有專門的apache工具類庫)。

其實這類工具包在專案裡使用的頻率會非常高,用了這些工具庫會讓我們的專案程式碼變得更加簡潔,程式碼可讀性和維護性對於一個專案而言是非常重要的。

對於這類工具,我的建議是有空的時候上去看看它能提供什麼功能。等發現自己要封裝一個工具類的時候,進去看看它們是不是已經實現了,如果實現了直接用就完事了。如果對功能感興趣的話,看下大佬們是怎麼實現的,如果是自己實現的話可能會有哪些地方沒想到。

肯定還有很多我還不瞭解又非常好用的工具包,求各位在評論區推薦推薦啊!!!這是austin專案的第三篇,目前已經更新至11篇,歡迎跟著我的步伐一起幹專案!

關注我的微信公眾號【Java3y】來聊點不一樣的!【對線面試官+從零編寫Java專案】 持續高強度更新中!求star!!原創不易!!求三連!!

Gitee連結:https://gitee.com/austin

GitHub連結:https://github.com/austin

相關文章