Spring Boot 整合多点套路,少走点弯路~

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Spring Boot 整合多点套路,少走点弯路~

目录

  • 前言
  • Spring Boot 版本

  1. 找到自动配置类

  1. 注意@Conditionalxxx注解

  1. 注意EnableConfigurationProperties注解

  1. 注意@Import注解

  1. 注意@AutoConfigurexxx注解

  1. 注意内部静态配置类
  • 总结

前言

网上有很多文章都在说Spring Boot 如何整合 xxx,有文章教你为什么这么整合吗?整合了千万个框架,其实套路就那么几个,干嘛要学千万个,不如来这学习几个套路轻松整合,它不香吗???

今天写这篇文章的目的就是想从思想上教给大家几个套路,不用提到整合什么就去百度了,自己尝试去亲手整合一个。

Spring Boot 版本

本文基于的Spring Boot的版本是2.3.4.RELEASE

1. 找到自动配置类

Spring Boot 在整合任何一个组件的时候都会先添加一个依赖starter,比如整合的Mybatis有一个mybatis-spring-boot-starter,依赖如下:

<dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.0</version>
</dependency>

每一个starter基本都会有一个自动配置类,命名方式也是类似的,格式为:xxxAutoConfiguration,比如Mybatis的自动配置类就是MybatisAutoConfigurationRedis的自动配置类是RedisAutoConfigurationWEB模块的自动配置类是WebMvcAutoConfiguration

2. 注意@Conditionalxxx注解

@Conditionalxxx标注在配置类上或者结合@Bean标注在方法上,究竟是什么意思,在上一篇文章这类注解都不知道,还好意思说会Spring Boot已经从表层到底层深入的讲了一遍,不理解的可以查阅一下。

首先需要注意自动配置类上的@Conditionalxxx注解,这个是自动配置类生效的条件。

比如WebMvcAutoConfiguration类上标了一个如下注解:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

以上这行代码的意思就是当前IOC容器中没有WebMvcConfigurationSupport这个类的实例时自动配置类才会生效,这也就是在配置类上标注@EnableWebMvc会导致自动配置类WebMvcAutoConfiguration失效的原因。

其次需要注意方法上的@Conditionalxxx注解,Spring Boot会在自动配置类中结合@Bean@Conditionalxxx注解提供一些组件运行的默认配置,但是利用@Conditionalxxx(在特定条件下生效)注解的条件性,方便开发者覆盖这些配置。

比如在Mybatis的自动配置类MybatisAutoConfiguration中有如下一个方法:

@Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {}

以上这个方法不用看方法体的内容,只看方法上的注解。@Bean这个注解的意思是注入一个BeanIOC容器中,@ConditionalOnMissingBean这个注解就是一个条件判断了,表示当SqlSessionFactory类型的对象在IOC容器中不存在才会注入。

哦?领悟到了吧,言外之意就是如果开发者需要定制SqlSessionFactory,则可以自己的创建一个SqlSessionFactory类型的对象并且注入到IOC容器中即能覆盖自动配置类中的。比如在Mybatis配置多数据源的时候就需要定制一个SqlSessionFactory而不是使用自动配置类中的。

总之,一定要注意自动配置类上或者方法上的@Conditionalxxx注解,这个注解表示某种特定条件。

下面列出了常用的几种注解,如下:

  1. @ConditionalOnBean:当容器中有指定Bean的条件下进行实例化。
  2. @ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。
  3. @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。
  4. @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
  5. @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
  6. @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
  7. @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
  8. @ConditionalOnExpression:基于SpEL表达式的条件判断。
  9. @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
  10. @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
  11. @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
  12. @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。

3. 注意EnableConfigurationProperties注解

EnableConfigurationProperties这个注解常标注在配置类上,使得@ConfigurationProperties标注的配置文件生效,这样就可以在全局配置文件(application.xxx)配置指定前缀的属性了。

在Redis的自动配置类RedisAutoConfiguration上方标注如下一行代码:

@EnableConfigurationProperties(RedisProperties.class)

这行代码有意思了,我们可以看看RedisProperties的源码,如下:

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
 private int database = 0;
 private String url;
 private String host = "localhost";
 private String password;
  .....

@ConfigurationProperties这个注解指定了全局配置文件中以spring.redis.xxx为前缀的配置都会映射到RedisProperties的指定属性中,其实RedisProperties这个类中定义了Redis的一些所需属性,比如hostIP地址密码等等。

@EnableConfigurationProperties注解就是使得指定的配置生效,能够将全局配置文件中配置的属性映射到相关类的属性中。

为什么要注意@EnableConfigurationProperties这个注解呢?

引入一个组件后往往需要改些配置,我们都知道在全局配置文件中可以修改,但是不知道前缀是什么,可以改哪些属性,因此找到@EnableConfigurationProperties这个注解后就能找到对应的配置前缀以及可以修改的属性了。

4. 注意@Import注解

这个注解有点牛逼了,Spring 3.x中就已经有的一个注解,大致的意思的就是快速导入一个Bean或者配置类到IOC容器中。这个注解有很多妙用,后续会单独写篇文章介绍下。

@Import这个注解通常标注在自动配置类上方,并且一般都是导入一个或者多个配置类。

比如RabbitMQ的自动配置类RabbitAutoConfiguration上有如下一行代码:

@Import(RabbitAnnotationDrivenConfiguration.class)

这行代码的作用就是添加了RabbitAnnotationDrivenConfiguration这个配置类,使得Spring Boot在加载到自动配置类的时候能够一起加载。

比如Redis的自动配置类RedisAutoConfiguration上有如下一行代码:

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })

这个@Import同时引入了LettuceJedis两个配置类了,因此如果你的Redis需要使用Jedis作为连接池的话,想要知道Jedis都要配置什么,此时就应该看看JedisConnectionConfiguration这个配置类了。

总结@Import标注在自动配置类上方,一般都是快速导入一个或者多个配置类,因此如果自动配置类没有配置一些东西时,一定要看看@Import这个注解导入的配置类。

5. 注意@AutoConfigurexxx注解

@AutoConfigurexxx这类注解决定了自动配置类的加载顺序,比如AutoConfigureAfter(在指定自动配置类之后)、AutoConfigureBefore(在指定自动配置类之前)、AutoConfigureOrder(指定自动配置类的优先级)。

为什么要注意顺序呢?因为某些组件往往之间是相互依赖的,比如MybatisDataSource,肯定要先将数据源相关的东西配置成功才能配置Mybatis吧。@AutoConfigurexxx这类注解正是解决了组件之间相互依赖的问题。

比如MybatisAutoConfiguration上方标注了如下一行代码:

@AutoConfigureAfter(DataSourceAutoConfiguration.class)

这个行代码意思很简单,就是MybatisAutoConfiguration这个自动配置在DataSourceAutoConfiguration这个之后加载,因为你需要我,多么简单的理由。

好了,这下明白了吧,以后别犯傻问:为什么Mybatis配置好了,启动会报错?这个问题先看看数据源有没有配置成功吧。

6. 注意内部静态配置类

有些自动配置类比较简单没那么多套路,比如RedisAutoConfiguration这个自动配置类中就定义了两个注入Bean的方法,其他的没了。

但是有些自动配置类就没那么单纯了,中间能嵌套n个静态配置类,比如WebMvcAutoConfiguration,类中还嵌套了WebMvcAutoConfigurationAdapterEnableWebMvcConfigurationResourceChainCustomizerConfiguration这三个配置类。如果你光看WebMvcAutoConfiguration这个自动配置类好像没配置什么,但是其内部却是大有乾坤啊。

总结:一定要自动配置类的内部嵌套的配置类,真是大有乾坤啊。

总结

以上总结了六条整合的套路,希望能够帮助读者摆脱百度,自己也能独立整合组件。

总之,Spring Boot整合xxx组件的文章很多,相信大家也看的比较懵,其实套路都是一样,学会陈某分享的套路,让你少走弯路!!!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
前端开发 安全 Java
Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
94 0
|
14天前
|
缓存 监控 Java
|
6月前
|
XML Java 数据格式
Spring学习__一篇足矣
Spring学习__一篇足矣
Spring学习__一篇足矣
|
XML Java 应用服务中间件
涨薪50%%就因回答对了这题:为什么Spring Boot提倡约定优于配置?
在 Spring Boot 中,通过约定优于配置这个思想,可以让我们少写很多的配置,然后就只需要关注业务代码的编写就行。今天呢,我给大家聊聊为什么SpringBoot提倡约定优于配置。
96 0
|
监控 NoSQL 安全
Spring Boot 怎么做监控?这篇总算整明白了。。。
Spring Boot 怎么做监控?这篇总算整明白了。。。
2108 8
Spring Boot 怎么做监控?这篇总算整明白了。。。
|
JSON 前端开发 Java
麻了!Spring Boot从 2.2.5升级到2.7.2之后,一堆BUG
这篇文章分享一下Spring Boot 升级到2.7的踩坑总结,还是挺全面的,希望对大家有所帮助~
|
设计模式 消息中间件 JavaScript
Spring Boot 程序优化的 14 个小妙招!
Spring Boot 程序优化的 14 个小妙招!
|
缓存 Prometheus 监控
非常哇塞的 Spring Boot 性能优化长文
非常哇塞的 Spring Boot 性能优化长文
|
Prometheus Cloud Native Java
Spring Boot 3.0 要来了,真心强!
Spring Boot 3.0 要来了,真心强!
|
JSON Prometheus 监控
Spring Boot 怎么做监控?这篇总算整明白了。。。(2)
Spring Boot 怎么做监控?这篇总算整明白了。。。(2)
218 0
Spring Boot 怎么做监控?这篇总算整明白了。。。(2)