我是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面試,對線面試官系列持續更新中!
【對線面試官+從零編寫Java項目】 持續高強度更新中!求star!!原創不易!!求三連!!
Gitee鏈接:https://gitee.com/austin
GitHub鏈接:https://github.com/austin