自动配置类

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 整合组件套路的更多相关文章

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

    持续原创输出,点击上方蓝字关注我 个人原创博客+1,点击前往,查看更多 目录 前言 Spring Boot 版本 找到自动配置类 注意@Conditionalxxx注解 注意EnableConfigu ...

  2. spring boot整合servlet、filter、Listener等组件方式

    创建一个maven项目,然后此项目继承一个父项目:org.springframework.boot 1.创建一个maven项目: 2.点击next后配置父项目及版本号 3.点击finish后就可查看p ...

  3. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

  4. Spring Boot 整合 FastDFS 客户端

    原文地址:Spring Boot 整合 FastDFS 客户端 博客地址:http://www.extlight.com 一.前言 前两篇介绍整体上介绍了通过 Nginx 和 FastDFS 的整合来 ...

  5. Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?

    Spring Boot2 系列教程接近完工,最近进入修修补补阶段.Freemarker 整合貌似还没和大家聊过,因此今天把这个补充上. 已经完工的 Spring Boot2 教程,大家可以参考这里: ...

  6. Spring Boot (十三): Spring Boot 整合 RabbitMQ

    1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...

  7. Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  8. 【Spring Boot学习之六】Spring Boot整合定时任务&异步调用

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2一.定时任务1.启动类添加注解@EnableScheduling 用于开启定时任务 package com.wjy; i ...

  9. Spring Boot整合Servlet,Filter,Listener,访问静态资源

    目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ...

  10. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

随机推荐

  1. [数据库/Java]数据库开发过程中产生的MySQL错误代码及其解决方案

    前言 吐槽一下,均是这两天遇到的破烂事儿,搞定了也好,以后出现此类问题也就放心些了. 下列遇到的问题大都是因为MySQL从5.x版本升级到8.0.11(MySQL8.0涉及重大改版)后,跟着连带着出现 ...

  2. 利用Velero对K8S备份还原与集群迁移实战

    一.简介 Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,利用 velero 用户可以安全的备份.恢复和迁移 Kubernetes 集群资源 ...

  3. VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者

    大家好,我是DOM哥. 我用 ChatGPT 开发了一个 Vue 的资源导航网站. 不管你是资深 Vue 用户,还是刚入门想学习 Vue 的小白,这个网站都能帮助到你. 网站地址:https://do ...

  4. Vue+echarts实现中国地图射线效果

    效果图如上 前提是安装Echarts并引入 并且配置中国地图json文件这些都在同账号另一篇博客上有说明,查看请自行移步 下展示代码 <template> <div class=&q ...

  5. VMware虚拟机---Ubuntu无法连接网络该怎么解决?

    在学习使用Linux系统时,由于多数同学们的PC上多是Windows系统,故会选择使用VMware创建一个虚拟机来安装Linux系统进行学习. 安装完成之后,在使用时总是会遇到各种各样的问题.本片随笔 ...

  6. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(16)-Charles其他骚操作之大结局

    1.简介 今天就说一些Charles的其他操作.以及抓包跨域的问题和常见的问题如何解决.到此Charles这一系列的文章也要和大家说再见了,其他什么小程序.Android7.0等等的问题可以查看宏哥的 ...

  7. 任务系统之Jenkins子任务

    今天下班即开启五一假期,早上临时定了行程去山东日照,原本计划下班就出发,但下班看了看导航,这一路红得发黑,于是决定还是晚点再走,现在有时间了,写篇简单的技术文章来提升下Blog逐渐降低的技术内容含量吧 ...

  8. Vite-WeGPT聊天AI实例|vue3+pinia仿ChatGPT聊天界面

    基于vue3.x+vite4+pinia2仿chatgpt聊天模拟实例Vue3-WeGPT. 基于Vite4.x+Vue3+Pinia2+VEPlus+Vue3-Markdown等技术实现仿ChatG ...

  9. AutoGPT:有手就会的安装教程

    AutoGPT 是什么 Auto-GPT 是一个实验性开源应用程序,展示了 GPT-4 语言模型的功能.该程序由 GPT-4 驱动,将 LLM 的"思想"链接在一起,以自主实现您设 ...

  10. 2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1

    2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素. 你可以按 任意顺序 返回答案. 要求时间复杂度O(N). 输入: nums = [1,1,1 ...