Spring Boot 3 继承了 Spring Boot 2 的许多特性,并进行了进一步的改进和优化。以下是关于 Spring Boot 3 自动装配原理的详细说明,涉及到的每一个注解和配置文件:
1. 核心注解
@SpringBootApplication
这个注解是一个组合注解,包含了以下几个注解:
5.3 自动配置过程
在应用启动时,EnableAutoConfigurationImportSelector
会从类路径下的 META-INF/spring.factories
文件中读取所有的自动配置类,并将其加载到应用上下文中。
spring.factories
示例:
@SpringBootConfiguration
:一个特殊的@Configuration
,标记这是一个 Spring Boot 配置类。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置机制。@ComponentScan
:自动扫描当前包及其子包中的所有@Component
、@Service
、@Repository
和@Controller
注解的类,并注册为 Spring Bean。-
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
2. 自动配置类
Spring Boot 提供了大量的自动配置类,这些类通常以
AutoConfiguration
结尾,例如JpaRepositoriesAutoConfiguration
、WebMvcAutoConfiguration
等。这些类的主要作用是根据类路径中的依赖和应用的配置自动配置 Spring Bean。自动配置类示例
以
DataSourceAutoConfiguration
为例,这是一个自动配置数据源的类:@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(DataSourceProperties.class) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @Conditional(EmbeddedDatabaseCondition.class) @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class }) public class DataSourceAutoConfiguration { // Configuration code }
3. 条件注解
Spring Boot 使用了一系列的条件注解来决定是否应用某个自动配置类或 Bean:
@Conditional
:根据自定义的条件来判断是否实例化一个 Bean。@ConditionalOnClass
:当类路径中存在指定的类时,才会实例化一个 Bean。@ConditionalOnMissingClass
:当类路径中不存在指定的类时,才会实例化一个 Bean。@ConditionalOnBean
:当容器中存在指定的 Bean 时,才会实例化一个 Bean。@ConditionalOnMissingBean
:当容器中不存在指定的 Bean 时,才会实例化一个 Bean。@ConditionalOnProperty
:当指定的属性有特定值时,才会实例化一个 Bean。@ConditionalOnResource
:当类路径中存在指定的资源时,才会实例化一个 Bean。@ConditionalOnWebApplication
:当当前应用是 Web 应用时,才会实例化一个 Bean。@ConditionalOnNotWebApplication
:当当前应用不是 Web 应用时,才会实例化一个 Bean。-
4. 配置文件
Spring Boot 的默认配置文件是
application.properties
或application.yml
。这些文件用于配置应用程序的各种属性,例如数据库连接、端口号、日志级别等。配置文件示例
-
spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret
5. 启动过程
5.1 主类
在 Spring Boot 应用的主类上使用
@SpringBootApplication
注解 -
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
5.2 SpringApplication.run()
当你调用
SpringApplication.run()
时,Spring Boot 会启动一个内嵌的 Spring 应用上下文,并执行以下步骤: - 启动内嵌的应用上下文。
- 扫描和注册所有的 Spring Bean,包括自动配置类。
- 应用所有的自动配置类,根据条件注解决定哪些配置需要应用。
- 启动嵌入的服务器(如果是 Web 应用)。
- 应用程序就绪,开始接收请求或执行任务。
-
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ ...
每个自动配置类根据其条件注解决定是否生效。例如,
DataSourceAutoConfiguration
会检查类路径中是否有数据源相关的类,并根据属性配置创建并注入数据源 Bean。 -
5.3 自动配置过程
在应用启动时,
EnableAutoConfigurationImportSelector
会从类路径下的META-INF/spring.factories
文件中读取所有的自动配置类,并将其加载到应用上下文中。spring.factories
示例: -
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ ...
6. Spring Boot 3 的改进和新特性
6.1 模块化配置
Spring Boot 3 更加注重模块化配置,通过使用新的配置属性和条件注解,开发者可以更灵活地控制应用的自动配置行为。
6.2 支持 Java 17
Spring Boot 3 支持最新的 Java 17 特性和改进,包括新的语法、性能优化和安全增强。
6.3 增强的 GraalVM 支持
Spring Boot 3 增强了对 GraalVM 的支持,使得应用程序可以更容易地编译为原生镜像,从而提高启动速度和运行效率。
6.4 新的依赖管理
Spring Boot 3 更新了依赖管理,支持最新版本的 Spring 框架和其他关键依赖项,确保应用程序的安全性和性能。
总结
Spring Boot 3 的自动装配通过扫描类路径、读取配置文件、应用条件注解等方式,自动配置所需的 Bean,使得开发者无需手动配置复杂的依赖和 Bean,从而大大简化了应用的开发和配置过程。这个过程涉及多个核心注解、自动配置类、条件注解以及配置文件的配合,确保了应用能够根据实际需求和环境自动调整和优化。Spring Boot 3 还引入了许多新特性和改进,进一步提升了开发体验和应用性能。