当前位置: 首页 > news >正文

在非Spring Boot的Spring项目中使用Lock4j

在非Spring Boot的Spring项目中使用Lock4j

Lock4j虽然主要面向Spring Boot项目,但也可以在传统的Spring项目中使用。以下是配置和使用步骤:

1. 添加依赖

<dependency><groupId>com.baomidou</groupId><artifactId>lock4j-core</artifactId><version>最新版本</version>
</dependency><!-- 根据你选择的锁实现添加对应依赖 -->
<!-- 使用Redisson实现 -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.1</version>
</dependency>

2. Spring XML配置方式

基础配置

<!-- 配置Redisson客户端 -->
<bean id="redissonClient" class="org.redisson.api.Redisson" factory-method="create"><constructor-arg><bean class="org.redisson.config.Config"><property name="singleServerConfig"><bean class="org.redisson.config.SingleServerConfig"><property name="address" value="redis://127.0.0.1:6379"/></bean></property></bean></constructor-arg>
</bean><!-- 配置Lock4j -->
<bean id="lockTemplate" class="com.baomidou.lock.spring.LockTemplate"><property name="lockExecutor" ref="redissonLockExecutor"/>
</bean><bean id="redissonLockExecutor" class="com.baomidou.lock.redisson.RedissonLockExecutor"><property name="redissonClient" ref="redissonClient"/>
</bean><!-- 启用Lock4j注解支持 -->
<bean class="com.baomidou.lock.spring.Lock4jAspect"/>

属性配置

在properties文件中添加:

lock4j.acquire-timeout=3000
lock4j.expire=30000

然后在XML中配置属性处理器:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:config.properties</value></list></property>
</bean><bean class="com.baomidou.lock.spring.Lock4jProperties"><property name="acquireTimeout" value="${lock4j.acquire-timeout}"/><property name="expire" value="${lock4j.expire}"/>
</bean>

3. 纯Java配置方式

如果你使用Java配置类:

@Configuration
@EnableAspectJAutoProxy
public class Lock4jConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");return Redisson.create(config);}@Beanpublic Lock4jProperties lock4jProperties() {Lock4jProperties properties = new Lock4jProperties();properties.setAcquireTimeout(3000);properties.setExpire(30000);return properties;}@Beanpublic LockTemplate lockTemplate(RedissonClient redissonClient) {LockTemplate lockTemplate = new LockTemplate();lockTemplate.setLockExecutor(redissonLockExecutor(redissonClient));return lockTemplate;}@Beanpublic RedissonLockExecutor redissonLockExecutor(RedissonClient redissonClient) {RedissonLockExecutor executor = new RedissonLockExecutor();executor.setRedissonClient(redissonClient);return executor;}@Beanpublic Lock4jAspect lock4jAspect() {return new Lock4jAspect();}
}

4. 使用方式

注解方式使用

@Service
public class OrderService {@Lock4j(keys = {"#orderId"})public void processOrder(String orderId) {// 业务逻辑}
}

编程式使用

@Service
public class OrderService {@Autowiredprivate LockTemplate lockTemplate;public void processOrder(String orderId) {try {if (lockTemplate.lock("order:" + orderId, 3000, 30000)) {// 获取锁成功,执行业务逻辑} else {// 获取锁失败处理}} finally {lockTemplate.releaseLock("order:" + orderId);}}
}

5. 注意事项

  1. 确保Spring的AOP配置正确,以便@Lock4j注解能够正常工作
  2. 如果使用XML配置,确保<aop:aspectj-autoproxy/>已配置
  3. 锁的key设计要合理,避免不同业务间的冲突
  4. 在非Spring Boot环境中,所有配置都需要手动完成
  5. 确保Redisson或其他锁实现的连接配置正确

6. 自定义扩展

如果需要自定义锁失败处理,可以实现LockFailureStrategy接口:

public class CustomLockFailureStrategy implements LockFailureStrategy {@Overridepublic void onLockFailure(String key, long acquireTimeout, int acquireCount) {// 自定义锁失败处理逻辑throw new RuntimeException("获取锁失败,key: " + key);}
}

然后在配置中注册:

<bean id="customLockFailureStrategy" class="com.your.package.CustomLockFailureStrategy"/><bean class="com.baomidou.lock.spring.Lock4jAspect"><property name="lockFailureStrategy" ref="customLockFailureStrategy"/>
</bean>

通过以上配置,你就可以在传统的Spring项目中使用Lock4j实现分布式锁功能了。

http://www.xdnf.cn/news/1148095.html

相关文章:

  • 开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例
  • SPARKLE:深度剖析强化学习如何提升语言模型推理能力
  • 智慧资产管理系统需求文档
  • uniapp中腾讯地图SDK-安装及配置(自动定位回显城市)
  • Validation - Spring Boot项目中参数检验的利器
  • 打造高效订单处理!ZKmall开源商城的统一履约中心架构解析
  • UGUI 性能优化系列:第三篇——渲染与像素填充率优化
  • Vue3生命周期函数
  • ABP VNext + Kubernetes Istio:微服务网格实战指南
  • Word快速文本对齐程序开发经验:从需求分析到实现部署
  • 深度学习Depth Anything V2神经网络实现单目深度估计系统源码
  • Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)
  • 市场数据+幸存者偏差提问,有趣的思考?
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 【2025最新】 .NET FrameWork微软离线运行库合集,一键安装版
  • 【C# in .NET】19. 探秘抽象类:具体实现与抽象契约的桥梁
  • 《Electron应用性能深耕:资源加载与内存治理的进阶路径》
  • 辛普森悖论
  • 用虚拟机体验纯血鸿蒙所有机型!
  • OpenCV 官翻7 - 对象检测
  • 13.5 Meta LLaMA 2核心技术拆解:4T数据训练+30%显存优化,70B模型准确率82.6%
  • 文件搜索的工具
  • Rust Web 全栈开发(十):编写服务器端 Web 应用
  • Flink实时流量统计:基于窗口函数与Redis Sink的每小时PV监控系统(学习记录)
  • rust实现的快捷补全到剪贴板的实用工具
  • Zara和网易云音乐仿写总结
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • 使用 Gunicorn 部署 Django 项目
  • AI编程工具对比:Cursor、GitHub Copilot与Claude Code