当前位置: 首页 > 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.dtcms.com/a/287723.html

相关文章:

  • 让 Windows 用上 macOS 的系统下载与保姆级使用教程
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlalchemy’问题
  • 力扣经典算法篇-26-长度最小的子数组(暴力求解法,左右指针法)
  • ARINC818协议综述
  • Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等
  • 多式联运物流管理系统的设计与实现(原创)
  • JavaScript中的位运算符:深入理解<<和>>>
  • OpenCV 官翻 3 - 特征检测 Feature Detection
  • 语义熵怎么增强LLM自信心的
  • react17更新哪些新特性
  • 【I2C】01.I2C硬件连接I2C总线时序图讲解
  • 疯狂星期四文案网第12天运营日报
  • 提高CPU高速缓存cache命中率的主要设计方案
  • SpringBoot五分钟快速入门指南
  • 锂电池生产过程图解
  • 鼎捷T100程序开发(批次作业开发)
  • 新手向:基于 Python 的简易视频剪辑工具
  • 使用 go-redis-entraid 实现 Entra ID 无密钥认证
  • 一动一静皆消耗——IC设计之低功耗技术(Low Power Design)
  • javaweb的几大常见漏洞
  • ChatGPT Agent深度解析:告别单纯问答,一个指令搞定复杂任务?
  • mac 配置svn
  • 1Panel中的OpenResty使用alias
  • 《计算机网络》实验报告一 常用网络命令
  • 从 Server.xml 到字节码:Tomcat 内核全景与请求旅程 10 000 字深剖
  • 泛型机制详解
  • 2.4 组件间通信Props(父传子)
  • Java SE 讨论String类
  • GATE:基于移动嵌入式设备的实时边缘构建图注意力神经网络用于鲁棒室内定位
  • C++命名空间深度解析:避免命名冲突的终极解决方案