一、@SpringBootApplication 引导类注解,主要集成了三个注解的功能:

1、@SpringBootConfiguration 注解:表示当前类是一个配置类;

2、@ComponentScan 注解:用于对引导类所属的包及其子包下的组件进行扫描;

3、@EnableAutoConfiguration 注解:允许自动配置;

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_jar

 

二、进入 @SpringBootApplication 源码,可以看到一个 @SpringBootConfiguration 注解:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_02

再进入 @SpringBootConfiguration 源码,可以看到一个 @Configuration 注解,我们学习 Spring 的时候知道,被 @Configuration 注解修饰的类,就是一个配置类;

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_03

 

三、我们在 @SpringBootApplication 源码里还可以看到一个 @ComponentScan 注解,叫做组件扫描注解:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_04

我们知道 SpringBoot 是基于约定的,即 SpringBoot 约定在引导类(即被 @SpringBootApplication 修饰的类)所属的包及其子包下的所有类都会被扫描;

如下所示:我们创建了 Controller,但是我们并没有配置组件扫描,SpringBoot 却可以识别到我们的 Controller;就是因为我们创建的 Controller 所属的包,位于引导类所属包的子包下;但是如果 Controller 所在的包不在引导类的包下或者子包下,那么 Controller 就不会被扫描到。

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_05

四、我们在 @SpringBootApplication 源码里还可以看到一个 @EnableAutoConfiguration 注解,这个注解的功能是允许自动配置:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_jar_06

进入 @EnableAutoConfiguration 可以看到一个个 @Import({AutoConfigurationImportSelector.class}) 注解,表示把外部的配置类导入到当前注解中,那么当前注解就具备了引入类的功能;

我们进入 AutoConfigurationImportSelector(自动配置导入选择器类)源码,查看当前类所属的包名:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_07

然后我们查看 SpringBoot 项目所依赖的外部 jar 包(External Libraries):

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_08

找到当前 SpringBoot 版本对应的 具有 autoconfigure 关键字的 jar 包,可以找到上面 AutoConfigurationImportSelector 类及其所属的包:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_09

在该 jar 包中我们还可以看到一个 META-INF 包,下面有一个 spring-configuration-metadata.json 文件,这个文件是 SpringBoot 默认的配置文件,配置一些常用的数据;

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_10

比如 tomcat 的端口号配置:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_spring_11

 

 五、虽然 spring-configuration-metadata.json 文件中的默认配置我们不能修改,但是我们可以自定义同名的配置,覆盖掉默认的配置数据;通过 SpringBoot学习笔记(三):SpringBoot 原理分析-Springboot起步依赖,我们知道 SpringBoot 项目在启动的时候,会自动加载 ${basedir}/src/main/resources 路径下,以 application 开头的配置文件,所以我们可以在配置文件中自己指定配置的数据;

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_12

如下所示,我们进行如下自定义配置:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_13

启动 SpringBoot 项目,结果为:

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_配置文件_14

spring boot 中 transactional注解 需要引入什么依赖 springbootapplication注解原理_jar_15