package me.test.db.router;
import java.lang.reflect.Method;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.util.Assert;
/**
* 将目标方法上参数名是 paramName 的参数值作为数据源路由key。
*/
public class ParamDataSourceKeyResolver implements DataSourceKeyResolver, BeanPostProcessor {
private Logger logger = LoggerFactory.getLogger(ParamDataSourceKeyResolver.class);
private String paramName;
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
@Override
public String resolveKey(Object thisObj, Method targetMethod, Object[] args) {
String[] paramNames = parameterNameDiscoverer.getParameterNames(targetMethod);
if (paramNames == null) {
return null;
}
Object keyObj = null;
for (int i = 0; i < paramNames.length; i++) {
if (paramName.equals(paramNames[i])) {
keyObj = args[i];
break;
}
}
if (keyObj == null) {
return null;
}
String strValue = keyObj.toString();
logger.debug("using '{}' as datasource key", strValue);
return strValue;
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
Assert.isTrue(paramName != null && paramName.length() > 0, "paramName is not specified.");
return bean;
}
}