SpringBoot自动配置原理

简介: 本文深入解析了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手段,并提供了在不同使用场景的最佳实践参考。

引用

目录
相关文章
|
5月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1964 0
|
7月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1186 0
|
4月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
474 3
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
565 2
|
7月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
474 17
springboot自动配置原理
|
11月前
|
Java
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
|
11月前
|
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服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
12月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
1534 12
|
10月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
669 0