Browse Source

增加注解方式切换数据源

zhouhao 8 years ago
parent
commit
0a58be889c

+ 32 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/DynamicDataSourceAutoConfiguration.java

@@ -21,9 +21,13 @@ import com.atomikos.icatch.config.UserTransactionServiceImp;
 import com.atomikos.icatch.jta.UserTransactionImp;
 import com.atomikos.icatch.jta.UserTransactionManager;
 import com.atomikos.jdbc.AtomikosDataSourceBean;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
 import org.hsweb.commons.StringUtils;
 import org.hsweb.web.core.datasource.DataSourceHolder;
 import org.hsweb.web.core.datasource.DynamicDataSource;
+import org.hsweb.web.core.exception.AuthorizeForbiddenException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -112,4 +116,32 @@ public class DynamicDataSourceAutoConfiguration {
         return new DynamicDataSourceSqlExecutorService();
     }
 
+    @Bean
+    public AnnotationDataSourceChangeConfiguration annotationDataSourceChangeConfiguration() {
+        return new AnnotationDataSourceChangeConfiguration();
+    }
+
+    @Aspect
+    public static class AnnotationDataSourceChangeConfiguration {
+        @Around(value = "@annotation(dataSource)")
+        public Object useDatasource(ProceedingJoinPoint pjp, UseDataSource dataSource) throws Throwable {
+            try {
+                DynamicDataSource.use(dataSource.value());
+                return pjp.proceed();
+            } finally {
+                DynamicDataSource.useDefault(false);
+            }
+        }
+
+        @Around(value = "@annotation(dataSource)")
+        public Object useDefaultDatasource(ProceedingJoinPoint pjp, UseDefaultDataSource dataSource) throws Throwable {
+            try {
+                DynamicDataSource.useDefault(dataSource.value());
+                return pjp.proceed();
+            } finally {
+                if (dataSource.value())
+                    DynamicDataSource.useLast();
+            }
+        }
+    }
 }

+ 28 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDataSource.java

@@ -0,0 +1,28 @@
+package org.hsweb.web.datasource.dynamic;
+
+import org.hsweb.web.bean.po.datasource.DataSource;
+import org.hsweb.web.core.datasource.DynamicDataSource;
+
+import java.lang.annotation.*;
+
+/**
+ * 通过注解,动态切换数据源。在动态数据源启用时才生效
+ *
+ * @author zhouhao
+ * @since 2.2
+ */
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface UseDataSource {
+    /**
+     * 数据源ID{@link DataSource#getId()},通过{@link DynamicDataSource}进行数据源切换。
+     * <br>
+     * 如果数据源id不存在,将使用默认的数据源
+     *
+     * @return 数据源ID
+     * @see DynamicDataSource#use(String)
+     */
+    String value();
+
+}

+ 25 - 0
hsweb-web-datasource/src/main/java/org/hsweb/web/datasource/dynamic/UseDefaultDataSource.java

@@ -0,0 +1,25 @@
+package org.hsweb.web.datasource.dynamic;
+
+import org.hsweb.web.core.datasource.DynamicDataSource;
+
+import java.lang.annotation.*;
+
+/**
+ * 通过注解,切换数据源为默认数据源
+ *
+ * @author zhouhao
+ * @see DynamicDataSource#useDefault(boolean)
+ * @since 2.2
+ */
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface UseDefaultDataSource {
+
+    /**
+     * 方法执行后是否切换到上次使用的数据源
+     *
+     * @return 是否自动切换为之前的数据源
+     */
+    boolean value() default true;
+}