|
|
@ -9,7 +9,9 @@ |
|
|
|
package com.epmet.commons.dynamic.datasource.aspect; |
|
|
|
|
|
|
|
import com.epmet.commons.dynamic.datasource.annotation.DataSource; |
|
|
|
import com.epmet.commons.dynamic.datasource.bean.DataSourceParam; |
|
|
|
import com.epmet.commons.dynamic.datasource.config.DynamicContextHolder; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.aspectj.lang.ProceedingJoinPoint; |
|
|
|
import org.aspectj.lang.annotation.Around; |
|
|
|
import org.aspectj.lang.annotation.Aspect; |
|
|
@ -22,6 +24,7 @@ import org.springframework.core.annotation.Order; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.lang.reflect.Parameter; |
|
|
|
|
|
|
|
/** |
|
|
|
* 多数据源,切面处理类 |
|
|
@ -52,9 +55,9 @@ public class DataSourceAspect { |
|
|
|
if(targetDataSource != null || methodDataSource != null){ |
|
|
|
String value; |
|
|
|
if(methodDataSource != null){ |
|
|
|
value = methodDataSource.value(); |
|
|
|
value = getDatasourceName(methodDataSource, signature.getMethod().getParameters(), point.getArgs()); |
|
|
|
}else { |
|
|
|
value = targetDataSource.value(); |
|
|
|
value = getDatasourceName(targetDataSource, signature.getMethod().getParameters(), point.getArgs()); |
|
|
|
} |
|
|
|
|
|
|
|
DynamicContextHolder.push(value); |
|
|
@ -68,4 +71,39 @@ public class DataSourceAspect { |
|
|
|
logger.debug("clean datasource"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取要用到的数据源名称 |
|
|
|
* @param dataSource |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public String getDatasourceName(DataSource dataSource, Parameter[] methodParameters, Object[] methodArgValues) { |
|
|
|
if (dataSource.datasourceNameFromArg()) { |
|
|
|
// 1.从参数中动态获取数据源名称
|
|
|
|
String datasourceNameFromParam = getDatasourceNameFromArg(methodParameters, methodArgValues); |
|
|
|
if (StringUtils.isNotBlank(datasourceNameFromParam)) { |
|
|
|
// 如果有DatasourceParam类型的参数并且设置了datasourceName值,那么返回这个值,否则使用硬编码的
|
|
|
|
return datasourceNameFromParam; |
|
|
|
} |
|
|
|
} |
|
|
|
// 2.硬编码指定数据源名称
|
|
|
|
return dataSource.value(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 从参数中取数据源名称 |
|
|
|
* @param parameters |
|
|
|
* @param argsObject |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public String getDatasourceNameFromArg(Parameter[] parameters, Object[] argsObject) { |
|
|
|
for (int i = 0; i < parameters.length; i++) { |
|
|
|
if (parameters[i].getType() == DataSourceParam.class) { |
|
|
|
DataSourceParam param = (DataSourceParam) argsObject[i]; |
|
|
|
return param.getDatasourceName(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|