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 对象)映射成数据库中的记 ...
随机推荐
- pysimplegui之元素简单介绍(元素值得获取修改,key的规范及特殊用法)
重点 1获取元素的值 Input(key='mykey') values['mykey'] 2通过key查找元素 对象window['key'] 3更新元素的值 window['key'](要更新的值 ...
- QtDesigner第一个程序
用QTDesigner设计界面简单多了,而且更加直观.先看下效果图,是不是比我们用代码写的布局要美观多了 制作.ui界面 (1).打开Pycharm的界面设计工具QTDsigner Pycharm-& ...
- etcd/raft选举源码解读
ETCD-raft笔记 0. 引言 该篇博客基于etcd v3.5.7版本,首先会简单介绍etcd/raft对Raft选举部分的算法优化,然后通过源码分析etcd/raft的选举实现. 1. etcd ...
- JSON.stringify()与JSON.parse()没有你想的那样简单
重新学习这两个API的起因 在本周五有线上的项目,16:30开始验证线上环境. 开始都是顺顺利利,一帆风顺. 大概17:50左右,我正在收拾东西. 准备下班去王者峡谷骑着我的船溜达一圈. 可是天降意外 ...
- 2023 年十大 API 管理趋势
本文探讨了 API 管理在数字化转型中的重要性,以及 API 管理面临的挑战和发展机遇.文章重点介绍了十大 API 管理发展趋势,包括 API 安全性.API 标准化.云端 API 管理解决方案.低代 ...
- python利用pyinstaller打包简明教程
转自:https://www.jianshu.com/p/48f6dea265eb pyinstaller简明教程 安装pyinstaller pip install pyinstaller是最简单的 ...
- 如何解决Gridea部分主题不渲染Katex的问题
很多好看的主题因为对象不是信息学,所以忽视了公式,即 \(\LaTeX\) . 导致,如果你想渲染一个 \(n\) ,结果成了 nn 这个简单,导入文件即可. 找到主题文件夹,打开 templates ...
- Natasha V5.2.2.1 稳定版正式发布.
DotNetCore.Natasha.CSharp v5.2.2.1 使用 NMS Template 接管 CI 的部分功能. 取消 SourceLink.GitHub 的继承性. 优化几处内存占用问 ...
- 编程开发8大语言详解,为什么Java是我最推荐的?
一. 前言 很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会. 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到 ...
- 机器视觉基本理论(opencv)
1. 什么是图像采样 采样是按照某种时间间隔或空间间隔,将空间上连续的图像变换成离散点的操作称为图像采样 2. 什么是图像分变率 采样 得到的离散图像的尺寸称为图像分辨率.分辨率是数字图像可辨别的最小 ...