我是3y,一年CRUD
經驗用十年的markdown
程式設計師???
今天來講講來給大家聊聊開發提速的東西了:工具包、Lombok和常用庫
01、什麼是工具包
基本上,每個專案裡都有一個包,叫做utils
。這個包專門承載我們自己專案的工具類,比如常見的DateUtils
、HttpUtils
、Collections
所謂Utils就是:這個東西我們用得很多,但是原API不夠好用,於是我們給它封裝為一個比較通用的方法
如果是初學者,很多時候遇到這種類似的工具類也不會直接自己開寫,會先去搜尋引擎裡找一通。找到了之後,看起來覺得可以就直接一個ctrl+c
,一個ctrl +v
往自己的main
方法一貼,搞點測試資料,看能不能work起來。
能work起來,那就給它取個名字,放在utils
包下。一頓操作過後,發現自己這操作姿勢就是完美!
殊不知,你想要的工具類很可能人家已經寫好對應的jar
包,比某搜尋引擎查到的某部落格的程式碼可靠多了。
知道有此類jar
的人用得一直很香,不知道的人可能就一直缺什麼就去拷貝什麼,程式碼搞得非常髒亂。
02、Java工具包推薦
在Java領域裡,在業內比較出名的工具包有兩個:commons
和guava
國人維護的一個工具包:Hutool
如果有相關的需求的話,我們在專案程式碼中可以儘可能使用這些工具包。它們的程式碼一般情況下都會比我們自己寫的要好,而且工具類就是為了幫我們減少重複性程式碼的,多用會使專案的可讀性變得更高。
至於它們能幹什麼,如果沒了解過的可以先逛下他們的Guide
,稍微瞭解下這些工具包封裝了什麼功能。等到自己要意識到需要封裝某個功能時,先把這些工具包的文件給逛一遍,真的找不到時,沒有再自己實現。
不要重複造輪子,不要重複造輪子,不要重複造輪子。
我貼下這些工具包的連結? 大家如果對這個不瞭解的話,建議去看看
我擷取hutool
文件的一部分資訊,大家稍微可以感受下,我個人認為還是比較全的:
模組 | 介紹 |
---|---|
hutool-aop | JDK動態代理封裝,提供非IOC下的切面支援 |
hutool-bloomFilter | 布隆過濾,提供一些Hash演算法的布隆過濾 |
hutool-cache | 簡單快取實現 |
hutool-core | 核心,包括Bean操作、日期、各種Util等 |
hutool-cron | 定時任務模組,提供類Crontab表示式的定時任務 |
hutool-crypto | 加密解密模組,提供對稱、非對稱和摘要演算法封裝 |
hutool-db | JDBC封裝後的資料操作,基於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-json | JSON實現 |
hutool-captcha | 圖片驗證碼實現 |
hutool-poi | 針對POI中Excel和Word的封裝 |
hutool-socket | 基於Java的NIO和AIO的Socket封裝 |
hutool-jwt | JSON 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的編譯時大致的步驟以及註解的基礎知識,這題就能答上了。
- 註解是有生命週期的
@Retention
有SOURCE、CLASS和RUNTIME 三個常量,使用Lombok的註解就是SOURCE階段的 .java
檔案被編譯的時候,稍微簡化下可以總結為幾個步驟:語法分析->語義分析->註解處理->class檔案- 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庫有fastjson
、Gson
和Jackson
我以前在公司用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 HttpClient
和OkHttp
將其封裝至RestTemplate
- SpringCloud環境下提供
OpenFeign
進而呼叫HTTP服務 - 國產HTTP工具庫
Forest
: 對Httpclient
和OkHttp
進行封裝 - ...
這次我選擇OkHtpp
作為austin的http庫
為什麼OkHtpp
?向前看吧,OkHtpp
作為Http庫確實現在已然成為標杆(至少在安卓火爆了,很多公司的SDK下都用的Okhttp作為Http庫的依賴了)。在Spring環境下RestTemplate
也不太好用,我這專案又沒上SpringCloud,自然就沒用上OpenFeign
。Retrofit
在安卓用得比較多(Java後端貌似相對較少)。
所以我選擇了OkHttp
。
06、總結
這篇文章是來講austin專案所使用到的工具包,對這些已經懂的人看完可能會覺得有點水,沒必要。
但有很多想要跟我一起學習這個專案的同學很多都是沒做過專案的,所以我還是覺得有必要發出來總結下。很多時候我們所做的東西,別人覺得很low,其實就在於資訊差。
我覺得閱讀這篇文章的,肯定也會有某些已經工作的小夥伴是沒聽說過Lombok、沒用過Guava這類工具的(Commons應該多多少少都會用過,可能是潛在地用了,但不知道是有專門的apache工具類庫)。
其實這類工具包在專案裡使用的頻率會非常高,用了這些工具庫會讓我們的專案程式碼變得更加簡潔,程式碼可讀性和維護性對於一個專案而言是非常重要的。
對於這類工具,我的建議是有空的時候上去看看它能提供什麼功能。等發現自己要封裝一個工具類的時候,進去看看它們是不是已經實現了,如果實現了直接用就完事了。如果對功能感興趣的話,看下大佬們是怎麼實現的,如果是自己實現的話可能會有哪些地方沒想到。
肯定還有很多我還不瞭解又非常好用的工具包,求各位在評論區推薦推薦啊!!!這是austin專案的第三篇,目前已經更新至11篇,歡迎跟著我的步伐一起幹專案!
關注我的微信公眾號【Java3y】來聊點不一樣的!【對線面試官+從零編寫Java專案】 持續高強度更新中!求star!!原創不易!!求三連!!
Gitee連結:https://gitee.com/austin
GitHub連結:https://github.com/austin