Debug SourceCode - shi-yuan/dynamic-datasource-spring-boot-starter GitHub Wiki
- 开启动态数据源的debug日志。
logging:
level:
com.baomidou.dynamic: debug
检查日志输出是否正确。
- 断点调试DynamicDataSourceAnnotationInterceptor。
public class DynamicDataSourceAnnotationInterceptor implements MethodInterceptor {
/**
* SPEL参数标识
*/
private static final String DYNAMIC_PREFIX = "#";
@Setter
private DsProcessor dsProcessor;
private DynamicDataSourceClassResolver dynamicDataSourceClassResolver = new DynamicDataSourceClassResolver();
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
try {
//这里把获取到的数据源标识如master存入本地线程
DynamicDataSourceContextHolder.push(determineDatasource(invocation));
return invocation.proceed();
} finally {
DynamicDataSourceContextHolder.poll();
}
}
private String determineDatasource(MethodInvocation invocation) throws Throwable {
//此处打断点
//获得DS注解的方法
● Method method = invocation.getMethod();
//获得方法上的DS注解。
Class<?> declaringClass = dynamicDataSourceClassResolver.targetClass(invocation);
DS ds = method.isAnnotationPresent(DS.class) ? method.getAnnotation(DS.class)
: AnnotationUtils.findAnnotation(declaringClass, DS.class);
//获得DS注解的内容
String key = ds.value();
//如果DS注解内容是以#开头解析动态最终值否则直接返回
return (!key.isEmpty() && key.startsWith(DYNAMIC_PREFIX)) ? dsProcessor.determineDatasource(invocation, key) : key;
}
}
- 断点调试DynamicRoutingDataSource。
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
private static final String UNDERLINE = "_";
@Setter
protected DynamicDataSourceProvider provider;
@Setter
protected Class<? extends DynamicDataSourceStrategy> strategy;
@Setter
protected String primary;
protected boolean p6spy;
/**
* 所有数据库
*/
private Map<String, DataSource> dataSourceMap = new LinkedHashMap<>();
/**
* 分组数据库
*/
private Map<String, DynamicGroupDataSource> groupDataSources = new ConcurrentHashMap<>();
@Override
public DataSource determineDataSource() {
//从本地线程获取key解析最终真实的数据源
● return getDataSource(DynamicDataSourceContextHolder.peek());
}
private DataSource determinePrimaryDataSource() {
log.debug("从默认数据源中返回数据");
return groupDataSources.containsKey(primary) ? groupDataSources.get(primary).determineDataSource() : dataSourceMap.get(primary);
}
/**
* 获取数据源
*
* @param ds 数据源名称
* @return 数据源
*/
public DataSource getDataSource(String ds) {
if (StringUtils.isEmpty(ds)) {
return determinePrimaryDataSource();
} else if (!groupDataSources.isEmpty() && groupDataSources.containsKey(ds)) {
log.debug("从 {} 组数据源中返回数据源", ds);
return groupDataSources.get(ds).determineDataSource();
} else if (dataSourceMap.containsKey(ds)) {
log.debug("从 {} 单数据源中返回数据源", ds);
return dataSourceMap.get(ds);
}
return determinePrimaryDataSource();
}
}