1. 程式人生 > >靚仔,整合SpringBoot還在百度搜配置嗎?老司機教你一招!!!

靚仔,整合SpringBoot還在百度搜配置嗎?老司機教你一招!!!

## 導讀 - 最近陳某公司有些忙,為了保證文章的高質量可能要兩天一更了,在這裡陳某先說聲不好意思了!!! - 昨天有朋友問我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