Java那些事儿
Thinking in Java
GAMELOFT9
读万卷书,行万里路,知行合一。
展开
-
Bean Validation
Bean的校验主要是校验Bean的属性是否满足给定的约束条件。具体实现方式有Hibernate Validator和Spring Validator,它们都是对validation-api的实现。这里主要介绍Hibernate Validator(Hibernate出品的一个校验框架,跟数据库没关系),在Spring MVC的Controller参数校验时会结合用到Spring ...原创 2018-08-15 15:07:08 · 809 阅读 · 0 评论 -
Java正则表达式全模式匹配小坑一记
工作中有这么一个需求,要求二维码备注不能包含一些特殊字符,例如:",',<,>,\,\r,\n。检查的时候用的maches()方法,测试代码如下: String patternStr = "[\n\r\\\\'\"<>]*"; String testStr = "900<"; String testSt...原创 2018-09-04 10:41:24 · 552 阅读 · 0 评论 -
控制hibernate validation校验顺序
背景 项目使用的是hibernate validation校验框架(不懂的可以参考这篇文章:Bean Validation)。对二维码id的校验,需要校验长度及非法字符。由于非法字符是通过正则表达式匹配的,存在效率不高的问题,需要控制下校验顺序,即先校验长度,然后再校验正则表达式。解决方案 hibernage validtaion框架有校验分组的概念,指定校验注...原创 2018-11-21 16:59:07 · 4460 阅读 · 0 评论 -
获取类的所有字段
java获取类的字段有两个方法:getFields()是获取该类的公共字段,包括父类的。getDeclaredFields()是获取该类的所有字段,但不包括父类。如果我想获取该类和所有父类的全部字段呢???我们可以调用getDeclareFilds(),先拿到该类的所有字段,然后循环的取父类,然后继续调用getDeclareFilds(),这样我们就可以拿到所有的字段了。我们还可以判断下名...原创 2019-01-29 11:22:51 · 2793 阅读 · 1 评论 -
BASE64编码字符串解码时堆内存溢出
工作中有一个下载对账的定时任务,通过调用dubbo服务去下载文件。运行一段时间后,发现dubbo超时异常。通过排查发现是序列化超时了。dubbo默认的序列化大小是8MB,而这个文件大约30MB。增大序列化文件大小不可取,无奈只得更改方案:dubbo服务下载对账单文件后,不再返回内容,而是通过启动新线程直接保存到共享存储目录,然后直接返回空内容即可。然后由quartz定时任务去取文件进行后续处理。...原创 2019-03-13 17:02:48 · 7489 阅读 · 2 评论 -
Hibernate Validator 校验继承引发的问题思考
问题再现交易系统对应不同类型的订单请求,公共字段是放在了一个父类里,例如:@Setter@Getterpublic abstract class BaseOrderRequest{ @NotNull @Min(1) @Max(1000000) private Long totalAmount; ......}然后不同类型的下单请求再去继...原创 2019-03-26 18:39:49 · 3903 阅读 · 0 评论 -
LockSupport原理
LockSupport是一个非常基础而重要的类,它为java并发包里的锁和同步类提供了线程阻塞原语。没有它也就没有AQS,更没有上层的各类锁实现(例如ReentrantLock),同步器(例如CountdownLatch),阻塞队列等。LockSupport提供的都是静态方法,例如:public static void park();public static void unpark(Th...原创 2019-05-08 17:35:59 · 1242 阅读 · 0 评论 -
关于LongAdder的一点思考
LongAdder是jdk 1.8引入的一个类,宣称比AtomiLong更高效。它内部有一个基本数base和一个cell数组,在高并发的情况下各个线程将值存放在了数组中,在低并发的情况下直接在一个base数上做计算,取值的时候把基本数和cell数组中的值做累加返回。其实看到取值的时候我是懵的,取值的代码如下: public long sum() { Cell[] as = ce...原创 2019-05-06 10:31:03 · 496 阅读 · 0 评论 -
AtomicBoolean原理
AtomicBoolean是一个原子boolen类,用于高并发场景下的标记,例如某个只需初始化一次的服务:public class SomeService { private String name; private AtomicBoolean initialized = new AtomicBoolean(false); public String getName(...原创 2019-05-07 15:34:23 · 1130 阅读 · 0 评论 -
Shrio源码分析---ShiroFilterFactoryBean
在Spring MVC集成Shiro中,最重要的当属这个ShiroFactoryBean了,可以说是开放给开发者的一个入口。通常的开发配置如下所示:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:jax...原创 2018-07-25 15:02:21 · 403 阅读 · 0 评论 -
Shiro源码分析-----JdbcRealm
在Shiro中,Realm扮演着和DAO类似的中间人角色,通过Realm获取存储在各种地方的用户凭证及权限,但具体怎么获取则交给用户去实现,实现了解耦。我们可以自己实现Realm,来控制如何获取这些数据。不过Shiro已经贴心的实现了一些通用的Realm,如下图所示: 通常我们会将用户密码,用户权限存在关系型数据库里面,因此JdbcRealm应该是最常用的。Jdb...原创 2018-07-24 17:16:36 · 426 阅读 · 0 评论 -
JAVA三个线程依次打印ABC
一、一些简单概述 多线程情形下对共享资源的访问是需要互斥的,比如对一个变量的读写,一个线程读写这个变量的时候,其它线程就不能对这个变量进行读写。Java提供了synchronized关键字来支持互斥,它既可以修饰需要访问共享资源的方法(称为同步方法),也可以直接包裹访问共享资源的代码块(称为同步块)。两种书写形式分别如下://同步方法public synchroniz原创 2016-07-07 15:29:31 · 3736 阅读 · 1 评论 -
Commons CLI 示例
概述 在定时任务中,经常需要通过shell脚本调起各种任务,如图所示:具体的任务实现需要定义一套CLI(命令行接口)。所谓的CLI,就是编写一套命令行接口,然后通过解析命令行,将参数传递给我们的程序去执行相应的任务。最常见的就是我们的java命令,例如:这个java -version就是一个命令行,其中-vresion就是选项。CLI共分为三个阶段,1-定义阶段,2-解析阶段,3-询问阶段,其中定...原创 2018-02-08 17:11:48 · 696 阅读 · 0 评论 -
Java调用Groovy脚本
概述 在Java和Groovy的结合中,经常会碰到需要从Java代码中调起一个写好的Groovy脚本,我们可以通过GroovyShell来实现。其中最重要的就是GroovyShell和Binding两个类,其中GroovyShell可以调起一个Groovy脚本,而Binding可以向脚本里面传递参数。简单示例//通过Binding向要执行的groovy脚本传递变量 Bindi...原创 2018-02-27 14:11:46 · 2242 阅读 · 0 评论 -
org.apache.httpcomponents下的httpclient使用
一、概述 这里只针对4.5的版本进行介绍。项目中经常有需要发送http请求的场景,httpclient很好的解决了这个问题,而且非常易用。maven依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclien...原创 2018-05-16 17:37:35 · 11630 阅读 · 2 评论 -
shiro动态更新权限失败
一、概述 在之前的spring集成shiro权限控制一文中,实现了动态更新的权限的方法,即对权限表做修改后,需要更新到shiro的filterchain。后来测试的时候,发现两个问题:1、更改权限后,并没有动态更新到shiro中去,取消权限的用户仍然可以正常访问。2、权限的写法authec,roles[admin,guest]是逻辑AND的关系,必须用户同时满足两种角色才有权限,而我...原创 2018-07-24 13:49:18 · 1355 阅读 · 1 评论 -
Apollo加载配置小坑一记
公司的配置中心使用的是携程的Apollo配置中心,现在基本上所有的配置文件都迁移到了Apollo里面。Apollo的使用非常方便,实时生效,不需要重启应用。但是有个缺点,就是对配置没有进行校验,如果配置格式或者类型有问题的话,就会抛异常。鉴于此,一些逻辑上的校验就得自己做。例如对下载的账单要进行分割,这个大小不能小于1MB。我在配置的set方法里面做了一点简单的校验,例如账单分割单位billCu...原创 2019-07-12 16:15:20 · 2384 阅读 · 2 评论