SpringBoot自动配置原理

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean

概述

SpringBoot 核心能力之一就是自动配置,SpringBoot之所以可以快速集成Spring组件,是因为它具备自动配置的能力。

本文将探索 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition 包中的相关注解,这些是实现SpringBoot自动配置的一线工作者。

@SpringBootApplication

我们使用此 @SpringBootApplication注解 来标记 Spring Boot 应用程序的主类:


@SpringBootApplication
class VehicleFactoryApplication {
   

    public static void main(String[] args) {
   
              SpringApplication.run(VehicleFactoryApplication.class, args);
    }
}

点击@SpringBootApplication 注解会发现其封装了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注释。

@EnableAutoConfiguration

@EnableAutoConfiguration,顾名思义,启用自动配置。这意味着 Spring Boot 在其 Classpath 上查找自动配置 bean 并自动应用它们。

请注意,我们必须将此 annotation 与 @Configuration一起使用:


@Configuration
@EnableAutoConfiguration
class VehicleFactoryConfig {
   

}

条件配置

@ConditionalOnClass 和 @ConditionalOnMissingClass

使用这两个注解,可以实现在指定 class 存在/不存在 的时候自动装配bean。


@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoconfiguration {
   
    //...
}

@ConditionalOnBean 和 @ConditionalOnMissingBean

当我们想根据特定 bean 的存在与否来定义条件时,我们可以使用这些注解:


@Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
   
    // ...
}

@ConditionalOnProperty

通过这个注解,我们可以对 properties 的值设置条件装配:


@Bean
@ConditionalOnProperty(
    name = "usemysql", 
    havingValue = "local"
)
DataSource dataSource() {
   
    // ...
}

@ConditionalOnResource

通过这个注解,我们可以对 resource 的值设置条件装配:


@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
   
    // ...
}

@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

通过这些注释,我们可以根据当前应用程序是否是 Web 应用程序来创建条件装配:


@ConditionalOnWebApplication
HealthCheckController healthCheckController() {
   
    // ...
}

@ConditionalExpression

我们可以在更复杂的情况下使用这个注解。当 SPEL 表达式被评估为true时, Spring 将使用标记的定义:


@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
   
    // ...
}

@Conditional

对于更复杂的条件,我们可以创建一个评估自定义条件的类。我们告诉 Spring 将此自定义条件与 @Conditional一起使用


@Conditional(HibernateCondition.class)
Properties additionalProperties() {
   
    //...
}

总结

本文阐述了SpringBoot 自动配置原理以及常见的装配bean手段,并提供了在不同使用场景的最佳实践参考。

引用

目录
相关文章
|
2月前
|
Java
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
|
1月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
92 0
|
2月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
95 0
|
3月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
154 12
|
4月前
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
119 17
springboot自动配置原理
|
5月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
5月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
458 14
|
6月前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
107 17
|
6月前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效