| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- package com.izouma.awesomeadmin.datasource;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- import org.aspectj.lang.reflect.MethodSignature;
- import org.springframework.stereotype.Component;
- import java.lang.reflect.Method;
- @Component
- @Aspect
- public class DataSourceAspect {
- @Pointcut("execution(public * com.izouma.awesomeadmin.dao..*(..)))")
- public void pointcut() {
- }
- /**
- * 拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源
- *
- * @param point
- * @throws Exception
- */
- @Before(value = "pointcut()")
- public void intercept(JoinPoint point) {
- //默认使用默认datasource
- DynamicDataSourceHolder.setDataSource("dataSource");
- Class<?> target = point.getTarget().getClass();
- MethodSignature signature = (MethodSignature) point.getSignature();
- // 默认使用目标类型的注解,如果没有则使用其实现接口的注解
- for (Class<?> clazz : target.getInterfaces()) {
- resolveDataSource(clazz, signature.getMethod());
- }
- resolveDataSource(target, signature.getMethod());
- }
- /**
- * 提取目标对象方法注解和类型注解中的数据源标识
- *
- * @param clazz
- * @param method
- */
- private void resolveDataSource(Class<?> clazz, Method method) {
- try {
- Class<?>[] types = method.getParameterTypes();
- // 默认使用类型注解
- if (clazz.isAnnotationPresent(DataSource.class)) {
- DataSource source = clazz.getAnnotation(DataSource.class);
- DynamicDataSourceHolder.setDataSource(source.value());
- }
- // 方法注解可以覆盖类型注解
- Method m = clazz.getMethod(method.getName(), types);
- if (m != null && m.isAnnotationPresent(DataSource.class)) {
- DataSource source = m.getAnnotation(DataSource.class);
- DynamicDataSourceHolder.setDataSource(source.value());
- }
- } catch (Exception e) {
- System.out.println(clazz + ":" + e.getMessage());
- }
- }
- }
|