Spring Boot 自动配置原理及过程

Spring Boot 是一个基于 Spring 框架的快速应用开发框架,它极大地简化了开发流程,使得开发者能够更加快速地构建应用程序。Spring Boot 中的一个关键特性就是自动配置(Auto-Configuration),这使得开发者无需手动编写大量的配置代码就能得到一个功能完善的 Spring 应用程序。

1.基本原理

Spring Boot 的自动配置是基于 Spring 框架的核心功能——依赖注入(Dependency Injection)和自动装配(Bean Auto-Wiring)。

1.1.启动类和 @SpringBootApplication 注解

启动类:Spring Boot 应用通常有一个主类,这个主类上会有一个 @SpringBootApplication 注解。

@SpringBootApplication 注解:该注解是一个组合注解

  • @SpringBootConfiguration:表示这是一个 Spring 配置类。
  • @EnableAutoConfiguration:启用自动配置功能,告诉 Spring Boot 启动自动配置。
  • @ComponentScan:扫描指定包下的组件,以便于发现并装配带有 @Component@Service@Repository@Controller 等注解的类。

1.2.@EnableAutoConfiguration 注解

@EnableAutoConfiguration注解:该注解本身也是一个组合注解

  • @AutoConfigurationPackage:这个注解会告诉 Spring Boot 扫描当前包以及子包中的 @Component 相关的注解。
  • @Import({AutoConfigurationImportSelector.class})
    • AutoConfigurationImportSelector:通过这个类,Spring Boot 会在启动时选择并导入一组自动配置类。

1.3.自动配置类的发现

  • AutoConfigurationImportSelector:在 Spring 容器启动过程中,这个类会从 META-INF/spring.factories 文件中读取所有候选的自动配置类。

  • spring.factories 文件:位于每个自动配置模块的 META-INF 目录下,包含了一系列的自动配置类和它们对应的条件,每个类都是一个配置项。

  • org.springframework.boot.autoconfigure.AutoConfiguration.imports

    src/main/resources/META-INF/spring 文件夹下的org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件功能与 spring.factories一样。都是用来加载自动装配的类。

    两者目的都是为引入外部的jar,把外部bean纳入到Spring容器,实现外部组件与Spring的集成, 主要区别当前方式通过配置的信息创建内部是具体的要导入到Spring环境的中的配置类, 而spring.factories这种方式,内部是key-value的形式。

    注意:从spring boot2.7开始,慢慢不支持META-INF/spring.factories文件了需要导入的自动配置类可以放在
    /META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中。

1.4.条件匹配

  • @Conditional 注解:自动配置类中的每个 Bean 都可能带有 @Conditional 注解,它用来指定配置类生效的条件。

  • 条件注解:例如 @ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnBean@ConditionalOnMissingBean 等,这些注解可以帮助决定哪些自动配置类会被激活。

    @ConditionalOnClass: 当指定的类位于类路径上时,才会启用被注解的组件或配置。这可用于根据类的可用性来决定是否启用某个特定功能。
    @ConditionalOnMissingClass: 当指定的类不在类路径上时,才会启用被注解的组件或配置。这可用于在某些类不可用时应用备用实现。
    @ConditionalOnBean: 当指定的 Bean 在应用程序上下文中存在时,才会启用被注解的组件或配置。这可以用于基于其他 Bean 的存在与否来决定是否启用特定功能。
    @ConditionalOnMissingBean : 当指定的 Bean 在应用程序上下文中不存在时,才会启用被注解的组件或配置。这可用于提供默认实现或避免重复创建 Bean。
    @ConditionalOnProperty: 当指定的属性满足条件时,才会启用被注解的组件或配置。这可用于基于配置属性的值来决定是否启用特定功能。
    @ConditionalOnExpression: 当指定的 SpEL 表达式计算结果为 true 时,才会启用被注解的组件或配置。这可用于更复杂的条件判断。

1.5.自动配置类

  • 自动配置类:每个自动配置类通常会针对一个特定的框架或技术栈(如 Tomcat、JPA、Redis 等)。
  • 配置Bean:自动配置类内部会通过 @Bean 方法来注册 Bean 到 Spring 容器中。
  • 属性绑定:自动配置类还可以通过 @ConfigurationProperties 注解来绑定配置文件中的属性到特定的 Java 对象上。

1.6.配置文件

  • application.propertiesapplication.yml:这些文件包含了 Spring Boot 应用程序的配置信息,用于调整自动配置的行为。

1.7.Starter 依赖

Spring Boot 提供了一组“starter”依赖,这些依赖简化了项目的依赖管理。每个 starter 包含了构建典型应用所需的依赖项,而无需编写复杂的 XML 配置文件。例如,spring-boot-starter-web 包含了 Web 应用所需的所有依赖,如 Spring MVC、Tomcat(默认的嵌入式容器)等。

2.自动装配的过程

2.1 启动 Spring 应用

当你运行带有 @SpringBootApplication 注解的主类时,Spring Boot 会开始初始化 Spring 应用上下文。

2.2 导入自动配置

  • @EnableAutoConfiguration:该注解触发了 AutoConfigurationImportSelector 的执行。
  • AutoConfigurationImportSelector:这个类会根据类路径上的可用资源来决定应该导入哪些自动配置类。
  • 选择自动配置类:通过 getCandidateConfigurations() 方法,AutoConfigurationImportSelector 会读取 spring.factories 文件中的配置,从中挑选出所有以 org.springframework.boot.autoconfi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值