Spring Boot 整合组件套路
自动配置类
Spring Boot 在整合任何一个组件的时候都会先添加一个依赖 starter,比如整合 MybatisPlus 有一个 mybatis-plus-boot-starter,如下:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
每一个 starter 基本都会有一个自动配置类,命名方式也是类似的,格式为:xxxAutoConfiguration, 比如 MybatisPlus 的自动配置类就是 MybatisPlusConfiguration,Redis 的自动配置类是 RedisAutoConfiguration, web 模块的自动配置类是 WebMvcConfiguration。
@ConditionalXxx 注解
@ConditionalXxx 标注在配置类上或者结合 @Bean 标注在方法上,表示自动配置类生效的条件。比如 @WebMvcAutoConfiguration 类上标注了一个 @ConditionalOnMissBean(WebMvcConfigurationSupport.class),表示的意思就是当前 IOC 容器中没有 WebMvcConfigurationSupport 这个类的实例时自动配置类才会生效,这也就是在配置类上标注 @EnableWebMvc 会导致自动配置类 WebMvcAutoConfiguration 失效的原因。
需要注意方法上的 @ConditionalXxx 注解,Spring Boot 会在自动配置类中结合 @Bean 和 @ConditionalXxx 注解提供一些组件运行的默认配置,但是利用 @ConditionalXxx(在特定条件下生效)注解的条件性,方便开发者覆盖这些配置。
在 MyBatis 的自动配置类 MyBatisAutoConfiguration 中有如下一个方法:
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSoure dataSource) throws Exception {}
@Bean 这个注解的意思是注入一个 Bean 到 IOC 容器中,@ConditionalOnMissingBean 表示当 SqlSessionFactory 类型的对象在 IOC 容器中不存在才会注入。也就是说如果开发者需要定制 SqlSessionFactory,可以自己创建一个 SqlSessionFactory 类型的对象并且注入到 IOC 容器中即能覆盖自动配置类中的。比如在 MyBatis 配置多数据源的时候就需要定制一个 SqlSessionFactory 而不是使用自动配置类中的。
常用注解
- @ConditionalOnBean:当容器中有指定 Bean 的条件下进行实例化
- @ConditionalOnMissingBean:当容器中没有指定 Bean 的条件下进行实例化
- @ConditionalOnClass:当 classpath 类路径下有指定类的条件下进行实例化
- @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化
- @ConditionalOnWebApplication:当项目是一个 Web 项目时进行实例化
- @ConditionalOnNotWebApplication:当项目不是一个 Web 项目时进行实例化
- @ConditionalOnProperty:当指定的属性有指定的值时进行实例化
- @ConditionalOnExpression:基于 SpEL 表达式的条件判断
- @ConditionalOnJava:当 JVM 版本为指定的版本范围时触发实例化
- @ConditionalOnResource:当类路径下有指定的资源时触发实例化
- @ConditionalOnJndi:在 JNDI 存在的条件下触发实例化
- @ConditionalOnSingleCandidate:当指定的 Bean 在容器中只有一个,或者有多个但是指定了首选的 Bean 时触发实例化
@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,password 等。
@EnableConfigurationProperties 注解就是使得指定的配置生效,能够将全局配置文件中配置的属性映射到相关类的属性中。
引入一个组件后往往需要改些配置,我们都知道在全局配置文件中可以修改,但是不知道前缀是什么,可以改哪些属性,因此找到 @EnableConfigurationProperties 这个注解后就能找到对应的配置前缀以及可以修改的属性了。
@Import 注解
这个注解通常标注在自动配置类上方,并且一般都是导入一个或者多个配置类。
比如 RabbitMQ 的自动配置类 RabbitAutoConfiguration 上有如下一行代码:
@Import(RabbitAnnotationDrivenConfiguration.class)
这行代码的作用就是添加了 RabbitAnnotationDrivenConfiguration 这个配置类,使得 Spring Boot 在加载到自动配置类的时候能够一起加载。
比如 Redis 的自动配置类 RedisAutoConfiguration 上有如下一行代码:
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
这个 @Import 同时引入了 Lettuce 和 Jedis 两个配置类,因此如果你的 Redis 需要使用 Jedis 作为连接池的话,想要知道 Jedis 都要配置什么,此时就应该看看 JedisConnectionConfiguration 这个配置类了。
@AutoConfigurationXxx 注解
@AutoConfigurationXxx 这类注解决定了自动配置类的加载顺序,比如 AutoConfigurationAfter(在指定自动配置类之后)、AutoConfigurationBefore(在指定自动配置类之前)、AutoConfigurationOrder(指定自动配置类的优先级)。
指定配置加载顺序,是因为某些组件往往是相互依赖的,比如 MyBatis 和 DataSource,肯定要先将数据源相关的东西配置成功才能配置 MyBatis 吧,@AutoConfigurationXxx 这类注解正是解决了组件之间相互依赖的问题。
Spring Boot 整合组件套路的更多相关文章
- Spring Boot 整合多点套路,少走点弯路~
持续原创输出,点击上方蓝字关注我 个人原创博客+1,点击前往,查看更多 目录 前言 Spring Boot 版本 找到自动配置类 注意@Conditionalxxx注解 注意EnableConfigu ...
- spring boot整合servlet、filter、Listener等组件方式
创建一个maven项目,然后此项目继承一个父项目:org.springframework.boot 1.创建一个maven项目: 2.点击next后配置父项目及版本号 3.点击finish后就可查看p ...
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...
- Spring Boot 整合 FastDFS 客户端
原文地址:Spring Boot 整合 FastDFS 客户端 博客地址:http://www.extlight.com 一.前言 前两篇介绍整体上介绍了通过 Nginx 和 FastDFS 的整合来 ...
- Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?
Spring Boot2 系列教程接近完工,最近进入修修补补阶段.Freemarker 整合貌似还没和大家聊过,因此今天把这个补充上. 已经完工的 Spring Boot2 教程,大家可以参考这里: ...
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...
- 【Spring Boot学习之六】Spring Boot整合定时任务&异步调用
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2一.定时任务1.启动类添加注解@EnableScheduling 用于开启定时任务 package com.wjy; i ...
- Spring Boot整合Servlet,Filter,Listener,访问静态资源
目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ...
- Spring Boot系列(三):Spring Boot整合Mybatis源码解析
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
随机推荐
- [数据库/Java]数据库开发过程中产生的MySQL错误代码及其解决方案
前言 吐槽一下,均是这两天遇到的破烂事儿,搞定了也好,以后出现此类问题也就放心些了. 下列遇到的问题大都是因为MySQL从5.x版本升级到8.0.11(MySQL8.0涉及重大改版)后,跟着连带着出现 ...
- 利用Velero对K8S备份还原与集群迁移实战
一.简介 Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,利用 velero 用户可以安全的备份.恢复和迁移 Kubernetes 集群资源 ...
- VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者
大家好,我是DOM哥. 我用 ChatGPT 开发了一个 Vue 的资源导航网站. 不管你是资深 Vue 用户,还是刚入门想学习 Vue 的小白,这个网站都能帮助到你. 网站地址:https://do ...
- Vue+echarts实现中国地图射线效果
效果图如上 前提是安装Echarts并引入 并且配置中国地图json文件这些都在同账号另一篇博客上有说明,查看请自行移步 下展示代码 <template> <div class=&q ...
- VMware虚拟机---Ubuntu无法连接网络该怎么解决?
在学习使用Linux系统时,由于多数同学们的PC上多是Windows系统,故会选择使用VMware创建一个虚拟机来安装Linux系统进行学习. 安装完成之后,在使用时总是会遇到各种各样的问题.本片随笔 ...
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(16)-Charles其他骚操作之大结局
1.简介 今天就说一些Charles的其他操作.以及抓包跨域的问题和常见的问题如何解决.到此Charles这一系列的文章也要和大家说再见了,其他什么小程序.Android7.0等等的问题可以查看宏哥的 ...
- 任务系统之Jenkins子任务
今天下班即开启五一假期,早上临时定了行程去山东日照,原本计划下班就出发,但下班看了看导航,这一路红得发黑,于是决定还是晚点再走,现在有时间了,写篇简单的技术文章来提升下Blog逐渐降低的技术内容含量吧 ...
- Vite-WeGPT聊天AI实例|vue3+pinia仿ChatGPT聊天界面
基于vue3.x+vite4+pinia2仿chatgpt聊天模拟实例Vue3-WeGPT. 基于Vite4.x+Vue3+Pinia2+VEPlus+Vue3-Markdown等技术实现仿ChatG ...
- AutoGPT:有手就会的安装教程
AutoGPT 是什么 Auto-GPT 是一个实验性开源应用程序,展示了 GPT-4 语言模型的功能.该程序由 GPT-4 驱动,将 LLM 的"思想"链接在一起,以自主实现您设 ...
- 2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1
2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素. 你可以按 任意顺序 返回答案. 要求时间复杂度O(N). 输入: nums = [1,1,1 ...