亲宝软件园·资讯

展开

靓仔,整合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

加载全部内容

相关教程
猜你喜欢
用户评论