日常技术
2022-03-17
1296
0
最近工作中有个业务场景非常适合使用责任链模式,且有好几个地方都能使用到。为了写一个比较通用且完善的责任链,阅读了 Spring 框架中一些责任链的实现作为参考。
责任链的应用非常广泛,在 Spring 中都有很多应用,这里分析两个非常常用的功能是如何实现的。
Spring Boot
2021-07-20
2276
2
Spring Validation 验证框架提供了非常便利的参数验证功能,只需要@Validated
或者@Valid
以及一些规则注解即可校验参数。
本人看网上很多 SpringBoot 参数校验教程以 "单个参数校验" 和 "实体类参数校验" 这两个角度来分类(或者"Get 方法"和"Post 方法"分类,实际上也是一样的,甚至这种更容易让人产生误解)。 这种分类很容易让人觉得混乱:注解 @Validated
一会要标在类上面,一会又要标在参数前;异常又要处理BindException
,又要处理ConstraintViolationException
。 刚看的时候可能还记得住,过一段时间就容易记混了,特别是当两种方式同时在一个类里,就不记得到底怎么用,最后可能干脆全部都加上@Validated
注解了。
本文就从校验机制的角度进行分类,SpringBoot 的参数校验有两套机制,执行的时候会同时被两套机制控制。 两套机制除了控制各自的部份外,有部分是重叠的,这部分又会涉及优先级之类的问题。 但是只要知道了两个机制是什么,且了解 Spring 流程,就再也不会搞混了。
JVM
2021-03-01
2137
1
在阅读『深入理解 Java 虚拟机(第 3 版)』时看到里面的一道代码题目,书中给出了题目的解答。自己对于这个题目拓展的想了几个变式,结果有所差异,为了寻找产生差异的原因又深入了解了一番。
在『深入理解 Java 虚拟机(第 3 版)』的 7.2 章节 "类加载的时机",其代码清单 7-1 有这么一段代码:
public class SuperClass {
static {
System.out.println("SuperClass init!");
}
public static int VALUE = 1;
}
public class SubClass extends SuperClass {
static {
System.out.println("SubClass init!");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(SubClass.VALUE);
}
}
Spring Boot
2020-10-26
2287
3
前情提要:
在 Service 调用其他 Service 的 private 方法,@Transactional 会生效吗(上) 中证明了动态代理不会代理 private 方法的,并通过阅读源码证实了。
但是我们可以自己实现一个动态代理功能替代
Spring Boot
中原有的,达到动态代理 private 方法的目的。主要流程为:
- 重新实现一个
ProxyGenerator.generateClassFile()
方法,输出带有 private 方法的代理类字节码数据- 把字节码数据加载到 JVM 中,生成 Class
- 替代
Spring Boot
中默认的动态代理功能,换成我们自己的动态代理。