導(dǎo)讀
配置如何優(yōu)化
- 上文整合的過程中的還順帶整合Mybatis和TransactionManager操刀,為什么還要重新定義他們呢烁挟?SpringBoot不是給我們都配置好了嗎?注意骨坑,此處優(yōu)化就是這兩個配置去掉撼嗓,直接用SpringBoot的自動配置,頓時高級了,別人一看你的代碼如此簡單就實現(xiàn)了多數(shù)據(jù)源的切換且警,牛叉不粉捻?
- 如何去掉?SpringBoot萬變不離自動配置類斑芜,且看MybatisAutoConfiguration肩刃,如下:
@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration implements InitializingBean {
- 不多帖了,都是廢話押搪,看前幾行就行了树酪,醒目的一行啊,
@ConditionalOnSingleCandidate(DataSource.class)
大州,什么鬼续语?該注解的意思就是IOC容器中只有一個指定的候選對象才起作用,但是我們注入了幾個DataSource厦画,足足三個啊疮茄,這還起作用嗎?那不廢話嘛根暑。
- 事務(wù)管理器也是一樣力试,且看
DataSourceTransactionManagerAutoConfiguration
,如下:
public class DataSourceTransactionManagerAutoConfiguration {
@Configuration
@ConditionalOnSingleCandidate(DataSource.class)
static class DataSourceTransactionManagerConfiguration {
- 又看到了什么排嫌,
@ConditionalOnSingleCandidate(DataSource.class)
同樣的醒目畸裳,mmp,這不玩我呢嗎淳地。這怎么搞怖糊?
- 咦,不著急颇象,此時就要看看
@ConditionalOnSingleCandidate
注解搞了什么伍伤,進去看看,有如下的介紹:
The condition will also match if multiple matching bean instances are already contained in the BeanFactory but a primary candidate has been defined; essentially, the condition match if auto-wiring a bean with the defined type will succeed.
- 什么鬼遣钳,看不懂扰魂,英語太差了吧,不著急蕴茴,陳某給大家推薦一個IDEA插件劝评,文檔翻譯更加專注于程序員的專業(yè)術(shù)語,不像xx度翻譯倦淀,如下:
- 好了付翁,翻譯準確了就知道了,大致意思就是IOC容器中允許你有多個候選對象晃听,但是你必須有一個主(primary)候選對象百侧,頓時靈光一現(xiàn)砰识,這不就是@Primary注解嗎,艸佣渴,我這也太優(yōu)秀了吧辫狼。
- 二話不說,直接開擼辛润,輕輕松松一個注解搞定膨处,此時的數(shù)據(jù)源配置變得簡單多了,如下:
/**
* @Description 數(shù)據(jù)源的配置
* @Author CJB
* @Date 2020/3/9 13:45
*/
@Configuration
@MapperScan(basePackages = {"com.vivachek.service.dao","com.vivachek.service.dao2"})
public class DatasourceConfig {
/**
* 注入數(shù)據(jù)源1
*/
@ConfigurationProperties(prefix = "spring.datasource1")
@Bean(value = "dataSource1")
public DataSource dataSource1() {
return new DruidDataSource();
}
/**
* 第二個數(shù)據(jù)源
*/
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource2")
public DataSource dataSource2() {
return new DruidDataSource();
}
/**
* 動態(tài)數(shù)據(jù)源
*
* @return
*/
@Bean
@Primary
public DynamicDataSource dynamicDataSource() {
DynamicDataSource dataSource = new DynamicDataSource();
//默認數(shù)據(jù)源砂竖,在沒有切換數(shù)據(jù)源的時候使用該數(shù)據(jù)源
dataSource.setDefaultTargetDataSource(dataSource2());
HashMap<Object, Object> map = Maps.newHashMap();
map.put("dataSource1", dataSource1());
map.put("dataSource2", dataSource2());
//設(shè)置數(shù)據(jù)源Map真椿,動態(tài)切換就是根據(jù)key從map中獲取
dataSource.setTargetDataSources(map);
return dataSource;
}
}
- 直接在
DynamicDataSource
添加了一個@Primary就省去了SqlSessionFactory和TransactionManager的手動配置,是不是很easy并且顯得自己很牛叉乎澄,太有成就感了.....
- 好了突硝,牛也吹了,運行一下吧置济,滿懷期待等待30秒.......解恰,what?什么鬼浙于?失敗了护盈,拋出了異常,如下:
- 什么鬼羞酗,循環(huán)依賴異常腐宋,搞什么飛機,一萬個草泥馬在奔騰在橫無際涯的草原上檀轨。脏款。。裤园。。剂府。拧揽。。
- 別急腺占,還有后續(xù)淤袜,關(guān)注我,將會定時更新后續(xù)文章衰伯。另外需要源碼的聯(lián)系我铡羡,微信聯(lián)系方式在個人獨立博客【關(guān)于我】中,加我注明來意意鲸,謝謝烦周。
- 別忘了點贊喲尽爆,多來走動走動唄..........