了解Spring Boot的自动配置
摘自:https://www.jianshu.com/p/ddb6e32e3faf
Spring Boot的自动配置给开发者带来了很大的便利,当开发人员在pom文件中添加starter依赖后,maven或者gradle会自动下载很多jar包到classpath中。当Spring Boot检测到特定类的存在,就会针对这个应用做一定的配置,自动创建和织入需要的spring bean到程序上下文中。
在之前的文章中,我们只是在pom文件中增加各种starter的依赖,例如:spring-boot-starter-data-jpa, spring-boot-starter-web, spring-boot-starter-data-test等等。接下来将在之前的工程的基础上,观察在程序的引导启动过程中,Spring Boot通过自动配置机制帮我们做了哪些工作。
How Do
- Spring Boot启动时将自动配置的信息通过DEBUG级别的日志打印到控制台。可以通过设置环境变量(DEBUG)或者程序属性(--debug)设置程序的日志输出级别。
- 在项目目录下运行
DEBUG=true mvn spring-boot:run启动应用程序; - 在后台可以看到DEBUG级别的日志输出,在启动日志的最后,可以看到类似AUTO-CONFIGURATION REPORT的字样。
Positive matches

分析
可以看到,后台输出的自动配置信息特别多,好几页屏幕,没办法一一分析,在这里选择一个postive match和negative match进行分析。
Spring Boot通过配置信息指出:特定配置项被选中的原因、列出匹配到对应类的配置项(positive match)、不包括某个配置项的原因(negative match)。现在以DataSourceAutoConfiguration举例说明:
- @ConditionalOnClass 表示对应的类在classpath目录下存在时,才会去解析对应的配置文件,对于DataSourceAutoConfiguration来说就是指:只有javax.sql.DataSource和org.springframwork.jdbc.datasource.embedded.EmbeddedDatabaseType类都能存在时,就会配置对应的数据库资源。
- @ConditionalOnMisssingClass表示对应的类在classpath目录下找不到。
- OnClassCondition用于表示匹配的类型(postive or negative)
OnClassCondition是最普遍的浏览探测条件,除此之外,Spring Boot也使用别的探测条件,如:OnBeanCondition用于检测指定bean实例存在与否、OnPropertyCondition用于检查指定属性是否存在等等。
符合negative match代表一些配置类(xxxConfiguration之类的),它们虽然存在于classpath目录,但是修饰它们的注解中依赖的其他类不存在。导入如果在pom文件中导入spring-boot-autoconfigure包,则GsonAutoConfiguration就会出现在classpath目录下,但是该配置类被@ConditionalOnClass(Gson.class)修饰,而com.google.gson.Gson类不在classpath目录。
@Configuration
@ConditionalOnClass({Gson.class})
public class GsonAutoConfiguration {
public GsonAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public Gson gson() {
return new Gson();
}
}
总结
- @ConditionalOnClass:该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;
- @ConditionalOnMissingBean:该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;可以给该注解传入参数例如
@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。
参考资料
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
作者:javaadu
链接:https://www.jianshu.com/p/ddb6e32e3faf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
了解Spring Boot的自动配置的更多相关文章
- 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置
在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...
- Spring boot 的自动配置
Xml 配置文件 日志 Spring Boot对各种日志框架都做了支持,我们可以通过配置来修改默认的日志的配置: #设置日志级别 logging.level.org.springframework=D ...
- spring boot 系列之六:深入理解spring boot的自动配置
我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并 ...
- Spring Boot 排除自动配置的 4 种方法,关键时刻很有用!
Spring Boot 提供的自动配置非常强大,某些情况下,自动配置的功能可能不符合我们的需求,需要我们自定义配置,这个时候就需要排除/禁用 Spring Boot 某些类的自动化配置了. 比如:数据 ...
- 自定义spring boot的自动配置
文章目录 添加Maven依赖 创建自定义 Auto-Configuration 添加Class Conditions 添加 bean Conditions Property Conditions Re ...
- Spring Boot的自动配置
Spring Boot的自动配置 --摘自https://www.hollischuang.com/archives/1791 随着Ruby.Groovy等动态语言的流行,相比较之下Java的开发显得 ...
- Spring Boot的自动配置原理及启动流程源码分析
概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...
- Spring Boot的自动配置的原理
Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 1.1.1. ...
- Spring Boot的自动配置,到底是怎么做到?
作者:祖大帅 链接:juejin.im/post/5b679fbc5188251aad213110 来源:掘金 1. Spring Boot.Spring MVC 和 Spring 有什么区别? 分开 ...
随机推荐
- Jmeter测试出现端口占用情况
Jmeter测试会出现端口占用情况 这边在这里做个记录,每次都要百度查询,刚好需要整理下,我就也记录一份到这里吧.感谢大佬的文章. 参考文章:windows下Jmeter压测端口占用问题 因Windo ...
- $.ajax()属性详解
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Strin ...
- 两个重叠的div做前后翻转
当需要做一个翻转卡片式的div时候,需要两个div的大小等大例如: 画出两个等大的div后,将他们重叠 图中的两个div做了重叠,做重叠时候用的属性是 position: absolute; 并且需要 ...
- Centos7 配置 svn服务端
转载至:Linux(阿里云Centos7)环境下搭建svn服务器以及权限配置详细步骤 本篇文章主要介绍在CentOS7中采用yum安装方式.优点:简单,一键安装,不用手动配置环境变量等.缺点:安装位置 ...
- Array + two points leetcode.15-3Sum
题面 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Fi ...
- javaWeb文件上传与下载
文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载 1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...
- What Linux bind mounts are really doing
Lots of Unixes have some form of 'loopback' mounts, where you can mount a bit of an existing filesys ...
- Linux命令——gzip、zcat、bzip2、bzcat、tar
参考:Linux命令——ar 为什么文件要压缩? 当文件过大时,无论是本地做备份,复制都很麻烦,而且还浪费磁盘空间.如果用网络传输,大文件无疑会浪费大量宝贵带宽.文件压缩技术可以有效解决这个问题,但是 ...
- fwrite、write、fread、read
1. write和read 1.1 write: 头文件:#include<unistd.h> 原型: ssize_t write(int fd,const void*buf,size_t ...
- python 并发编程-- 多进程
一 multiprocessing 模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程 ...
