靚仔,整合SpringBoot還在百度搜配置嗎?老司機教你一招!!!
阿新 • • 發佈:2020-03-22
## 導讀
- 最近陳某公司有些忙,為了保證文章的高質量可能要兩天一更了,在這裡陳某先說聲不好意思了!!!
- 昨天有朋友問我SpringBoot如何整合Redis,他說百度谷歌搜尋了一遍感覺不太靠譜。我頓時驚呆了,原來你們整合SpringBoot都是上網搜尋配置的?
- 今天陳某就讓小夥伴擺脫配置的困擾,不要再去上網找了,嘗試自己配置一下,成就感會更強哈!!!
## 開擼
- 陳某前面寫過兩篇文章,分別是[SpringBoot實現多資料來源的動態切換](https://chenjiabing666.github.io/2020/03/12/SpringBoot%E6%95%B4%E5%90%88%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%EF%BC%8C%E4%BD%A0%E4%BC%9A%E4%BA%86%E5%90%97%EF%BC%9F/)、[SpringBoot整合多資料來源的巨坑](https://chenjiabing666.github.io/2020/03/18/SpringBoot%E6%95%B4%E5%90%88%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E7%9A%84%E5%B7%A8%E5%9D%91/),陳某把這兩篇文章作為引子,教教SpringBoot自動配置類的套路。
- 陳某打算從這幾個問題深入去講述如何去整合SpringBoot。
1、資料來源的引數如何配置?你是怎麼知道在yml屬性檔案中需要設定什麼屬性?
- 陳某使用的是阿里的DruidDataSource,SpringBoot整合任何東西的第一步都需要從自動配置類入手,如下:
```java
@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class,
DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {}
```
- `@EnableConfigurationProperties`結合`@ConfigurationProperties`會使某個屬性配置類生效,可以直接在application.properties配置。那麼Druid的引數如何配置,肯定是在`DruidStatProperties`和`DataSourceProperties`這個類中了。這裡就不再詳細看了,請讀者自己檢視。
- **這裡總結第一條:SpringBoot整合任何東西,幾乎全部需要配置的屬性都在自動配置類上或者`@Import`注入的配置類上的`@EnableConfigurationProperties`註解中指定的屬性類。**
2、為什麼設定了動態資料來源需要重新整合Mybatis,mybatis-spring-boot-starter這個啟動器不是什麼都整合好了嗎,只要在yml檔案中配置即可嗎?
- 同樣的套路,一切答案都在自動配置類中,原始碼如下:
```java
@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`,什麼意思?該註解的意思是IOC容器中有單個指定的候選物件該配置類才會生效,那麼即是容器中只有一個DataSource型別的物件`MybatisAutoConfiguration`才會生效,但是我們在整合動態資料來源的時候是指定了多個DataSource並且注入了IOC容器中了,因此Mybatis自動配置類中所有的內容都不會生效,當然需要自己重新配置Mybatis了。
- SpringBoot中註解類似`@Conditionalxxx`註解有很多,全部都是判斷配置在指定條件下才會生效。更多的註解如下圖,具體什麼意思,不是本文介紹的重點,自己看文件:
![](https://gitee.com/chenjiabing666/Blog-file/raw/master/03-22-2.PNG)
- **總結第二條:SpringBoot整合任何東西,一定要注意`@Conditionalxxxx`註解,判斷配置類中各種配置生效的條件。**
3、 為什麼還要Java config方式重新配置事務管理器呢,不是使用@EnableTransactionManagement直接開啟了嗎,不用配置即可使用嗎?
- 老套路,自動配置類搞起,原始碼如下:
```java
@Configuration
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceTransactionManagerAutoConfiguration {
//靜態配置類,只有IOC容器中只有一個候選物件DataSource,這個配置類才生效
@Configuration
@ConditionalOnSingleCandidate(DataSource.class)
static class DataSourceTransactionManagerConfiguration {
private final DataSource dataSource;
private final TransactionManagerCustomizers transactionManagerCustomizers;
DataSourceTransactionManagerConfiguration(DataSource dataSource,
Object