了解Spring Boot的自动配置

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

Negative 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存在,这该注解修饰的代码块不执行。

参考资料

  1. Spring Boot实战:自动配置原理分析
时间: 2024-10-24 18:36:19

了解Spring Boot的自动配置的相关文章

Spring Boot的自动配置、Command-line Runner

接下来关于SpringBoot的一系列文章和例子,都来自<Spring Boot Cookbook>这本书,本文的主要内容是start.spring.io的使用.Spring Boot的自动配置以及CommandRunner的角色和应用场景. 1. start.spring.io的使用 首先带你浏览http://start.spring.io/,在这个网址中有一些Spring Boot提供的组件,然后会给你展示如何让你的Spring工程变得"Bootiful",我称之为&q

Spring Cloud连载(3)Spring Boot简介与配置

本站小福利 点我获取阿里云优惠券 原文作者:杨大仙的程序空间 3 Spring Boot简介与配置   3.1 Spring Boot         Spring Cloud基于Spring Boot搭建,本小节将对Spring Boot作一个大致的讲解,读者知道Spring Boot作用即可. 3.1.1 Spring Boot简介         开发一个全新的项目,需要先进行开发环境的搭建,例如要确定技术框架以及版本,还要考虑各个框架之间的版本兼容问题,完成这些繁琐的工作后,还要对新项目

Gradle创建Spring Boot项目——1配置

第一步,创建项目并配制build.gradle文件 通过Intellij IDEA新建一个Gradle项目 在build.gradle文件中添加项目配制,执行一次Refresh all Gradle Projects buildscript { ext { springBootVersion = '1.5.4.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:

Spring Boot自动配置

在上篇文章如何运行Spring Boot应用中,已经熟悉了如何通过maven或者gradle创建一个Spring Boot应用,这篇文章主要学习Spring Boot的自动配置,包括注解的使用以及一些配置约束等等. 关于Spring Boot的特性介绍,可以参考Spring Boot特性. 主应用类 在Spring Boot应用中,我们通常将主应用类放置于应用的根包中,例如,com.javachen.example.主应用类有main方法,并且使用了@EnableAutoConfiguratio

《Spring Boot官方文档》16. 自动配置

16. 自动配置 Spring Boot的自动配置会尝试根据你添加进来的jar依赖来自动配置你的Spring应用.例如,如果HSQLDB在你的classpath路径上,你没有手动配置任何数据库连接实体类,我们还会自动配置内存数据库. 你可以有选择的实现自动配置,可以向 @Configuration上添加@EnableAutoConfiguration或者@SpringBootApplication注解来实现. 你应该只添加一个@EnableAutoConfiguration注解.我们通常建议你把

通过@Enable*注解触发Spring Boot配置

在Spring Boot:定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触发探测classpath目录下的类,进行自动配置: @Enable:有时需要由starter的用户触发*查找自动配置文件的过程. How Do 接着上篇文章的例子,首先将spring.factories中的内容注释掉 #org.springframework.boot.autoconfigure.EnableAutoConf

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

Spring Boot特性

1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringApplication.run 这个静态方法: public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); } 运行该类会有如下输出: . ____ _ __ _ _ /\

使用Spring Boot和Gradle创建AngularJS项目

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 本文主要是记录使用 Spring Boot 和 Gradle 创建项目的过程,其中会包括 Spring Boot 的安装及使用方法,希望通过这篇文章能够快速搭建一个项目. 1. 开发环境 操作系统: mac JDK:1.7.0_60 Gradle:2.2.1 IDE:Idea 2. 创建项目