当前位置: 首页 > 科技观察

Javaer,14个常用的类库,你知道吗?

时间:2023-03-14 00:40:16 科技观察

昨天下载了Java16试试看。一看好家伙,足足有176MB。就算去掉jmc和jvisualvm,还是那么大,真是震撼。但是即使JDK足够大,它的功能也不够。我们需要借助第三方库来完成企业级的开发。比如一个普通的SpringBoot服务,几百兆是轻而易举的事。在这里,让我看看项目中常用的工具库和Jar包,看看Java程序员需要学习多少才能走得更远。1.Netty先给Netty。其实我是自私的,只有当我用Netty开发一些网络应用的时候,我才能自信的不引入越来越重要的Spring,给我一个干净清爽的世界。Netty已经成为最流行的Java网络编程框架。有了它,Java就有了与golang等语言平起平坐的权利。2、SpringBoot在很多中小型公司中,SpringBoot是Java企业级开发的首选。这没什么好说的。由于它的应用太过广泛,这里就不浪费笔墨过多介绍了。Spring当时的目标是干掉J2EE。屠龙少年现在变成了龙,现在他正在做当年J2EE所做的事情。不过,尽可能做到轻量化一直是它的主旋律,这一点从未改变。因为错的不是春天,而是这个世界。3、工具库由于历史原因,apache-commons工具库在项目中几乎无处不在,lang3、beanutils、collections、codec等,个人感觉apache-commons的很多工具已经设计过度了,我很少在一些新项目中使用它们。而是大量使用guava工具库和国内的hutool工具库。有了这些工具,就再也不用在项目中写一些东拼西凑、让人不舒服的小玩意儿了。我来说说一件有趣的事。番石榴这个词很吸引人。中文意思是一种热带水果:番石榴,长得像个小西瓜。4、单元测试JUnit几乎成为了Java单元测试的标准配置。JUnit5对整体模块进行了重构。现在,它包含3个主要模块:JUnitJupiter、JUnitPlatform、JUnitVintage等。Vintage是为了兼容老版本而存在,Platform是为了兼容其他测试引擎而存在,所以在JUnit上使用Mockito是可能的。如果你的项目比较新,建议直接上Jupiter。国外很多系统更强调单元测试,这与国内的开发模式不同。单元测试虽然是程序员的一项基本技能,但距离普及还有很长的路要走。然而,许多公司现在强制要求编写以任务指示器形式存在的单元测试。5、JMHJMH是最强大的基准测试工具套件,主要用于性能测试。如果定位到热点代码,测试其性能数据并评估改进,就可以交给JMH。其测量精度非常高,可达纳秒级。可以消除JIT差异,测试真正的代码性能。JMH已经包含在JDK12中,其他版本需要自己导入maven。6、OkHTTP最新的JDK已经内置了HTTP功能,但是把这种协议级别的东西放在基础类库里不太合适。很长一段时间,Apache的HttpClient一统天下,即使经过重构,不同版本之间也不兼容。我更喜欢轻量级的OkHTTP。第一次见是在Android应用代码中,现在在应用代码中也很香。OKHTTP的透明压缩也比较智能。像SpringCloud这样的组件可以选择切换到底层的HttpClient或者OkHTTP。应用层的协议变化比较大,更新比较快。比如HTTP2、Quic等支持,显然需要对整个类库做大量修改才能适配。7、数据库连接池SpringBoot2默认选择hikaricp作为连接池,据说是最快的连接池,代码量非常精简。c3p0、dbcp等老旧的数据库连接池已经逐渐退位。hikaricp体积很大,采用无锁思想,核心类库只有ConcurrentBag,甚至使用Javassist修改字节码提高执行速度。在国内,另一个被广泛使用的连接池是Druid,它具有完善的监控功能。通过打开后台,可以直接在web端查看整个连接池的状态。8.Caffeine堆内缓存,首选caffeine。很长一段时间,我一直在使用Guava的LoadingCache。自从测试咖啡因后,我决定就是这样。它结合了LRU和LFU。两者结合后,成为一种新的W-TinyLFU算法,具有非常高的命中率和更小的内存占用。在SpringBoot中,通过提供一个CacheManagerBean,就可以与Springboot-cache集成,可以说是非常方便了。9、hazelcast说完了堆的内部,我们来说说堆的外部。除了选择redis,我们还可以选择hazelcast。Hazelcast采用Raft算法进行分布式协调,在一致性方面比Redis强。据hazelcast测试,当达到一定规模时,速度甚至比redis还要快,hazelcast和redis甚至还发生了激烈的口水战。Hazelcast可以以jar包的形式集成到Java应用中。它同时作为客户端和服务器,是一个多节点的集群。它提供了一个像redisson一样功能齐全的分布式数据结构,比如Queue,你只需要在Java代码中直接调用相应的API,它就可以将数据同步到所有节点。10、日志组件日志组件是一个常用的类库。最早广泛使用的是log4j,现阶段比较流行的是slf4j+logback。因为这些库非常好用,所以JDK自带的JUL没人管。slf4j是门面模式的典型应用,它本身就是一组接口,后面可以使用logback和log4j。从上图中我们很容易看出这些关系。11、JSON、XML、YAML解析由于Fastjson漏洞频发,Java中使用最广泛的JSON解析库是jackson库。它的主要入口工具类是ObjectMapper,解析方法是线程安全的,我们可以在整个项目中共享一个解析对象。jackson库不仅可以解析JSON,还可以解析XML、YAML、TOML等,其实它的抽象接口可以实现Avro、Protobuf、CSV等格式数据的加载,但是我们用的最久的还是它的JSON解析。12.Jolokia我相信当年J2EE的目的一定是好的,但是总是把东西弄的又大又笨重。JMS算作一个,JMX算作一个。JMX实际上很难使用,因为它在Java系统内部隔离了功能。目前的Promethus监控系统做的比较好,一切都是HTTP交互的文本格式。Jolokia可以提供JMX的远程访问方式,将JMX接口强制转换成HTTP接口,方便其他监控系统的功能对接。从这个描述来看,Jolokia是一个适配器。但是通过Agent或者Jar包的方式,可以让ActiveMQ、JBoss等过时的系统接入现代监控系统,这也是一个很大的成就。13、hibernate-validatorhibernate留下了一个很大的遗产,就是它的validationframework,它是BeanValidation的参考实现,被广泛应用于数据库模型验证、参数验证等领域。在JPA中,@Table字段可以根据这些验证自动生成数据库约束。在Spring的Controller中,也可以使用@Valid注解来自动对传入的对象进行参数校验。14.freemarkerFreeMarker是一个模板引擎,很久以前,我主要用它来生成网页。不过随着前后端分离的流行,我现在主要是用在一些代码生成工具上。它的应用范围很广,比如制作邮件模板,短信模板等等。如果你写过JSP,你就会知道它的功能都差不多。在Spring中,还有一种更轻量级的模板引擎,称为SPEL——一种表达式语言。您在@Value注释中使用的语法就是它,它们都是相似的技术。End这些类库是我在工作中用的时间最长的,也是我关注最多的。其实一个Spring足够大家折腾了,但是有时候Spring的功能还是不够用,因为它更多的是一个集成的工具,我们不得不关注更底层的技术。多亏了这些稳定可靠的类库,我们的应用开发才能如此之快。你想要什么功能?找个类库,一般都能实现。这就是目前发展的快乐所在。得到这么方便快捷的功能,记得给作者点个赞鼓励一下;如果您遇到问题,提出错误或修复错误,都是默默支持。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。