Java
文章平均质量分 87
dadiyang
Coding like writing poetry.
展开
-
一个简单高效的随机对象生成神器
遇到的问题在日常开发过程中,当我们要编写单元测试或集成测试的时候,我们往往有这样的需求:生成测试对象。这样的对象,我们往往不关心其具体是什么值,只要里面的字段不为空即可(避免空指针、满足数据库表非空约束、参数非空校验约束等)。java.utiil.random 包给我们提供了 nextInt(), nextLong(), nextDouble(), nextFloat(), nextBytes(), nextBoolean() 和 nextGaussian() 这样的函数,用来生成原始类型对象,但是对于原创 2020-11-15 14:58:48 · 2765 阅读 · 0 评论 -
如何导出复杂格式的Excel文件?
前言我们平时开发会需要做一些 Excel 导出的需求,简单快捷的方式是使用 EasyExcel 来做,如果是简单的数据导出,我们可以在POJO上打ExcelProperty注解,然后直接调用 EasyExcel.write 静态方法,一行代码就搞定了!如:// 定义模型@Datapublic class Student { @ExcelProperty(value = "姓名", ...原创 2020-01-30 08:21:28 · 2969 阅读 · 0 评论 -
带定时刷新功能的本地缓存简单实现
写在前面到有些业务场景中,需要在启动的时候取一些比较少改动(但是有可能会改动)而且量也比较小的数据,主要是一些基础配置类的数据。这些数据实时性要求很低,目前的解决方式是放在 redis 做缓存,并设置过期时间,相当于定期刷新。但是,其实还可以更进一步优化。毕竟 redis 跟 web 服务器不在同一台服务器上,也是需要远程IO的(redis很快,一般不用考虑这个问题),因此其实还可以做一级本地...原创 2019-03-12 23:39:04 · 8879 阅读 · 4 评论 -
Java比较两个对象并获取其中不相等的字段
写在前面在工作中,我们经常会遇到这样的需求——比较两个对象是否相等,如果不相等的话,取出不相等的字段。以下这些场景都需要我们对一个对象进行比较:数据比对做单元测试断言对象是否相等前端要求对不相等的字段进行高亮显示这种需求其实是非常简单的,但是如何优雅地解决这一类需求呢?通常的做法是重写对象的 equals 方法。但是重写 equals 方法有很多不便之处,例如:每次对象属性有...原创 2019-03-24 23:22:41 · 15998 阅读 · 37 评论 -
一文搞定 log4j、log4j2、logback 自定义 appender(附完整实例)
缘起随着系统微服务化的开展,越来越多的服务被建立起来,而且服务都布署到公司私有云平台上。这个进程中,日志查看的问题逐渐暴露出来。首先,分布式系统,程序部署在不同的机器上,查询日志需要登录到各台机器上,很不方便;其次,云服务使用 Docker 虚拟技术,当服务重新部署时,机器上的文件会全部抹除,因此日志文件也会因为服务重启或升级导致丢失。所以,目前我们团队非常需要一个分布式日志的解决方案。查了...原创 2019-05-19 23:32:26 · 6536 阅读 · 0 评论 -
记住这 7 条,从此告别 NullPointerException NPE
万恶的 NPE有开发经验的开发人员应该都知道 Java 中的空指针异常 NullPointerException(NPE),当我们试图使用一个值为 null 的对象引用时,就会抛出这个异常。public class NpeDemo{ public static void main(String[] args){ NpeDemo npeDemo = null; ...原创 2019-05-24 14:10:09 · 1224 阅读 · 0 评论 -
为什么阿里代码规约要求避免使用 Apache BeanUtils 进行属性的拷贝
缘起有一次开发过程中,刚好看到一个小伙伴在调用 set 方法,将一个数据库中查询出来的 PO 对象的属性拷贝到 Vo 对象中,类似这样:可以看出,Po 和 Vo 两个类的字段绝大部分是一样的,我们一个个地调用 set 方法只是做了一些重复的冗长的操作。这种操作非常容易出错,因为对象的属性太多,有可能会漏掉一两个,而且肉眼很难察觉。类似这样的操作,我们可以很容易想到,可以通过反射来解决。其实...原创 2019-05-30 13:07:13 · 5340 阅读 · 2 评论 -
Spring 参数校验最佳实践(附完整实例)
前言在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参数校验的时候,会有以下几种类型的处理方式:甩锅型校验太麻烦了,让客户端去负责校验就行了,调用方传错了是调用方的问题,不是服务的问题,甩个 500 错误让他们好好反省:劳模型有多少参数,我就写多少个 if 语句做判断,校验不通过的都写一句友好的提示,如:工具型自己写个参数校验的通用工...原创 2019-06-03 13:02:14 · 6844 阅读 · 3 评论 -
【深度好文】深度分析如何获取方法参数名
发现问题对Java字节码有一定了解的朋友应该知道,Java 在编译的时候,默认会将方法参数名丢弃,因此我们无法在运行时获取参数名称。但是在使用 SpringMVC 的时候,我发现一个奇怪的现象,当我们需要接收请求参数的时候,相应的 Controller 方法只需要正常声明,就可以直接接收正确的参数,例如:注:以下例子使用 maven 进行编译,且非 SpringBoot 项目,SpringB...原创 2019-06-18 13:46:04 · 1176 阅读 · 0 评论 -
【极致】一个 jar 包的自我修养
事事留心皆学问在开发过程中,可能我们天天都是在写一些 CRUD 的业务代码,有些人会觉得无聊,会觉得时间长了也没有长进。但是其实事事留心皆学问,就算是业务代码,也有很多可以提升自己能力的事情可以做,可以学习。我们要做的,就是比别人多走一步,我思考一点。我发现,提供一个公共的 jar 包,很多人都只是对其功能负责,只要功能使用没问题,就算是完事了,但其实远远不够。当用户使用 jar 包的时候,可...原创 2019-07-01 13:10:58 · 694 阅读 · 0 评论 -
从根上讲讲AOP——手敲一个简单的实现
前段时间学习 AOP(面向切面编程) 的知识,翻译了一篇文章:Spring AOP 最热门面试题及答案,没想到发布之后阅读量非常高(看来,标题真的很重要),但其实那篇译文讲得并不是很好,在文章最前面我也说了,只是因为概念介绍比较全面,所以翻译过来加深印象,意想不到的是这篇文章居然在百度“SpringAOP面试”关键词排名第一位。在比较深入的学习了 AOP 的知识并应用于实际开发中,解决了很多问题...原创 2019-08-16 21:57:00 · 2898 阅读 · 5 评论 -
使用 SpringAOP + hibernate-validator 完美实现自动参数校验
在前面的文章《Spring 参数校验最佳实践》 中,我们介绍过 SpringMVC 如何做自动参数校验并通过统一异常处理机制在校验不通过时返回统一的异常。然而这并不完美,如果我们用的是 RequestBody 来接收的参数,一旦校验失败,我们在统一异常处理中并不能获取到完整的参数列表。另外,有些时候我们用的框架可能没有包含参数校验的功能,例如一些 RPC 框架。这种情况下,我们可以通过 Spri...原创 2019-09-28 12:06:16 · 1119 阅读 · 0 评论 -
Java实现 IPv6 与 long 相互转换
缘起前些天写了一篇《ip 地址与 int 整数的相互转换》,公众号 Java面试那些事 转发了这篇文章,有读者评论问到 IPv6 的转换方法,于是抽时间也自己实现了一下。IPv6 定义IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙...原创 2019-03-19 20:00:11 · 6702 阅读 · 2 评论 -
Java多线程:写一下两个线程交替打印 0~100 的奇偶数
面试场景面试官:Java多线程了解吗?你给我写一下,起两个线程交替打印0~100的奇偶数。小黄:啊?面试官:就是有两个线程,一个线程打印奇数另一个打印偶数,它们交替输出。类似这样偶线程:0奇线程:1偶线程:2……奇线程:99偶线程:100小黄:啊?面试官:……嗯。好的。回去等通知吧。解说遇到这种突如其来的面试题,有时候会让人无从下手。尽管可能你学习过多线程的知识,但是面...原创 2019-03-07 19:36:04 · 18330 阅读 · 7 评论 -
Java实现漏斗限流算法
前言最近在学习老钱的《Redis深度历险:核心原理与应用实践》,其中讲到了漏斗限流,在Redis中可以使用 Redis-Cell 模块来做基于Redis的限流方案。在讲解原理的时候,老钱给出了 Python 和 Java 版的实现,看完之后发现其设计非常精妙,于是自己也根据其原理自己动手敲了一下代码,把 Java 版本的漏斗实现出来了。实现代码import java.util.Map;im...原创 2018-09-28 17:38:09 · 6808 阅读 · 5 评论 -
WebSocket使用SockJS原来可以这么简单(附Spring实现完整实例)
基于 SockJS 的 WebSocket在学习 《Spring实战》 第18章的时候才知道,原来在不支持WebSocket的情况下,也可以很简单地实现WebSocket的功能的,方法就是使用 SockJS。它会优先选择WebSocket进行连接,但是当服务器或客户端不支持WebSocket时,会自动在 XHR流、XDR流、iFrame事件源、iFrame HTML文件、XHR轮询、XDR轮询、...原创 2018-11-04 14:19:44 · 27181 阅读 · 0 评论 -
AOP实战:一个面向切面的实战项目,方法级别的简单监控
AOP实战:一个面向切面的实践项目,方法级别的简单监控背景在开发过程中,我们经常会需要对方法进行一些简单的监控,例如监控某个方法的执行时间,必要的时候打印入参和返回值,对抛出的异常进行监控。这样的一些监控点虽然很小,但是这些重复的代码散落在各处而且侵入到业务逻辑当中让业务代码显得非常杂乱。因此,将这个切面抽离出来变得非常有意义,所以有了本项目。(完整代码请查看 simplemonitor)...原创 2018-11-20 02:12:31 · 2953 阅读 · 0 评论 -
完美解决:Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven
少费话,先上代码引入 maven 依赖 <dependency> <groupId>com.github.dadiyang</groupId> &amp原创 2018-12-14 14:34:56 · 9015 阅读 · 57 评论 -
Java如何优雅地调用发送HTTP请求,支持上传和下载文件(GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/TRACE)
HTTP接口调用框架项目地址:https://github.com/dadiyang/http-api-invoker让http调用跟本地方法调用一样自然优雅将http请求url和接口绑定,由框架生成接口的代理类,直接调用接口的方法就会自动构建请求参数并发送请求,然后处理请求响应转换为接口方法的返回值返回(支持泛型)。若与 Spring 集成(可选),更能使用 @Autowired 进行自...原创 2018-12-22 23:21:32 · 4691 阅读 · 10 评论 -
CentOS6和CentOS7环境下RabbitMQ安装配置和非ROOT权限启动及集群搭建最完整教程
前言最近负责的一个项目需要使用 WebSocket 做前后端通信,我使用了Spring提供支持的STOMP协议,它可以解决 WebSocket 消息的语义化和集群状态下各集群节点之间消息共享的问题,例如用户连接了机器 A,但是机器 B需要知道该用户的在线状态和向这个用户推送消息。这是WebSocket集群状态下必然要面对的问题。传统的做法是使用分布式session、redis或者通过消息队列来...原创 2019-01-04 14:26:25 · 4223 阅读 · 1 评论 -
WireMock初体验,一个强大的HTTP 请求模拟测试框架
缘起最近我创建并维护了一个开源项目 http-api-invoker ,该项目实现将 HTTP 请求和接口进行绑定,让 HTTP 接口调用跟调用本地方法一样自然优雅。在写单元测试的时候,因为需要发送 HTTP 请求,而做为一个完整独立的项目,我并不希望对它进行单测还需要依赖其他的项目。最开始我用的是 Mockito。为了让代码更易于测试,我将真正发送请求的任务交给一个接口(Requestor...原创 2018-12-25 23:29:00 · 8660 阅读 · 0 评论 -
打桩(Stubbing), Mocking 和服务虚拟化的差异
译者的话《JUnit实战》开篇第一句话说,所有的代码都需要进行测试。近期准备在团队内部做一次关于单元测试的分享,为了准备这次分享,我把最近探索的一些单元测试的理念和具体方法做了下总结。我发现InfoQ上的这篇文章 stubbing-mocking-service-virtualization-differences 对我的影响比较大。之前写过两篇文章也是因为受到这篇文章的影响而写就的如何利...翻译 2019-01-12 17:24:03 · 4254 阅读 · 0 评论 -
Java用ASM写一个HelloWorld程序
ASM 是什么ASM 官方 的定义是:ASM是一个通用的 Java 字节码操控和分析框架。它可以用于修改已有的类也可以直接以字节数组的方式生成类。ASM 提供了一些常用的字节码转换和分析算法,从中可以构建自定义的复杂转换和源码分析工具。ASM提供了与其他 Java 字节码框架类似的方法,但是更注重性能。因为它被设计和实现成尽可能小和快,所以非常适用于动态系统(当然也可以用于静态的方式,例如在...原创 2019-01-13 13:43:10 · 11646 阅读 · 1 评论 -
ip 地址与 int 整数的相互转换,Java 基于位运算 7 行代码实现
缘起面试官:“Ipv4地址可以转为Long类型的数字知道吧?你写一下这个转换的代码。”对计算机基础逐渐模糊的小黄一脸懵逼,毕竟工作中很少会用到,只记得ip地址和整数是可以相互转换的,但是从来没有自己实现过。于是在大脑中飞速计算。过了一会,思路出现了:ip 地址分为四段,每段都是 0~255 之间的数,每段可以用 8 位来装下它,4x8=32位,也就是可以将ip地址转为 32 位的整数。咦?面试...原创 2019-03-03 23:43:33 · 7655 阅读 · 13 评论 -
给你三个线程,如何让它们交替打印1、2、3
问题提出前几天写了一篇 Java多线程:写一下两个线程交替打印 0~100 的奇偶数 介绍了如果用 wait/notify 控制两个线程交替执行,最后留了一个扩展问题:有三个线程,要求让它们交替输出 1、2、3,打印内容如下:线程1:1线程2:2线程3:3线程1:1线程2:2线程3:3……该如何实现?分析沿用两个线程的交替打印的思路,重点是当第一个线程获取到锁的时候第二个线...原创 2019-03-10 14:28:22 · 10138 阅读 · 5 评论 -
Spring AOP 最热门面试题及答案
译者的话前几天去京东面试,被问到 AOP 相关的问题,之前一直没有系统地学习相关的知识,答得不是很好。趁着假期,找了一下相关的资料,CSDN上有很多不错的文章,看了之后对 AOP 有比较好的理解了。然后 Google 了一下 AOP 相关面试题(AOP interview),搜出来的第一条结果是一个叫 HowToDoInJava 的网站上的一篇文章 Top Spring AOP Intervie...翻译 2018-10-02 00:15:16 · 96303 阅读 · 13 评论