Spring Boot 整合多点套路,少走点弯路~
持续原创输出,点击上方蓝字关注我
个人原创博客+1,点击前往,查看更多
目录
前言 Spring Boot 版本 找到自动配置类
注意 @Conditionalxxx
注解
注意 EnableConfigurationProperties
注解
注意 @Import
注解
注意 @AutoConfigurexxx
注解
注意内部静态配置类
总结
前言
网上有很多文章都在说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的自动配置类就是MybatisAutoConfiguration
,Redis
的自动配置类是RedisAutoConfiguration
,WEB
模块的自动配置类是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
这个注解的意思是注入一个Bean
到IOC容器
中,@ConditionalOnMissingBean
这个注解就是一个条件判断了,表示当SqlSessionFactory
类型的对象在IOC容器
中不存在才会注入。
哦?领悟到了吧,言外之意就是如果开发者需要定制SqlSessionFactory
,则可以自己的创建一个SqlSessionFactory
类型的对象并且注入到IOC容器中即能覆盖自动配置类中的。比如在Mybatis配置多数据源的时候就需要定制一个SqlSessionFactory
而不是使用自动配置类中的。
总之,一定要注意自动配置类上或者方法上的
@Conditionalxxx
注解,这个注解表示某种特定条件。
下面列出了常用的几种注解,如下:
@ConditionalOnBean
:当容器中有指定Bean的条件下进行实例化。@ConditionalOnMissingBean
:当容器里没有指定Bean的条件下进行实例化。@ConditionalOnClass
:当classpath类路径下有指定类的条件下进行实例化。@ConditionalOnMissingClass
:当类路径下没有指定类的条件下进行实例化。@ConditionalOnWebApplication
:当项目是一个Web项目时进行实例化。@ConditionalOnNotWebApplication
:当项目不是一个Web项目时进行实例化。@ConditionalOnProperty
:当指定的属性有指定的值时进行实例化。@ConditionalOnExpression
:基于SpEL表达式的条件判断。@ConditionalOnJava
:当JVM版本为指定的版本范围时触发实例化。@ConditionalOnResource
:当类路径下有指定的资源时触发实例化。@ConditionalOnJndi
:在JNDI存在的条件下触发实例化。@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的一些所需属性,比如host
,IP地址
,密码
等等。
@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
同时引入了Lettuce
和Jedis
两个配置类了,因此如果你的Redis需要使用Jedis作为连接池的话,想要知道Jedis都要配置什么,此时就应该看看JedisConnectionConfiguration
这个配置类了。
总结:
@Import
标注在自动配置类上方,一般都是快速导入一个或者多个配置类,因此如果自动配置类没有配置一些东西时,一定要看看@Import
这个注解导入的配置类。
5. 注意@AutoConfigurexxx注解
@AutoConfigurexxx
这类注解决定了自动配置类的加载顺序,比如AutoConfigureAfter
(在指定自动配置类之后)、AutoConfigureBefore
(在指定自动配置类之前)、AutoConfigureOrder
(指定自动配置类的优先级)。
为什么要注意顺序呢?因为某些组件往往之间是相互依赖的,比如
Mybatis
和DataSource
,肯定要先将数据源相关的东西配置成功才能配置Mybatis
吧。@AutoConfigurexxx
这类注解正是解决了组件之间相互依赖的问题。
比如MybatisAutoConfiguration
上方标注了如下一行代码:
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
这个行代码意思很简单,就是MybatisAutoConfiguration
这个自动配置在DataSourceAutoConfiguration
这个之后加载,因为你需要我,多么简单的理由。
好了,这下明白了吧,以后别犯傻问:为什么Mybatis配置好了,启动会报错?这个问题先看看数据源有没有配置成功吧。
6. 注意内部静态配置类
有些自动配置类比较简单没那么多套路,比如RedisAutoConfiguration
这个自动配置类中就定义了两个注入Bean的方法,其他的没了。
但是有些自动配置类就没那么单纯了,中间能嵌套n
个静态配置类,比如WebMvcAutoConfiguration
,类中还嵌套了WebMvcAutoConfigurationAdapter
、EnableWebMvcConfiguration
、ResourceChainCustomizerConfiguration
这三个配置类。如果你光看WebMvcAutoConfiguration
这个自动配置类好像没配置什么,但是其内部却是大有乾坤啊。
总结:一定要自动配置类的内部嵌套的配置类,真是大有乾坤啊。
总结
以上总结了六条整合的套路,希望能够帮助读者摆脱百度,自己也能独立整合组件。
总之,Spring Boot整合xxx组件的文章很多,相信大家也看的比较懵,其实套路都是一样,学会陈某分享的套路,让你少走弯路!!!
Spring Boot 整合多点套路,少走点弯路~的更多相关文章
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- spring boot整合Hadoop
最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...
- spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑
业务需求 首页 实现缓存分页 spring boot 整合redis (我的是2.0.3版本的) 在pom 文件写上依赖包即可 <dependency><!--依赖包--> ...
- spring boot整合slf4j-log日志
原文地址:https://blog.csdn.net/u011271894/article/details/75735915 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)
近期上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 以下是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一 导入框架所需的包,我们用的事maven 进行 ...
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...
- Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...
- 另一种缓存,Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...
随机推荐
- 第16课 - make的隐式规则(下)
第16课 - make的隐式规则(下) 1
- [LeetCode] 46. 全排列(回溯)
###题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...
- Charles介绍及配置
Charles 目录 Charles 1.先介绍一下Charles 2.缺少一点配置,需要配置一下 3.接下来就到安装证书了 重新打开一下,证书就安装成功了 这个是下载破解包的地址哦,可以选择版本 1 ...
- 手写spring
体系结构 Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入.下面的部分对在 Spring 框架中所有可用的 ...
- RXJAVA之变换操作
RXJAVA提供了以下变换操作,对Observable的消息进行变换操作: 1.window 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 谈谈 Java 中的那些“琐”事
一.公平锁&非公平锁 是什么 公平锁:线程按照申请锁的顺序来获取锁:在并发环境中,每个线程都会被加到等待队列中,按照 FIFO 的顺序获取锁. 非公平锁:线程不按照申请锁的顺序来获取锁:一上来 ...
- JVM的整体结构
整个jvm的运行流程图如上所示,首先需要进行加载class文件,然后使用类加载子系统将class翻译解析导入内存,在内存中分别导入到对应的运行时数据区,然后执行引擎开始执行,对于需要的数据在对应的区域 ...
- list、set、map的区别和联系
结构特点 List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合: List中存储的数据是有顺序的,并且值允许重复:Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许 ...
- 趣图:我说自己菜 vs 大佬说自己菜
扩展阅读 一大波趣图:CSS的力量 趣图:嫁人就嫁程序员,大妈都懂的! 趣图:向客户介绍的产品VS实际开发的产品 如何准备校招技术面试+一只小菜鸟的面试之路 向Spring大佬低头--大量源码流出 ...