我藏東西了!
大家好,我是3y。今天我來(lái)繼續(xù)更新austin項(xiàng)目的文章啦
第零篇簡(jiǎn)單介紹了austin項(xiàng)目做什么用的,這兩個(gè)月我重點(diǎn)會(huì)實(shí)現(xiàn)哪一塊內(nèi)容。
第一篇用Maven+SpringBoot搭好了項(xiàng)目的架子,以及聊了下我對(duì)SpringBoot和Maven的看法。
第二篇聊了下很容易被大家忽略的日志(這在項(xiàng)目中是非常重要的)
這是austin項(xiàng)目系列的第三篇了,今天繼續(xù)來(lái)聊聊Java項(xiàng)目的前期準(zhǔn)備吧(文章到目前為止還是新建文件夾狀態(tài),但項(xiàng)目已經(jīng)是開(kāi)始寫代碼的啦)
(我藏了一堆好用的開(kāi)發(fā)庫(kù))
這一篇來(lái)講講給開(kāi)發(fā)提速的東西了:工具包、Lombok和常用庫(kù)
01、什么是工具包
基本上,每個(gè)項(xiàng)目里都有一個(gè)包,叫做utils。這個(gè)包專門承載我們自己項(xiàng)目的工具類,比如常見(jiàn)的DateUtils、HttpUtils、Collections
所謂Utils就是:這個(gè)東西我們用得很多,但是原API不夠好用,于是我們給它封裝為一個(gè)比較通用的方法
如果是初學(xué)者,很多時(shí)候遇到這種類似的工具類也不會(huì)直接自己開(kāi)寫,會(huì)先去搜索引擎里找一通。找到了之后,看起來(lái)覺(jué)得可以就直接一個(gè)ctrl+c,一個(gè)ctrl +v往自己的main方法一貼,搞點(diǎn)測(cè)試數(shù)據(jù),看能不能work起來(lái)。
能work起來(lái),那就給它取個(gè)名字,放在utils包下。一頓操作過(guò)后,發(fā)現(xiàn)自己這操作姿勢(shì)就是完美!
殊不知,你想要的工具類很可能人家已經(jīng)寫好對(duì)應(yīng)的jar包,比某搜索引擎查到的某博客的代碼可靠多了。
知道有此類jar 的人用得一直很香,不知道的人可能就一直缺什么就去拷貝什么,代碼搞得非常臟亂。

02、Java工具包推薦
在Java領(lǐng)域里,在業(yè)內(nèi)比較出名的工具包有兩個(gè):commons和guava
國(guó)人維護(hù)的一個(gè)工具包:Hutool

如果有相關(guān)的需求的話,我們?cè)陧?xiàng)目代碼中可以盡可能使用這些工具包。它們的代碼一般情況下都會(huì)比我們自己寫的要好,而且工具類就是為了幫我們減少重復(fù)性代碼的,多用會(huì)使項(xiàng)目的可讀性變得更高。
至于它們能干什么,如果沒(méi)了解過(guò)的可以先逛下他們的Guide,稍微了解下這些工具包封裝了什么功能。等到自己要意識(shí)到需要封裝某個(gè)功能時(shí),先把這些工具包的文檔給逛一遍,真的找不到時(shí),沒(méi)有再自己實(shí)現(xiàn)。
不要重復(fù)造輪子,不要重復(fù)造輪子,不要重復(fù)造輪子。
我貼下這些工具包的鏈接?? 大家如果對(duì)這個(gè)不了解的話,建議去看看
https://commons.apache.org/ https://github.com/google/guava/wiki https://www.hutool.cn/docs/#/
我截取hutool文檔的一部分信息,大家稍微可以感受下,我個(gè)人認(rèn)為還是比較全的:
| 模塊 | 介紹 |
|---|---|
| hutool-aop | JDK動(dòng)態(tài)代理封裝,提供非IOC下的切面支持 |
| hutool-bloomFilter | 布隆過(guò)濾,提供一些Hash算法的布隆過(guò)濾 |
| hutool-cache | 簡(jiǎn)單緩存實(shí)現(xiàn) |
| hutool-core | 核心,包括Bean操作、日期、各種Util等 |
| hutool-cron | 定時(shí)任務(wù)模塊,提供類Crontab表達(dá)式的定時(shí)任務(wù) |
| hutool-crypto | 加密解密模塊,提供對(duì)稱、非對(duì)稱和摘要算法封裝 |
| hutool-db | JDBC封裝后的數(shù)據(jù)操作,基于ActiveRecord思想 |
| hutool-dfa | 基于DFA模型的多關(guān)鍵字查找 |
| hutool-extra | 擴(kuò)展模塊,對(duì)第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等) |
| hutool-http | 基于HttpUrlConnection的Http客戶端封裝 |
| hutool-log | 自動(dòng)識(shí)別日志實(shí)現(xiàn)的日志門面 |
| hutool-script | 腳本執(zhí)行封裝,例如Javascript |
| hutool-setting | 功能更強(qiáng)大的Setting配置文件和Properties封裝 |
| hutool-system | 系統(tǒng)參數(shù)調(diào)用封裝(JVM信息等) |
| hutool-json | JSON實(shí)現(xiàn) |
| hutool-captcha | 圖片驗(yàn)證碼實(shí)現(xiàn) |
| hutool-poi | 針對(duì)POI中Excel和Word的封裝 |
| hutool-socket | 基于Java的NIO和AIO的Socket封裝 |
| hutool-jwt | JSON Web Token (JWT)封裝實(shí)現(xiàn) |
03、Lombok
我是在實(shí)習(xí)的時(shí)候接觸Lombok這個(gè)工具的。他給我的第一感受就是:再也不用自己生成set/get方法了
其實(shí)用上了IDE以后,生成set/get方法就是一個(gè)快捷鍵的事,但是每當(dāng)我們要增加/刪除/修改類的屬性時(shí),我們都需要額外去為這些變動(dòng)去生成一次。不過(guò),這好像也不是事。畢竟增加/刪除/修改的工作也不是特別多。
其實(shí)Lombok能做的事不僅僅只有set/get方法,用上了以后我還是比較推薦用的。像@Builder、@Slf4j、@Data這些注解我在項(xiàng)目中是經(jīng)常用到的,如果還對(duì)Lombok不了解的話,可以去它的官網(wǎng)觀望一波。
https://projectlombok.org/features/all
有沒(méi)有人會(huì)好奇Lombok它是怎么做到的?曾經(jīng)有個(gè)群里的小伙伴有遇到過(guò)這個(gè)面試題:你知道Lombok的原理是什么嗎?
這個(gè)我在《對(duì)線面試官》系列的第一篇《注解》曾經(jīng)聊過(guò)。其實(shí)不是特別復(fù)雜的東西,我們只要能想出Java的編譯時(shí)大致的步驟以及注解的基礎(chǔ)知識(shí),這題就能答上了。
注解是有生命周期的 @Retention有SOURCE、CLASS和RUNTIME 三個(gè)常量,使用Lombok的注解就是SOURCE階段的.java文件被編譯的時(shí)候,稍微簡(jiǎn)化下可以總結(jié)為幾個(gè)步驟:語(yǔ)法分析->語(yǔ)義分析->注解處理->class文件JDK提供了Hook,我們想要在編譯時(shí)期做注解相關(guān)的事,可以繼承AbstractProcessor 并實(shí)現(xiàn)process方法(Lombok就是這么干的)

04、JSON庫(kù)
現(xiàn)在Java后端開(kāi)發(fā)基本上是離不開(kāi)JSON了,所以我們需要有JSON庫(kù)幫我們做序列化和反序列化
前后端接口之間的交互基本上都是JSON格式了 我們有的時(shí)候?yàn)榱朔奖悖矔?huì)直接把數(shù)據(jù)直接轉(zhuǎn)成JSON存儲(chǔ)起來(lái)(這里的存儲(chǔ)可以是MySQL,可以是HBase,可以是Redis 等等) ...
寫到這里,我翻看了下我以前大學(xué)時(shí)候的學(xué)習(xí)筆記。我以前剛學(xué)JSON的時(shí)候,那時(shí)候跟著視頻在學(xué)Spring和Strtus2,他倆都內(nèi)置了JSON的解析庫(kù)。我當(dāng)時(shí)的水平,跟著視頻學(xué)習(xí)調(diào)個(gè)API對(duì)我沒(méi)什么難度的,所以也不以為然。
沒(méi)想到,那時(shí)候視頻教程還教我:如果拋離了Spring和Struts2環(huán)境下,那該怎么方便地操作JSON,然后在classpath果斷引入了json-lib的包...看回以前大學(xué)的筆記,真的是回憶滿滿...
不扯別的了,說(shuō)回現(xiàn)在吧?,F(xiàn)在Java后端一般使用比較多的JSON庫(kù)有fastjson、Gson和Jackson

我以前在公司用FastJson比較多的,API使用非常簡(jiǎn)單,日常用得也很舒服。但是,我是經(jīng)歷過(guò)曾經(jīng)要強(qiáng)制升級(jí)fastjson版本的人!應(yīng)該是19年吧,那時(shí)候安全團(tuán)隊(duì)告訴我們需要強(qiáng)制升級(jí)fastjson的版本,大概就是fastjson有漏洞,一定得升級(jí)。這我們作為庫(kù)的使用方,沒(méi)辦法,那只能升級(jí)吧。
結(jié)果,沒(méi)過(guò)幾天。安全團(tuán)隊(duì)又拉了個(gè)群,說(shuō)還是得升級(jí)xxx版本以上,之前升級(jí)過(guò)的版本還有問(wèn)題...團(tuán)隊(duì)內(nèi)為了升級(jí)fastjson版本也遇到過(guò)其他的坑,反正就被弄得很煩。
網(wǎng)上也有很多對(duì)比這幾個(gè)JSON庫(kù)的文章(主要的指標(biāo)是性能、穩(wěn)定),有興趣的小伙伴可以去讀讀。

不過(guò),austin項(xiàng)目還是選擇fastjson作為JSON主要的序列化庫(kù)(多點(diǎn)包容)
05、HTTP庫(kù)
本來(lái)HTTP庫(kù)我是已經(jīng)忘的了。但正當(dāng)我要實(shí)現(xiàn)發(fā)送短信功能的時(shí)候,我才恍然想起,HTTP也是經(jīng)常用到的??!于是火急地在發(fā)送文章之前補(bǔ)充下。
不知道你們第一次用Java調(diào)用HTTP的時(shí)候,是什么心情。在我印象里,就覺(jué)得這東西復(fù)雜得一批,調(diào)個(gè)HTTP真麻煩!后來(lái),工作了以后,在項(xiàng)目里已經(jīng)有大佬封裝過(guò)HTTP啦。但還是有的時(shí)候,覺(jué)得HTTP調(diào)用就是那么的復(fù)雜(哎,各種頭信息,一不小心設(shè)置錯(cuò),那就是半天)
但不管怎么樣,HTTP調(diào)用是非常常見(jiàn)的,很多公司對(duì)外的接口幾乎都會(huì)提供HTTP調(diào)用。比如我們調(diào)用騰訊的API下發(fā)微信類消息,調(diào)用各個(gè)渠道商發(fā)送短信等等等。
扯遠(yuǎn)了,還是先回到HTTP庫(kù)吧。在Java生態(tài)中,HTTP庫(kù)可以大致分為三類:
HttpURLConnection Apache HttpClient OkHttp

HttpURLConnection是JDK原始提供的HTTP庫(kù),它是沒(méi)有實(shí)現(xiàn)HTTP連接池的(連接池還是非常重要的,池的概念我在這就不過(guò)于解釋了)。我之前項(xiàng)目用的HTTP庫(kù)都是Apache HttpClient 基礎(chǔ)上封裝的(Apache 出品的質(zhì)量也有保證),而OkHttp可以說(shuō)是后起之秀了(現(xiàn)在安卓端的HTTP庫(kù)基本都是基于OkHttp)
一般我們使用這些HTTP工具庫(kù),都需要在原生的基礎(chǔ)上再寫Utils來(lái)簡(jiǎn)化對(duì)HTTP的調(diào)用,有Utils環(huán)境下就會(huì)有各類的工具包:
比如,上面提到的 Hutool就對(duì)原生的HttpURLConnection進(jìn)行封裝(不過(guò)其封裝是沒(méi)用線程池)Square公司對(duì)自己出品的 OkHttp又進(jìn)行二次封裝,開(kāi)源出Retrofit(這個(gè)在安卓用得很多)Spring環(huán)境下提供 RestTemplate多種訪問(wèn)遠(yuǎn)程Http服務(wù)的方法(默認(rèn)情況下是無(wú)線程池的,但可以使用Apache HttpClient和OkHttp將其封裝至RestTemplateSpringCloud環(huán)境下提供 OpenFeign進(jìn)而調(diào)用HTTP服務(wù)國(guó)產(chǎn)HTTP工具庫(kù) Forest:對(duì)Httpclient和OkHttp進(jìn)行封裝...

這次我選擇OkHtpp作為austin的http庫(kù)
為什么OkHtpp?向前看吧,OkHtpp作為Http庫(kù)確實(shí)現(xiàn)在已然成為標(biāo)桿(至少在安卓火爆了,很多公司的SDK下都用的Okhttp作為Http庫(kù)的依賴了)。在Spring環(huán)境下RestTemplate也不太好用,我這項(xiàng)目又沒(méi)上SpringCloud,自然就沒(méi)用上OpenFeign。Retrofit在安卓用得比較多(Java后端貌似相對(duì)較少)。
所以我選擇了OkHttp。
06、總結(jié)
這篇文章是來(lái)講austin項(xiàng)目所使用到的工具包,對(duì)這些已經(jīng)懂的人看完可能會(huì)覺(jué)得有點(diǎn)水,沒(méi)必要。
但有很多想要跟我一起學(xué)習(xí)這個(gè)項(xiàng)目的同學(xué)很多都是沒(méi)做過(guò)項(xiàng)目的,所以我還是覺(jué)得有必要發(fā)出來(lái)總結(jié)下。很多時(shí)候我們所做的東西,別人覺(jué)得很low,其實(shí)就在于信息差。
我覺(jué)得閱讀這篇文章的,肯定也會(huì)有某些已經(jīng)工作的小伙伴是沒(méi)聽(tīng)說(shuō)過(guò)Lombok、沒(méi)用過(guò)Guava這類工具的(Commons應(yīng)該多多少少都會(huì)用過(guò),可能是潛在地用了,但不知道是有專門的apache工具類庫(kù))。
其實(shí)這類工具包在項(xiàng)目里使用的頻率會(huì)非常高,用了這些工具庫(kù)會(huì)讓我們的項(xiàng)目代碼變得更加簡(jiǎn)潔,代碼可讀性和維護(hù)性對(duì)于一個(gè)項(xiàng)目而言是非常重要的。
對(duì)于這類工具,我的建議是有空的時(shí)候上去看看它能提供什么功能。等發(fā)現(xiàn)自己要封裝一個(gè)工具類的時(shí)候,進(jìn)去看看它們是不是已經(jīng)實(shí)現(xiàn)了,如果實(shí)現(xiàn)了直接用就完事了。如果對(duì)功能感興趣的話,看下大佬們是怎么實(shí)現(xiàn)的,如果是自己實(shí)現(xiàn)的話可能會(huì)有哪些地方?jīng)]想到。

肯定還有很多我還不了解又非常好用的工具包,求各位在評(píng)論區(qū)推薦推薦?。。?!
《對(duì)線面試官》公眾號(hào)還在持續(xù)分享面試題,沒(méi)關(guān)注的同學(xué)可以關(guān)注一波!這是austin項(xiàng)目的上一個(gè)系列,質(zhì)量桿桿的。持續(xù)的創(chuàng)作離不開(kāi)你的點(diǎn)贊和轉(zhuǎn)發(fā)分享!
