【Springboot】自动装配原理
简单介绍
自动装配(Auto-configuration)是 Spring Boot 的核心特性,简单来说,它是指 Spring Boot 在应用启动时,根据项目的依赖、配置和运行环境,自动完成 Spring 容器中 Bean 的注册、配置及关联,无需开发者手动编写大量 XML 或 Java 配置代码的过程。
核心目标用于解决传统 Spring 开发中配置繁琐的问题。在传统 Spring 中,开发者需要手动定义 Bean、配置依赖关系,而自动装配通过约定大于配置的思想,让开发者只需引入依赖,就能自动获得该依赖所需的默认配置和 Bean,实现开箱即用。
具体原理可拆解为以下步骤:
入口:@SpringBootApplication 注解
Spring Boot 应用的启动类上标注 @SpringBootApplication 注解,这个注解是自动装配的总开关
![]()
@SpringBootApplication 是一个复合注解,前四个注解是 Java 自带的元注解,用于修饰注解的注解,后三个注解是 Spring Boot 自定义的,决定了 @SpringBootApplication 的核心功能

核心功能注解
1.@SpringBootConfiguration 被 @Configuration 注解修饰,标记当前类是一个配置类,允许在类中通过 @Bean 注解定义 Spring 容器中的 Bean

2.@EnableAutoConfiguration 是 Spring Boot 自动装配的核心开关,通过 @Import(AutoConfigurationImportSelector.class) 触发自动配置逻辑,动态导入并激活符合条件的自动配置类,实现引入依赖即自动配置(下面会详细介绍)
3.@ComponentScan 用于扫描并注册组件到 Spring 容器中(如 @Component、@Service、@Controller 等注解标记的类)
核心:@EnableAutoConfiguration 注解
@EnableAutoConfiguration 是 Spring Boot 实现自动装配的核心注解,它的核心作用是开启 Spring 的自动配置机制,让 Spring Boot 根据项目的依赖、配置和运行环境,自动识别并注册所需的 Bean 到 Spring 容器中。
@EnableAutoConfiguration 注解中通过 @Import(AutoConfigurationImportSelector.class) 注解导入了 AutoConfigurationImportSelector 这个关键类,这个类是自动配置的执行者,负责动态查找并导入所有符合条件的自动配置类(即预定义的、用于配置特定场景 Bean 的类)。

加载自动配置类:AutoConfigurationImportSelector

AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口(它是 ImportSelector 的子接口),ImportSelector 接口定义了 selectImports(AnnotationMetadata metadata) 方法,其返回值是需要导入的类的全限定名字符串数组,Spring 容器会将这些类识别为配置类,并将其注册到 IoC 容器中交给容器管理。

AutoConfigurationImportSelector 类通过实现 DeferredImportSelector 接口间接实现了其顶层接口 ImportSelector,并重写了 ImportSelector 接口中的 selectImports (AnnotationMetadata metadata) 方法。

该方法的最终返回值为 StringUtils.toStringArray (configurations),其中 configurations 初始来源于 getCandidateConfigurations (annotationMetadata, attributes) 方法,此方法的核心作用是从 Spring Boot 约定的配置文件中,读取所有预定义的自动配置类,形成初始候选清单(如图112个)。

找到 getCandidateConfigurations(annotationMetadata,attributes) 方法,可以看到 message 的内容,我们知道所有预定义的自动配置类在 META-INF/spring.factories 中对应 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键的属性值下 或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件

回到 selectImports (AnnotationMetadata metadata) 方法,需要注意的是,configurations 并非直接作为返回值,而是从预定义的自动配置类清单中,经过一系列过滤、去重、排除操作,最终返回需要被 Spring 容器导入的自动配置类全限定名数组(如图28个)。

修改自动装配的默认值
此处我们以 server.port 为例,
从 META-INF/spring.factories (在这个文件里,列出了所有自动配置类的全限定名)中对应 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键的属性值下找到 org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration 自动配置类

@EnableConfigurationProperties(ServerProperties.class) 是 Spring Boot 中用于启用并注册配置属性类的核心注解,它的作用是将 ServerProperties 类激活为 Spring 容器管理的 Bean,需要启用 ServerProperties 类的 @ConfigurationProperties 功能,让它能够真正生效,并让其能够接收配置文件中的属性值,是连接配置文件和 Java 代码的关键桥梁。
@Bean 注解的作用是将被注解方法的返回值定义为 Spring 管理的 Bean,供容器中的其他组件注入和使用。创建并注册Web 服务器配置定制器的 Bean,这些 Bean 会负责将 ServerProperties 中的配置应用到嵌入式 Web 服务器中。
ServerProperties.class 如下

@ConfigurationProperties(prefix = “server”) 通过该注解,ServerProperties 会自动读取配置文件中 server 前缀的属性,并赋值给对应的字段。
META-INF/spring-configuration-metadata.json 文件是 Spring Boot 配置属性的配置元数据文件,专门用于统一管理配置属性的默认值、描述、类型等信息。在这里我们可以看到默认端口号8080

application.properties/yaml 就可以修改端口号了

更多推荐


所有评论(0)