diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java index 2d85222..c141a85 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java @@ -1,5 +1,9 @@ package com.xkcoding.distributed.lock.annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; /** @@ -10,6 +14,8 @@ import java.util.concurrent.TimeUnit; * @author yangkai.shen * @date 2022-09-02 15:47 */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) public @interface DLock { /** * @return 锁的标识,支持 spel 表达式 diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DistributedLockServiceImpl.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DistributedLockServiceImpl.java index 8a54723..44d9df0 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DistributedLockServiceImpl.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DistributedLockServiceImpl.java @@ -3,7 +3,7 @@ package com.xkcoding.distributed.lock.api.impl; import com.xkcoding.distributed.lock.api.DistributedLock; import com.xkcoding.distributed.lock.api.DistributedLockService; import com.xkcoding.distributed.lock.api.LockClient; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit; @@ -18,7 +18,7 @@ import java.util.function.Supplier; * @date 2022-09-02 21:41 */ @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class DistributedLockServiceImpl implements DistributedLockService { private final LockClient lockClient; diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DummyDistributedLock.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DummyDistributedLock.java index 90e523b..0c2a38a 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DummyDistributedLock.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/impl/DummyDistributedLock.java @@ -1,7 +1,6 @@ package com.xkcoding.distributed.lock.api.impl; import com.xkcoding.distributed.lock.api.DistributedLock; -import org.jetbrains.annotations.NotNull; import java.util.concurrent.TimeUnit; @@ -30,7 +29,7 @@ public class DummyDistributedLock extends DistributedLock { } @Override - public boolean tryLock(long time, @NotNull TimeUnit unit) throws InterruptedException { + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return true; } diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockConfiguration.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockAutoConfiguration.java similarity index 70% rename from demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockConfiguration.java rename to demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockAutoConfiguration.java index 78a99dd..4917963 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockConfiguration.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/autoconfigure/DistributedLockAutoConfiguration.java @@ -1,9 +1,11 @@ package com.xkcoding.distributed.lock.autoconfigure; +import com.xkcoding.distributed.lock.aop.DistributedLockAspect; import com.xkcoding.distributed.lock.api.DistributedLockService; import com.xkcoding.distributed.lock.api.LockClient; import com.xkcoding.distributed.lock.api.impl.DistributedLockServiceImpl; import com.xkcoding.distributed.lock.api.impl.DummyDistributedLockClient; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,7 +19,8 @@ import org.springframework.context.annotation.Configuration; * @date 2022-09-02 21:57 */ @Configuration(proxyBeanMethods = false) -public class DistributedLockConfiguration { +@MapperScan("com.xkcoding.distributed.lock.mapper") +public class DistributedLockAutoConfiguration { @Bean @ConditionalOnMissingBean public LockClient lockClient() { @@ -28,4 +31,9 @@ public class DistributedLockConfiguration { public DistributedLockService distributedLockService(LockClient lockClient) { return new DistributedLockServiceImpl(lockClient); } + + @Bean + public DistributedLockAspect distributedLockAspect(DistributedLockService distributedLockService) { + return new DistributedLockAspect(distributedLockService); + } } diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/controller/StockController.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/controller/StockController.java new file mode 100644 index 0000000..30b28f7 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/controller/StockController.java @@ -0,0 +1,41 @@ +package com.xkcoding.distributed.lock.controller; + +import com.xkcoding.distributed.lock.service.StockService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *
+ * 模拟仓库接口 + *
+ * + * @author yangkai.shen + * @date 2022-09-03 00:46 + */ +@RestController +@RequestMapping("/stock") +@RequiredArgsConstructor(onConstructor_ = @Autowired) +public class StockController { + private final StockService stockService; + + /** + * 模拟减库存 + */ + @GetMapping("/reduce") + public String reduceStock() { + stockService.reduceStock(1L); + return "reduce success"; + } + + /** + * 模拟减库存 + */ + @GetMapping("/reset") + public String resetStock() { + stockService.resetStock(); + return "reset success"; + } +} diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/mapper/StockMapper.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/mapper/StockMapper.java index e6eee49..fa12cc5 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/mapper/StockMapper.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/mapper/StockMapper.java @@ -2,7 +2,6 @@ package com.xkcoding.distributed.lock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xkcoding.distributed.lock.model.Stock; -import org.apache.ibatis.annotations.Mapper; /** * 货物 Mapper @@ -10,6 +9,5 @@ import org.apache.ibatis.annotations.Mapper; * @author yangkai.shen * @date 2022-09-02 14:09 */ -@Mapper public interface StockMapper extends BaseMapper+ * 1. springboot 3.x 版本依赖 spring-core 6.x,里面没有这个异常 + * 2. mybatis-plus 自动装配 {@see com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean} 又需要这个异常 + *
+ * + * @author yangkai.shen + * @date Created in 2022-09-03 00:42 + */ +public class NestedIOException extends IOException { + public NestedIOException(String msg) { + super(msg); + } + + public NestedIOException(@Nullable String msg, @Nullable Throwable cause) { + super(msg, cause); + } + + @Override + @Nullable + public String getMessage() { + return NestedExceptionUtils.buildMessage(super.getMessage(), this.getCause()); + } + + static { + NestedExceptionUtils.class.getName(); + } +} diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/META-INF/spring.factories b/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/META-INF/spring.factories index ad1e9df..0ae34d9 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/META-INF/spring.factories +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.xkcoding.distributed.lock.autoconfigure.DistributedLockConfiguration + com.xkcoding.distributed.lock.autoconfigure.DistributedLockAutoConfiguration diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/db/schema.sql b/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/db/schema.sql new file mode 100644 index 0000000..aba7510 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/resources/db/schema.sql @@ -0,0 +1,9 @@ +CREATE TABLE `db_stock` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL COMMENT '货物名称', + `count` bigint(11) DEFAULT NULL COMMENT '库存量', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分布式锁-模拟库存表';