靓仔,整合SpringBoot还在百度搜配置吗?老司机教你一招!!!
爱撒谎的男孩 人气:0
## 导读
- 最近陈某公司有些忙,为了保证文章的高质量可能要两天一更了,在这里陈某先说声不好意思了!!!
- 昨天有朋友问我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,
ObjectProvider
加载全部内容