首先,既然是多數據源,那麼咱們就先看下數據源怎麼配置的:java
javaconfig相似下面這樣:spring
MapperScan註解經常使用配置以下:sql
basePackages:Base packages to scan for MyBatis interfaces,也就是mapper接口所在包名數據庫
annotationClass:This property specifies the annotation that the scanner will search for,apache
也就是隻掃描指定包下的指定註解做爲mapper,一般爲org.apache.ibatis.annotations.Mappermybatis
markerInterface:This property specifies the parent that the scanner will search for,只掃描指定包下指定父接口的子接口做爲mapperapp
sqlSessionTemplateRef:指定這組mapper關聯的sqlSessionTemplateide
sqlSessionFactoryRef:指定這組mapper關聯的sqlSessionFactoryui
那麼,問題來了,annotationClass,markerInterface都配置了或者都不配置會怎樣?在org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions中調用的org.mybatis.spring.mapper.ClassPathMapperScanner.registerFilters()代碼以下:3d
一幕瞭然,若是都配置了,最終的mapper會是二者匹配的合集;若是都不配置,那麼,最終的mapper會是basePackages下全部任意接口。
使用地方在org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent:
還有一個問題,sqlSessionTemplateRef和sqlSessionFactoryRef同時都配置了會怎樣?或者不配置呢?
一般,若是隻有一個sqlSessionFactory時是不須要配置的,只有容器中有多個時才須要指定一個。
若是都配置了呢?請看下面分析:
org.mybatis.spring.mapper.ClassPathMapperScanner.processBeanDefinitions(Set<BeanDefinitionHolder>)中處理每個以前掃描mapper生成的BeanDefinition時,會給每個BeanDefinition設置sqlSessionFactory,以下:
看到log沒,很清楚:Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.
看完mapper的處理,再來看關聯的sqlSessionFactory:
根據指定數據源類型利用org.springframework.boot.jdbc.DataSourceBuilder建立dataSource,目前主流的是使用阿里開源的Druid數據庫鏈接池做爲數據源:
sqlSessionFactory建立:
經過SqlSessionFactoryBean關聯dataSource和MapperXML,再經過@MapperScan關聯sqlSessionFactory和mapper接口
至此,單個數據源建立算是完成了。如題,多數據源怎麼辦?
方法一,手動配置多個dataSource,並在@MapperScan關聯不一樣的sqlSessionFactory和mapper接口。
方法二,動態數據源,繼承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,重寫determineTargetDataSource方法,從targetDataSources中獲取對應數據源操做數據庫,一般在前面業務代碼根據具體怎樣的狀況選擇怎樣的dataSource,而後經過設置ThreadLocal變量,這裏獲取變量信息來返回對應數據源。切入業務邏輯能夠經過aop切面從dao層方法名入手,也能夠經過mybatis的攔截器獲取sql信息和入參決定選擇哪一個數據源。
PS:若是是讀寫分離,一般狀況下主庫讀寫權限,從庫只讀權限,事務DataSourceTransactionManager配置在主庫的dataSource上,@Transactional會自動從配置事務的dataSource中獲取鏈接。