Spring Boot 自动配置:它是怎么"自动"的?
【摘要】 Spring Boot 自动配置:它是怎么"自动"的?用 Spring Boot 最爽的体验大概就是:引入一个 starter 依赖,配几个属性,应用就能跑起来。不用像以前那样写一堆 XML 配置。但很多人只是"会用",并不清楚它到底是怎么自动装配的。今天就来拆解一下这个"魔法"。 入口:@SpringBootApplication每个 Spring Boot 项目都有一个启动类,上面标着...
Spring Boot 自动配置:它是怎么"自动"的?
用 Spring Boot 最爽的体验大概就是:引入一个 starter 依赖,配几个属性,应用就能跑起来。不用像以前那样写一堆 XML 配置。但很多人只是"会用",并不清楚它到底是怎么自动装配的。今天就来拆解一下这个"魔法"。
入口:@SpringBootApplication
每个 Spring Boot 项目都有一个启动类,上面标着 @SpringBootApplication。这个注解其实是个"三合一":
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
它由三个核心注解组成:
**@SpringBootConfiguration**:本质上就是@Configuration,标记这是一个配置类。**@ComponentScan**:自动扫描当前包及子包下的@Component、@Service、@Controller等组件。**@EnableAutoConfiguration**:自动配置的核心,告诉 Spring Boot 根据 classpath 下的依赖自动装配 Bean。
自动配置的核心流程
@EnableAutoConfiguration 内部通过 @Import(AutoConfigurationImportSelector.class) 导入自动配置逻辑。大致流程如下:
- 扫描所有 starter 中的配置文件:Spring Boot 会读取 classpath 下所有 jar 包中的
META-INF/spring.factories(Spring Boot 2.7 之前)或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 2.7+),拿到所有候选的自动配置类。 - 按需加载:并不是所有候选类都会被加载,每个自动配置类上都有一堆条件注解,只有满足条件才会生效:
@ConditionalOnClass:classpath 中存在某个类时才生效(比如引入了 MySQL 驱动才加载数据源配置)。@ConditionalOnMissingBean:用户没有自定义同类型 Bean 时才生效(用户自己配了就优先用用户的)。@ConditionalOnProperty:配置文件中某个属性存在或为指定值时才生效。@ConditionalOnWebApplication:只有在 Web 应用中才生效。
- 绑定配置属性:自动配置类会通过
@ConfigurationProperties读取application.yml或application.properties中的配置,比如server.port=8080、spring.datasource.url=...。
举个栗子:数据源自动配置
当你引入 spring-boot-starter-jdbc 和 MySQL 驱动后,Spring Boot 会自动配置一个 DataSource Bean。核心逻辑大致如下(简化版):
@Configuration
@ConditionalOnClass(DataSource.class) // classpath 中有 DataSource 类
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置属性
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 用户没自定义 DataSource 时才生效
public DataSource dataSource(DataSourceProperties properties) {
// 根据配置创建 HikariCP / Druid 等连接池
return properties.initializeDataSourceBuilder().build();
}
}
对应的配置属性类:
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
// getter / setter ...
}
你在 application.yml 里写的:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
就会被自动绑定到 DataSourceProperties 中,然后用来创建数据源。
如何排查自动配置?
如果想知道哪些自动配置生效了、哪些没生效,可以在启动时加上调试参数:
debug: true
或者启动时加 JVM 参数:
-Ddebug
控制台会输出 Positive matches(生效的)和 Negative matches(未生效的)列表,非常直观。
自定义 Starter
理解了自动配置原理,你也可以自己写一个 starter。大致步骤:
- 创建一个自动配置类,用
@Configuration+ 条件注解。 - 在
META-INF/spring.factories(或.imports文件)中注册它。 - 提供
xxx-spring-boot-starter命名的 jar 包,别人引入依赖就能用。
很多公司内部的基础设施封装(比如统一日志、统一鉴权)就是这么做的。
一句话总结
@SpringBootApplication=@Configuration+@ComponentScan+@EnableAutoConfiguration。- 自动配置通过读取
spring.factories(或.imports)拿到候选类,再用条件注解按需加载。 - 用户自定义的 Bean 优先级高于自动配置的 Bean。
- 开启
debug=true可以查看自动配置的生效情况。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)