自动配置类

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. 基于SpringBoot实现单元测试的多种情境/方法(二)

    本文分享自天翼云开发者社区@<基于SpringBoot实现单元测试的多种情境/方法(二)>,  作者:才开始学技术的小白 1 Mock基础回顾 在上一篇分享中我们详细介绍了简单的.用moc ...

  2. 全新跨平台版本.NET敏捷开发框架-RDIFramework.NET5.0震撼发布

    RDIFramework.NET,基于全新.NET Framework与.NET Core的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案.为企业快速构建跨平台.企业级的应 ...

  3. 如何在 .NET Core WebApi 中处理 MultipartFormDataContent

    最近在对某个后端服务做 .NET Core 升级时,里面使用了多处处理 MultipartFormDataContent 相关内容的代码.这些地方从 .NET Framework 迁移到 .NET C ...

  4. Node工程的依赖包管理方式

    作者:京东零售 陈震 在前端工程化中,JavaScript 依赖包管理是非常重要的一环.依赖包通常是项目所依赖的第三方库.工具和框架等资源,它们能够帮助我们减少重复开发.提高效率并且确保项目可以正确的 ...

  5. 基于Java开发的全文检索、知识图谱、工作流审批机制的知识库

    一.项目介绍 一款全源码,可二开,可基于云部署.私有部署的企业级知识库云平台,应用在需要进行常用文档整理.分类.归集.检索的地方,适合知识密集型单位/历史文档丰富的单位,或者大型企业.集团. 为什么建 ...

  6. js 获取窗口/容器内部滚动位置

    前端 (document.getElementsByClassName("container")[0]).scrollTop -- 容器内部滚动条位置 (document.getE ...

  7. 记一次某CMS代码审计(转载)

    作者:ddwGeGe 本文转自先知社区:https://xz.aliyun.com/t/11774 前言 无意中浏览到某小众OA官网且可以下载到源码,随机审计一波,最后成功Getshell,大佬勿喷 ...

  8. 音视频八股文(11)-- ffmpeg 音频重采样

    1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率.sample format.声道数等参数,使之按照我们期望的参数输出. 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数 ...

  9. 2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行。请用go语言调用libx264.dll,将yuv文件编码成h264文件。

    2023-03-07:x264的视频编码器,不用ffmpeg,用libx264.dll也行.请用go语言调用libx264.dll,将yuv文件编码成h264文件. 答案2023-03-07: 使用 ...

  10. 2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所有值全变成1,最少的操作次数。 1 <

    2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态. 返回让所有值全变成1,最少的操作次数. 1 &l ...