我是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-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的编译时大致的步骤以及注解的基础知识,这题就能答上了。

  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面试,对线面试官系列持续更新中!

【对线面试官+从零编写Java项目】 持续高强度更新中!求star!!原创不易!!求三连!!

Gitee链接:https://gitee.com/austin

GitHub链接:https://github.com/austin

Java常用的开发库推荐的更多相关文章

  1. 几款Java常用基础工具库

    通用工具类(字符串.时间格式化.BeanUtils.IO) 1. commons-lang3库 1.1. org.apache.commons.lang3.StringUtils类 日常代码中,我们经 ...

  2. 完美支持Py3的微信开发库推荐

    之前分享了个代码,后来发现中文发送是乱码,应该是加密代码的问题,然后在又找到这个可完美使用的Py3微信库wechatpy:https://github.com/jxtech/wechatpy

  3. 最强常用开发库总结 - JSON库详解

    最强常用开发库总结 - JSON库详解 JSON应用非常广泛,对于Java常用的JSON库要完全掌握.@pdai JSON简介 JSON是什么 JSON 指的是 JavaScript 对象表示法(Ja ...

  4. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...

  5. Java常用的几个Json库,性能强势对比!

    作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...

  6. 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  7. 常用开发库 - MapStruct工具库详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  8. java web 入门级 开发 常用页面调试方法

    这里介绍一下Java web 入门级开发中常用的代码调式方法;  (  仅供入门级童靴 参考) ; 工具: chrome  浏览器 (版本越高越好); Java web 入门级开发 主要就是两个方面: ...

  9. iOS项目开发常用功能静态库

    YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...

随机推荐

  1. Oracle中分割逗号函数REGEXP_SUBSTR

    最近优化FORM中的查询条件遇到某个字段可以选取多个值的问题,思路当然就是选取时将多个值通过某个符号拼接起来,查询数据的时候将拼接后的字符串按照符号分割开,在分割逗号的时候用到了一个新的方法REGEX ...

  2. Python实战之MySQL数据库操作

    1. 要想使Python可以操作MySQL数据库,首先需要安装MySQL-python包,在CentOS上可以使用一下命令来安装 $ sudo yum install MySQL-python 2. ...

  3. jstl中的if标签

    <%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" ...

  4. Redis增加测试数据

    目录 一.简介 二.操作 三.制造测试数据 一.简介 用shell脚本将文本内容挨个写到redis中效率是很慢的.打开一个链接,写入后再关闭,再打开,效率很低. redis支持pipe mode功能, ...

  5. picoctf_2018_rop chain

    拿到题目就知道要用rop来做 老样子日常检查一下 32位的程序开启了nx和relro保护 将程序放入ida中 一眼就看到了程序中的后门程序 我们逐一分析一下 main vuln get没有对输入字符进 ...

  6. idea秘钥集成docker

    目录 docker开启远程访问 docker安全远程访问 服务端 客户端 修改权限 修改docker配置 IDEA集成docker部署项目 1. 新建DockerFile,配置启动服务 2. Dock ...

  7. 静态日志框架Extensioner.Logging

    静态日志框架,输出文本文件,基于log4net扩展,轻量,方便,无侵入! 使用方法 执行Install-Package Extensioner.Logging -Version 2.0.0导入Nuge ...

  8. CF1141C Polycarp Restores Permutation 题解

    Content 给定一个长度为 \(n-1\) 的序列 \(q\),问你是否能找到一个 \(1\sim n\) 的排列 \(p\),使得 \(\forall i\in[1,n)\),\(q_i=p_{ ...

  9. Linux启动、停止宝塔

    启动 /etc/init.d/bt start 停止 /etc/init.d/bt stop

  10. JAVA中数组(Array)、字符串(String)、集合(List、Set)相互转换

    1.数组转List String[] arr = new String[]{"A", "B", "C"}; List list = Arra ...