lock4j 不生效的问题(个人原因导致的)

公司里有个生成递增单号的工具类:

复制代码
@Component
public class GeneratorCodeUtils {

    // 表单编号新起点值
    private final static Long UPGRADE_NEW_START = 1000000L;

    @Lock4j(keys = {"#code"}, acquireTimeout = 3000, expire = 10000)
    public static String generateFormNo(String code) {
        // 如果Redis中不存在当前code对应的键值,则初始化为UPGRADE_NEW_START,否则递增
        if (!RedisUtils.hasKey(code)) {
            RedisUtils.setAtomicValue(code, UPGRADE_NEW_START);
        } else {
            RedisUtils.incrAtomicValue(code);
        }
        // 返回格式化后的表单编号
        return code + RedisUtils.getAtomicValue(code);
    }

}

这个工具类采用了 lock4j 的方式实现分布式锁,以避免并发问题。

但我在实际测试中发现这个分布式锁根本没有生效,于是思考了一下问题出在哪里。

然后想到 Lock4j 基于 AOP 实现的, AOP 又是基于动态代理实现的,而 static 意为"静态",那么会不会 static 与 "动态代理"是冲突的呢?

查了一下,果然static 方法是不能被AOP动态代理的。因为动态代理通过代理的方式获取到代理的具体对象,而static是不属于对象的,是属于类。所以静态方法是不能被重写的,正因为不能被重写,所以动态代理也不成立。毕竟不管是jdk和cglib动态代理,都是需要实现或者重写方法的。

所以如果要让这个工具类中的 lock4j 正常生效,必须要将方法上的 static 去掉。

参考链接:

1、static方法能被AOP动态代理吗?_static方法为什么不能动态代理-CSDN博客

相关推荐
小瓦码J码16 小时前
轻量化线程池实战:忙时并发、闲时归零,搞定周期批量任务
java·后端
NagatoYukee16 小时前
Java 商品交易实验(第二版)
java·开发语言
百珏16 小时前
[灰度发布]:灰度流量如何匹配与识别:从特征补全到网关命中引擎
java·后端·架构
接着奏乐接着舞16 小时前
springboot mybatis
spring·tomcat·mybatis
Misnearch16 小时前
1345. 跳跃游戏 IV
java·leetcode·bfs
Bechamz16 小时前
大数据开发学习Day34
java·大数据·学习
JoneBB16 小时前
ABAP上传EXCEL模板并将内表内容存到两个sheet中
java·前端·数据库
手揽回忆怎么睡16 小时前
分卷打包命令
java
openinstall全渠道统计16 小时前
电商App推广统计方案有哪些?从广告到下单追踪解析
java·eclipse·教育电商
夕除16 小时前
spring boot 8
java·开发语言