SpringBoot自动配置原理?
@SpringBootApplication 注解标注在某个类上说明
- 这个类是 SpringBoot 的主配置类
- SpringBoot 通过运行这个类的 main 方法来启动 SpringBoot 应用
@SpringBootApplication
注解是一个组合注解,主要是由元注解(@Target,@Retention,@Documented,@Inherited)和三个注解:
@SpringBootConfiguration
:该注解表示这是一个 SpringBoot 的配置类@ComponentScan
:开启组件扫描EnableAutoConfiguration
:开启自动配置,重点就在这个配置当中
“约定大于配置”,那SpringBoot是怎么做的呢?其实靠的就是@EnableAutoConfiguration注解;简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置
@AutoConfigurationPackage | 自动配置包扫描 |
---|---|
@Import | 给IOC容器导入组件 |
@AutoConfigurationPackage
Spring Boot 提供的注解,用于自动配置包扫描。通过在主配置类上添加该注解,可以告诉 Spring Boot 自动配置机制,将主配置类所在的包及其子包作为组件扫描的基础包,简化了组件扫描的配置过程。
@AutoConfigurationPackage 跟@ComponentScan注解一样的作用,但是扫描的对象不一样,比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由 @AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/@Service/@Component/@Repository这些注解是由@ComponentScan来扫描并加载的。
@Import(AutoConfigurationImportSelector.class)
该注解给当前配置类导入自动配置类,其导入的AutoConfigurationImportSelector类中的selectImports()方法,通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包,然后返回需要导入的组件的全类名。
自动配置原理
@EnableAutoConfiguration
是 Spring Boot 提供的注解,用于启用自动配置-
Spring Boot 启动过程中,Spring 会扫描所有的 jar 路径下的 META-INF/spring.factories 文件(通过 @Import(AutoConfigurationImportSelector.class) 导入了 AutoConfigurationImportSelector 类来实现的),将其包装成 Properties 对象
-
从这个 Properties 对象中获取 key 值为
EnableAutoConfiguration
的数据,这些数据都是 Spring Boot 默认配置好的配置文件数据 -
根据配置数据自动加载和应用相应的自动配置类,以实现自动配置的功能
@Import(AutoConfigurationImportSelector.class)
是 @EnableAutoConfiguration
注解的核心部分:作用是将 AutoConfigurationImportSelector
类导入到 IOC 容器中,并根据 EnableAutoConfiguration
的配置数据,自动加载相应的自动配置类。
自动配置类是 Spring Boot 提供的一系列配置类,用于根据应用程序的依赖和配置,自动配置相应的组件。这些自动配置类会根据配置文件中的属性值,自动创建并注册相应的 Bean,以实现自动配置的功能。
SpringBoot常用的配置形式,按照配置生效的优先级从高到低排列?
- 命令行参数:通过在启动应用程序时传递命令行参数,可以覆盖配置文件中的相应配置项。例如,使用 `--server.port=8080` 可以指定应用程序的端口号为 8080
- 操作系统环境变量:可以通过设置操作系统的环境变量来配置应用程序。Spring Boot 会自动将环境变量映射到相应的配置项上。例如,设置名为 `SPRING_APPLICATION_JSON` 的环境变量,可以传递 JSON 格式的配置信息给应用程序
- 配置文件:Spring Boot 支持多种配置文件格式,包括 YAML 文件(以 yml或yaml后缀)和 Properties 文件(以properties后缀)。配置文件通常位于应用程序的 classpath下,可以包含多个配置项。如果存在多个配置文件 。 优先级从高到低为:application.yml > application.properties> application-{profile}.yml> application-{profile}.properties,其中 {profile} 是当前激活的配置文件
-
@Configuration注解类上的 @PropertySource指定的配置文件:可以在 @Configuration注解的类上使用 @PropertySource注解指定一个或多个配置文件。这些配置文件的优先级低于上述的全局配置文件,但高于默认的配置值。通过这种方式,可以将特定的配置文件与特定的配置类关联
什么是 YAML?
一种易读的数据序列化语言。它的设计目标是提供一种简洁、可读性强的数据格式,适用于配置文件和数据交换。
与其他数据序列化格式相比,如 JSON 或 XML,YAML 的语法更加简洁和易读。它使用缩进和空格来表示层级关系,使用冒号来表示键值对,使用短横线来表示列表,使得配置文件的结构更加清晰和可读性强。
YAML 在许多应用场景中被广泛使用,特别是在 Spring Boot 和其他许多开发框架中作为配置文件的首选格式。它不仅可以用于简单的键值对配置,还支持复杂的数据结构,如嵌套的映射、列表和引用等
YAML 配置的优缺点?
优点 | 缺点 |
---|---|
|
|
Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource 注解可以引入一个 XML 配置。
spring boot 核心配置文件是什么?bootstrap.properties 和application.properties 有何区别 ?
核心的两个配置文件是 bootstrap.yml
(或 bootstrap.properties
)和 application.yml
(或 application.properties
)
bootstrap.yml | application.yml | |
---|---|---|
加载顺序 | 在Spring Boot 启动时最早加载的配置文件,用于配置应用程序的基础设施,如连接远程配置服务器等 | 是在 bootstrap.properties 加载后,应用程序开始启动之前加载的配置文件,用于配置应用程序的具体业务逻辑 |
作用范围 | 主要用于配置 Spring Cloud 相关的属性,如配置中心、服务注册和发现等 | 用于配置应用程序的具体业务逻辑,如数据库连接、日志配置、缓存配置等 |
配置继承 | application.properties 可以继承 bootstrap.properties 中的配置。这意味着,如果在 bootstrap.properties 中配置了某些属性,而在 application.properties 中没有重新定义,那么应用程序会使用 bootstrap.properties 中的配置 |