CONTEXTHOLDER = new DataSourceThreadLocal();
+
+ /**
+ * 描述 : 私有构造函数
+ */
+ private DbContextHolder() {
+
+ }
+
+ /**
+ * 描述 : 设置数据源代码
+ *
+ * @param code 数据源代码
+ */
+ public static void setDataSourceCode(String code) {
+ CONTEXTHOLDER.set(code);
+ }
+
+ /**
+ * 描述 : 获取数据源代码
+ *
+ * @return 数据源代码
+ */
+ public static String getDataSourceCode() {
+ return CONTEXTHOLDER.get();
+ }
+
+ /**
+ *
+ * Description: 清理数据源代码
+ *
+ */
+ public static void clearDataSourceCode() {
+ CONTEXTHOLDER.remove();
+ }
+
+}
diff --git a/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitch.java b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitch.java
new file mode 100644
index 0000000..0238774
--- /dev/null
+++ b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitch.java
@@ -0,0 +1,10 @@
+package org.itkk.udf.starter.datasource.dynamic;
+
+import java.lang.annotation.*;
+
+@Documented
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DbSwitch {
+ String value();
+}
\ No newline at end of file
diff --git a/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitchAspect.java b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitchAspect.java
new file mode 100644
index 0000000..986ad49
--- /dev/null
+++ b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DbSwitchAspect.java
@@ -0,0 +1,51 @@
+package org.itkk.udf.starter.datasource.dynamic;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+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.lang.reflect.Method;
+
+@Aspect
+@Component
+@Slf4j
+public class DbSwitchAspect {
+ /**
+ * 描述 : dbSwitchAspect
+ */
+ @Pointcut("@annotation(org.itkk.udf.starter.datasource.dynamic.DbSwitch)")
+ public void pointCut() {
+
+ }
+
+ /**
+ * 环绕通知
+ * @param pjd pjd
+ * @return Object
+ * @throws Throwable Throwable
+ */
+ @Around("pointCut()")
+ public Object around(ProceedingJoinPoint pjd) throws Throwable {
+ try {
+ Signature signature = pjd.getSignature();
+ MethodSignature methodSignature = (MethodSignature) signature;
+ Method method = methodSignature.getMethod();
+ if (method.isAnnotationPresent(DbSwitch.class)) {
+ DbSwitch dbSwitch = method.getAnnotation(DbSwitch.class);
+ String code = dbSwitch.value();
+ if (StringUtils.isNotBlank(code)) {
+ DbContextHolder.setDataSourceCode(code);
+ }
+ }
+ return pjd.proceed();
+ } finally {
+ DbContextHolder.clearDataSourceCode();
+ }
+ }
+}
diff --git a/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DynamicDataSource.java b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DynamicDataSource.java
new file mode 100644
index 0000000..dc565c6
--- /dev/null
+++ b/udf-starter/udf-starter-datasource-dynamic/src/main/java/org/itkk/udf/starter/datasource/dynamic/DynamicDataSource.java
@@ -0,0 +1,77 @@
+package org.itkk.udf.starter.datasource.dynamic;
+
+import org.itkk.udf.starter.core.CoreUtil;
+import org.itkk.udf.starter.core.datasource.DataSourceMeta;
+import org.itkk.udf.starter.core.datasource.IBuildDataSource;
+import org.itkk.udf.starter.core.exception.SystemRuntimeException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+import javax.sql.DataSource;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 动态数据源
+ */
+@Slf4j
+public class DynamicDataSource extends AbstractRoutingDataSource {
+
+ /**
+ * 描述 : 目标数据库
+ */
+ private static Map