(1). 概述

在这一小节,主要剖析:ShardingDataSource,它是DataSource的实现类,也是应用程序与数据源的重要桥梁.

(2). ShardingDataSource何时创建的?

public static DataSource createDataSource(
		final Map<String, DataSource> dataSourceMap, 
		final ShardingRuleConfiguration shardingRuleConfig, 
		final Properties props) throws SQLException {
	// 2. 创建:ShardingDataSource对象,持有:ShardingRule/dataSourceMap
	return new ShardingDataSource(
		dataSourceMap, 
		// 1. 对ShardingRuleConfiguration数据解析,转换成:ShardingRule
		new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), 
		props);
}

(3). 看下ShardingDataSource类图

"ShardingDataSource类图"

(4). ShardingDataSource

public class ShardingDataSource extends AbstractDataSourceAdapter {
		
	// 上下文对象,内部持有: ShardingRule对象.
	// 留个疑问:
	// ShardingDataSource对象在整个jvm只有一份实例,这里是否会存在问题.后述再详细分析:ShardingRuntimeContext对象.
    private final ShardingRuntimeContext runtimeContext;
    
	// 1. 加载类之前,先加载静态方法.
    static {
		// 通过SPI加载:RouteDecorator/SQLRewriteContextDecorator/ResultProcessEngine
        NewInstanceServiceLoader.register(RouteDecorator.class);
        NewInstanceServiceLoader.register(SQLRewriteContextDecorator.class);
        NewInstanceServiceLoader.register(ResultProcessEngine.class);
    }// end static function
	
	
	public ShardingDataSource(final Map<String, DataSource> dataSourceMap, final ShardingRule shardingRule, final Properties props) throws SQLException {
		// 2. 把数据源集合交给父类
		super(dataSourceMap);
		// 检查数据源的类型(获取Connection上的URL,用以判断:数据源属于什么类型)
		// 我不太理解的是:dataSourceMap是一个集合,遍历检查可以,为什么最后还要Hold住遍历的最后一个:DatabaseType.
		// 假如集合,包含有:MySQL/Oracle,最后Hold住的是:DatabaseType靠谱吗?  
		checkDataSourceType(dataSourceMap);
		// 创建:ShardingRuntimeContext Hold住ShardingRule对象.
		runtimeContext = new ShardingRuntimeContext(dataSourceMap, shardingRule, props, getDatabaseType());
	} // end 
}

(5). 总结

在这里,我只对ShardingDataSource的构建过程和它的职责进行了分析,至于:调用过程另外再剖析.
从ShardingDataSource的类图,我们就能看出:Sharding-JDBC对DataSource进行了封装.