This website requires JavaScript.

责任链模式在 Spring 中的应用

前言

最近工作中有个业务场景非常适合使用责任链模式,且有好几个地方都能使用到。为了写一个比较通用且完善的责任链,阅读了 Spring 框架中一些责任链的实现作为参考。

Spring 中责任链模式的应用

责任链的应用非常广泛,在 Spring 中都有很多应用,这里分析两个非常常用的功能是如何实现的。

Read more

详解SptingBoot参数校验机制,使用校验不再混乱

前言

Spring Validation 验证框架提供了非常便利的参数验证功能,只需要@Validated或者@Valid以及一些规则注解即可校验参数。

本人看网上很多 SpringBoot 参数校验教程以 "单个参数校验""实体类参数校验" 这两个角度来分类(或者"Get 方法"和"Post 方法"分类,实际上也是一样的,甚至这种更容易让人产生误解)。 这种分类很容易让人觉得混乱:注解 @Validated一会要标在类上面,一会又要标在参数前;异常又要处理BindException,又要处理ConstraintViolationException。 刚看的时候可能还记得住,过一段时间就容易记混了,特别是当两种方式同时在一个类里,就不记得到底怎么用,最后可能干脆全部都加上@Validated注解了。

本文就从校验机制的角度进行分类,SpringBoot 的参数校验有两套机制,执行的时候会同时被两套机制控制。 两套机制除了控制各自的部份外,有部分是重叠的,这部分又会涉及优先级之类的问题。 但是只要知道了两个机制是什么,且了解 Spring 流程,就再也不会搞混了。

Read more

树莓派 Docker 部署使用 Openwrt

环境

  • 硬件:树莓派 4B 4G 内存
  • 系统:RaspbianOS 32 位系统

Snipaste_2021-05-15_15-57-21

Read more

《深入理解 Java 虚拟机》中一题引发的思考

1 - 引言

在阅读『深入理解 Java 虚拟机(第 3 版)』时看到里面的一道代码题目,书中给出了题目的解答。自己对于这个题目拓展的想了几个变式,结果有所差异,为了寻找产生差异的原因又深入了解了一番。

2 - 类初始化时机

2.1 - 原题

在『深入理解 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);
    }
}
Read more

Service 调用其他 Service 的 private 方法,@Transactional 会生效吗(下)

前情提要:

Service 调用其他 Service 的 private 方法,@Transactional 会生效吗(上) 中证明了动态代理不会代理 private 方法的,并通过阅读源码证实了。

但是我们可以自己实现一个动态代理功能替代Spring Boot中原有的,达到动态代理 private 方法的目的。

主要流程为:

  1. 重新实现一个ProxyGenerator.generateClassFile()方法,输出带有 private 方法的代理类字节码数据
  2. 把字节码数据加载到 JVM 中,生成 Class
  3. 替代Spring Boot中默认的动态代理功能,换成我们自己的动态代理。
Read more