| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -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; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
					 | 
				
				 | 
				
					
  |