
工具开发
文章平均质量分 91
西红柿系番茄
知其然,知其所以然。
展开
-
模块化开发---实现模块的动态加载与卸载
在工作中,由于我是主要负责直播APP的运营活动开发,这些活动代码有两大特性活动周期短,通常只是一个节日、一个星期、十天、一个月等,所以导致代码用于运行的时间短。原创 2021-05-30 17:13:25 · 1880 阅读 · 4 评论 -
Java Instrument实践应用:运行中修改程序的Class
Provides services that allow Java programming language agents to instrument programs running on the JVM. The mechanism for instrumentation is modification of the byte-codes of methods.【用于允许Java编程语言代理检测运行在JVM上的程序提供服务。检测的机制是修改方法的字节码。】这是java.lang.instrum...原创 2021-04-24 04:21:32 · 1199 阅读 · 1 评论 -
Filebeat+Elasticsearch+Kibana进阶:格式化日志
“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Logstash虽然功能强大,但是很笨重。Filebeat是轻量型的单一功能数据采集器,占用资源更少原创 2021-04-18 03:40:38 · 2799 阅读 · 0 评论 -
实现优先级队列的线程池
回顾一下线程池的优点和原理优点降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。原理在实际的开发中,会将各种不同的异步任务提交到线程池执行,它们有轻重缓急。如果任务量少,一来就有空闲线程处理,哦那没事了。如果任务量多,我们希望任务队列根据任务的优先级有序存原创 2021-02-08 16:28:21 · 3874 阅读 · 1 评论 -
Java程序将视频转化为动图
1、引入依赖 <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId>原创 2020-11-03 12:20:30 · 2287 阅读 · 8 评论 -
Java使用Jsoup和Selenium抓取西瓜小视频
最近在家里无聊每天刷头条,看到一个很可爱的小姐姐,突然蹦出一个主意,就是想把它这些视频全部搞下来存到本地。网上搜了一下,发现这些视频其实是来自西瓜视频,根据用户名搜索就找到了。刚好会一点爬虫,这下就好办了。跟Python的requests和bs4一样,Java也有HttpClient和Jsoup分别用于发送请求和解析网页。因为Jsoup同时也具备发送请求的功能,并且本例也不涉及复杂的请求,...原创 2020-02-04 23:40:08 · 4479 阅读 · 2 评论 -
使用POI导入导出大数据量的Excel
昨天,产品提了一个紧急需求,让把十一月份已发货的商品数据导出来,写好SQL发给DBA执行之后,得到了三十多个100W数据的Excel文件。有一个属性是以JSON格式存在表中一个字段里面的,需要加工Excel文件将其单独取出来(如图的第四列)。处理程序也在数据导出的过程中写好了,大概思路就是读入Excel构建Workbook对象,然后对指定列的值进行转换,最后写回原文件。想法很奈斯,结果很悲...原创 2020-01-11 19:09:31 · 3615 阅读 · 0 评论 -
好玩的编译时注解处理工具——APT
大家对Java中的注解(Annotation)应该都不陌生吧,JDK1.5就引进来了,它本质上只是一种元数据,和配置文件一样。利用反射在运行时解析处理能够实现各种灵活强大的功能,比如Spring就将其作用发挥得淋漓尽致。至于用法,这里就不说了,我的其它文章里面很多地方有用到过,可以参考一下。一、运行时注解与编译时注解我们看到的大部分注解,它们都是在代码运行时才使用的,所以一般定义成这样...原创 2020-01-05 19:21:21 · 1991 阅读 · 3 评论 -
字节码操纵技术探秘
大家可能已经非常熟悉下面的处理流程:将一个“.java”文件输入到 Java 编译器中(可能会使用 javac,也可能像 ANT、Maven 或 Gradle 这样的构建工具),编译器对其进行分析,最终生成一个或多个“.class”文件。图 1:什么是 Java 字节码?如果从命令行中运行构建,并启用 verbose 的话,我们能够看到解析文件直到生成“.class”文件这一过程的输出...转载 2019-11-08 16:32:47 · 506 阅读 · 0 评论 -
布隆过滤器原理解析
在撸码的时候,经常要判断一个元素是否已经存在。常用的做法是,把已经存在的元素全部存储到一个集合里,然后新的元素查一下看它是否在集合里来确定是否已经存在。这个集合的数据结构,一般我们会采用HashMap,它可以在O(1)的时间复杂度内返回结果,效率奇高。但是会带来一个问题,就是每条数据都完整地存储在集合里,量大的时候,占据的内存空间是个问题。如果你刚好遇到这方面的问题,那么可以考虑一下布隆过滤器...原创 2019-11-07 23:20:38 · 763 阅读 · 0 评论 -
SpringBoot+Mybatis配置多数据源并且实现事务一致性
最近博客写得少,不知道怎么说开场白了。呃,本文一共分三部分:SpringBoot+Mybatis环境搭建、两种方式配置多数据源、两种方式实现跨数据源事务,您可以直接跳到喜欢的部分,不过按顺序看完也不会花很多时间。。。一、搭建SpringBoot+Mybatis框架环境看标题就知道,这部分不是重点,所以简单说一下(如果你是小白那对不起了~)。1、引入依赖Mybatis整合包和jdbc...原创 2019-10-28 00:43:54 · 18172 阅读 · 10 评论 -
使用Selenium实现直播平台的自动刷屏
本文项目Github地址:https://github.com/zhouhuanghua/auto-flood-screen最近,电竞圈LOL届最大的瓜非"蓝公主"莫属。本来,我也只是一名吃瓜群众,感觉都无所谓。但是,后面Baolan的亲妈粉闪现开团:嘲讽皇族官宣香锅退役是蹭热度,抢走了宝蓝生日的风头。这就不能忍了,作为RNG的忠实铁粉,而且还是香锅退役这么隆重的事情。怎么办呢?只能去最多人可...原创 2019-07-19 21:56:42 · 3961 阅读 · 0 评论 -
自己动手写任务调度平台
本文项目Github地址:https://github.com/zhouhuanghua/z-job什么是任务调度平台呢?暂时不做解释,先来看一下定时器的发展历史吧!首先,new Thread + while (true) + Thread.sleep的方式,虽然很low但是起码能够实现对吧——这种方式的问题是过于占用资源,定时任务一多就暴露出来了。然后,就是利用一些框架,比如JDK提...原创 2019-07-11 18:16:35 · 2341 阅读 · 0 评论 -
代码生成器核心思路
代码生成器相信大家都见过或者用过吧?最典型的就是MyBatis那个生成实体类和Mapper文件的工具。显然,代码自动生成可以减少一些重复代码的编写,从而提高开发效率。代码生成工具主要做法就是使用模板引擎,把公共的部分抽取出来形成一个模板,对于变化的一些数据暂时使用占位符标记。到了生成具体代码的时候,就把占位符替换成实际需要的内容。下面就做一个根据MySQL数据库表自动生成实体类的小案例,希...原创 2019-06-26 01:05:49 · 1439 阅读 · 0 评论 -
自己动手写MyBatis框架
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。至于怎么使用,源码分析就不讲了,来直接实...原创 2019-01-26 16:31:06 · 1762 阅读 · 1 评论 -
Spring Advice插件平台开发
本文介绍的内容可能没有太多的用处,纯属个人爱好和异想天开,主要是想加深一下Spring AOP的认识。先来看一下结构图 再看一下效果图 接下来,开始开发工作吧一、定义插件实体类 /** * 主键 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) ...原创 2018-08-05 19:06:56 · 876 阅读 · 2 评论 -
Maven插件开发:根据库表生成实体类&根据实体类生成库表
在码农的日常生活中,复杂度低但是工作量大的工作莫过于根据已有的表写对应的实体类。当字段多的时候,那叫一个苦啊!于是,很多代码生成器应运而生,最流行的莫过于Mybatis-Generator,自动生成Entity、Dao、Mapper,确实是一个不错的工具。但是,以博主的了解,这个工具还是有一些缺点的,算是鸡蛋里挑骨头吧:样式是固定的,有时候不符合我们的习惯(当然,大神可以去改源码)。现在呢,我...原创 2018-07-28 11:46:06 · 7934 阅读 · 6 评论 -
窥探p6spy的实现原理,抽取核心代码完成自己的SQL执行监控器
某一天线上项目突然炸了,报障说出现系统登录不了、数据查询超慢等一系列问题...奇怪,之前明明还跑的好好的,怎么会这样子了呢?后来我们的数据库大神(还是妹子哦)查了数据库,统计执行比较耗时的SQL语句,对其中的一些字段临时加了索引,问题算是暂时解决了,给她点个赞QAQ。这个时候,我就萌发了一个想法,可否在项目里面引入一个监控、记录SQL运行情况的功能,并提供查询接口和显示界面。说干就干,首先...原创 2018-11-25 13:14:43 · 3411 阅读 · 6 评论 -
Spring AOP实现多数据源切换
有时候我们会遇到这样的场景:一个应用系统中存在多个数据源,需要根据不同业务场景进行临时切换。比如读写分离(也可以考虑使用Mycat等数据库中间件)等。Spring提供了动态数据源的功能,可以让我们实现在对数据库操作前进行切换。下面我们演示怎么在项目中配置多数据源并根据不用业务场景进行切换(本文涉及到Spring Boot和Spring Data Jpa,相关内容及配置不做详解)。1、在...原创 2018-11-30 22:44:07 · 5006 阅读 · 1 评论 -
解读Mybatis Plus的ActiveRecord,并实现Spring Data JPA版本的AR
之前在做自己项目使用Mybatis的时候,一次偶然的机会看到了Mybatis Plus并使用了起来。不得不说,这个工具真的给开发提供了很大的便利性,推荐大家去试一下。特别是,它的ActiveRecord模式深深的吸引住了我:只要实体类继承一个类,并重写获取主键的值的方法,就可以使用实例对象去调用简单的增删改查方法。于是,我决定窥探一下Mybatis Plus工具的ActiveRecord模式。...原创 2018-11-10 15:56:00 · 4555 阅读 · 0 评论 -
利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性
作为一名专门写bug的Java程序猿,相信大家都会遇到过这样的问题:项目的业务逻辑很复杂,而且还经常变化,今天的一个办理条件是小于5,明天就变成了大于10或者条件作废。这就很头疼了,里面的数字可以抽取到配置文件,但是大于和小于呢?条件作废呢?对于业务规则的复杂性,我们可以使用一些规则引擎来解决代码可读性差的问题。市面上也有不少的规则引擎框架,开源的不开源的,收费的不收费的,我们这里推荐使用的是...原创 2018-12-19 17:05:43 · 17805 阅读 · 14 评论 -
Redis分布式锁
先看一个例子:在商品秒杀活动中,多个线程一起进行下单,它们首先查询库存数量,接着判断是否符合条件,然后保存订单信息,最后将库存数量减一后更新到数据库。在这个过程中,存在着共享资源(库存数量),而且一系列的操作没有原子性(每个环节之间都可能被其它线程抢走了CPU执行权)。所以,就存在着线程安全问题,表现出来的结果通常就是“商品超卖”。下面我们用代码模拟一下这个场景:1、定义两种商品1和2,并...原创 2018-08-05 01:06:05 · 530 阅读 · 0 评论 -
利用自定义注解和Aspect实现方法参数的非空校验
日常开发过程中,最常见的异常莫过于NullPointerException,相信大家都对它恨之入骨吧。我也是。空指针异常出现的原因有以下几种: 调用 null 对象的实例方法。 访问或修改 null 对象的字段。 如果一个数组为null,试图用属性length获得其长度时。 如果一个数组为null,试图访问或修改其中某个元素时。 在需要抛出一个异常...原创 2019-01-02 23:42:46 · 4035 阅读 · 2 评论 -
自己动手写RPC框架
在上一篇博客中,介绍了RPC的主要概念和实现原理,然后基于TCP协议实现了一个非常简单的RPC小案例(点此回顾)。现在,自我挑战一下,动手写一个RPC框架。高能预警:本文涉及到的知识点如下Spring Boot2:起步依赖、自动配置,让应用开发变得简单 Spring的Java Bean配置,条件注解:灵活控制注入 基于JDK接口的动态代理(了解一下?):发起远程调用对服务消费者来说...原创 2019-01-13 02:08:02 · 3975 阅读 · 18 评论 -
利用Aspect/Javassist/动态代理/Lombok等方式省略Controller的参数校验结果处理代码
开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已。那么有什么办法可以省去这么繁琐的工作呢?当然,利用自定义注解和Spring AOP可以做到,参考我的另一篇博客:利用自定义注解和Aspect实现方法参数的非空校验。但是,自己弄有点重复发明轮子的意思,因为spring已经提供了一套完整的validat...原创 2019-01-19 00:46:26 · 1641 阅读 · 0 评论 -
自己动手写SpringMVC框架
上一篇文章中详细讲解了Spring MVC的运行流程源码(点击传送),现在我们自己动手来模仿写一个,主要是为了加深理解。一、效果预览1、配置前端控制器,指定配置文件路径2、配置Controller扫描包和静态资源3、使用自定义注解声明控制器和访问路径、请求方式4、成功时 5、 请求路径不存在或者参数不正确时二、整体流程和项目结构1、请求处...原创 2019-01-25 19:02:02 · 1105 阅读 · 0 评论 -
自定义maven插件:自动生成API的word文档
继上次开发完Maven插件开发:根据库表生成实体类&根据实体类生成库表之后,博主对开发maven插件喜爱得一塌糊涂。这不,今天给大家带来了《自定义maven插件:自动生成API的word文档》。老规矩,先上镇楼图。(读者们也可以研究下Swagger2生成doc文档)开门见山,直接上开发教程!首先是插件配置:<plugin> &l...原创 2018-07-29 23:47:35 · 5346 阅读 · 9 评论