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 对象)映射成数据库中的记 ...
随机推荐
- Redis集群介绍及测试思路
作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...
- Python开发遇到的一些问题
1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try usin ...
- JavaScript的引入方式
外部JS文件 deno.js alert('你好!JavaScript'); JS引入方式.html <!--方式一:内部脚本--> <!--标签不能自闭和--> <sc ...
- 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习
其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维. RuntimeError: only batches of spatial targets supp ...
- 8.redis存储token以及springboot整合Jwt
1.总结: 昨天主要是下载安装和使用redis去存储token,但在创建redis的新建的时候出现了host异常,原因是没有将服务中的进程关掉,再重新打开redis的server,再打开cli: 回顾 ...
- ES_ChatGPT问答
Q1:springboot项目,如何使用elasticsearch的api增删改查?查询中有哪些方式,如果模糊查询.排序查询.分页查询?分别阐述下这些查询方式的用法?最后举一个完整的例子 答: 在Sp ...
- JAVASE和JAVAEE的区别
JAVASE和JAVAEE的区别 JavaEE: Java Enterprise Edition,Java企业版,多用于企业级开发,包括web开发等等.企业版本帮助开发和部署可移植.健壮.可伸缩切安全 ...
- ip addr命令解析
转载请注明出处: 1.ip addr命令使用解析 ip addr 命令是Linux系统中的一个网络管理工具,用于显示和配置系统中的网络接口及其地址信息.它可以列出系统中所有的网络接口及其详细信息,包括 ...
- nuxt.js项目中全局捕获异常并生成错误日志全过程
需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进. 步骤: 一.全局捕获异常, 二.发送到服务端, 三.生成错误日志. 一.全局捕获异常 如图,vue提供了errorHandle ...
- CTFShow 反序列化 Web 255-266
CTFShow 反序列化 255-266 漏洞原理 未队用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等后果. 触发条件 unserialize ...