Browse Source

动态数据源

zouxuan 11 months ago
parent
commit
7211d4ddde

+ 0 - 4
dynamic-datasource/src/main/java/com/yonge/datasource/DynamicDataSourceAspect.java

@@ -1,4 +0,0 @@
-package com.yonge.datasource;
-
-public class DynamicDataSourceAspect {
-}

+ 2 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/DataSourceConfig.java → dynamic-datasource/src/main/java/com/yonge/datasource/config/DataSourceConfig.java

@@ -1,7 +1,8 @@
-package com.yonge.datasource;
+package com.yonge.datasource.config;
 
 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
 
+import com.yonge.datasource.config.DynamicRoutingDataSource;
 import org.mybatis.spring.SqlSessionFactoryBean;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/DataSourceContextHolder.java → dynamic-datasource/src/main/java/com/yonge/datasource/config/DataSourceContextHolder.java

@@ -1,4 +1,4 @@
-package com.yonge.datasource;
+package com.yonge.datasource.config;
 
 import java.util.ArrayList;
 import java.util.Collection;

+ 1 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/DbAnnotation.java → dynamic-datasource/src/main/java/com/yonge/datasource/config/DbAnnotation.java

@@ -1,4 +1,4 @@
-package com.yonge.datasource;
+package com.yonge.datasource.config;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;

+ 49 - 0
dynamic-datasource/src/main/java/com/yonge/datasource/config/DynamicDataSourceAspect.java

@@ -0,0 +1,49 @@
+package com.yonge.datasource.config;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+
+@Aspect
+@Component
+public class DynamicDataSourceAspect {
+    //拦截DbAnnotation
+    @Pointcut("@within(com.yonge.datasource.config.DbAnnotation)")
+    public void dataSourcePointCut() {
+    }
+
+    @Around("dataSourcePointCut()")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+        String dsKey = this.getDSAnnotation(joinPoint).value();
+        DataSourceContextHolder.setDataSourceKey(dsKey);
+        try {
+            return joinPoint.proceed();
+        } catch (Exception ex) {
+            throw ex;
+        } finally {
+            DataSourceContextHolder.clearDataSourceKey();
+        }
+    }
+
+    /**
+     * 根据类或方法获取数据源注解
+     */
+    private DbAnnotation getDSAnnotation(ProceedingJoinPoint joinPoint) {
+        //mybatis生成的代理类,所以获取它的接口来获取DbAnnotation注解信息
+        Class<?> targetClass = joinPoint.getTarget().getClass().getInterfaces()[0];
+        DbAnnotation dsAnnotation = targetClass.getAnnotation(DbAnnotation.class);
+        // 先判断类的注解,再判断方法注解
+        if (Objects.nonNull(dsAnnotation)) {
+            return dsAnnotation;
+        } else {
+            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+            DbAnnotation annotation = methodSignature.getMethod().getAnnotation(DbAnnotation.class);
+            return annotation;
+        }
+    }
+}

+ 1 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/DynamicRoutingDataSource.java → dynamic-datasource/src/main/java/com/yonge/datasource/config/DynamicRoutingDataSource.java

@@ -1,4 +1,4 @@
-package com.yonge.datasource;
+package com.yonge.datasource.config;
 
 import java.util.Map;
 

+ 1 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/interceptor/DataSourceInterceptor.java

@@ -6,7 +6,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
-import com.yonge.datasource.DataSourceContextHolder;
+import com.yonge.datasource.config.DataSourceContextHolder;
 
 public class DataSourceInterceptor extends HandlerInterceptorAdapter {
 

+ 1 - 1
dynamic-datasource/src/main/java/com/yonge/datasource/service/impl/DatabaseSourceServiceImpl.java

@@ -12,7 +12,7 @@ import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Service;
 
 import com.alibaba.druid.pool.DruidDataSource;
-import com.yonge.datasource.DynamicRoutingDataSource;
+import com.yonge.datasource.config.DynamicRoutingDataSource;
 import com.yonge.datasource.dao.DatabaseSourceDao;
 import com.yonge.datasource.entity.DatabaseSource;
 import com.yonge.datasource.service.DatabaseSourceService;