Spring Boot 的自动配置是其核心特性之一,它帮助开发者**"开箱即用"**地使用各种第三方库或 Spring 组件,而无需手动配置 Bean。这一切的背后,都依赖于 Spring Boot 的自动配置机制。
我们分两部分来说:
-
Spring Boot 自动配置的整体流程
-
我们依赖的第三方包是如何一步步被自动配置并导入使用的
一、Spring Boot 自动配置的整体流程
1. @SpringBootApplication
注解启动入口
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
-
@SpringBootApplication
是一个组合注解,包含:-
@SpringBootConfiguration
(实际上就是@Configuration
) -
@EnableAutoConfiguration
-
@ComponentScan
-
2. 关键点:@EnableAutoConfiguration
这个注解的作用就是启用自动配置,底层依赖的是:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
这里的核心逻辑是:导入一批配置类,这些类就定义了我们依赖的组件如何被自动装配。
3. AutoConfigurationImportSelector 工作机制
-
它会去加载
META-INF/spring.factories
(Spring Boot 2.x) 或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(Spring Boot 3.x)中的配置类列表。 -
这些类就是一堆以
xxxAutoConfiguration
结尾的类,比如:
# META-INF/spring.factories(Spring Boot 2.x)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...
Spring Boot 会按需加载这些自动配置类,也就是判断你是否引入了相关依赖、是否配置了对应属性等,来决定要不要配置这个组件。
二、依赖的包是如何一步步自动配置导入的?
举个例子:我们引入了 spring-boot-starter-data-redis
,程序中就能直接用 RedisTemplate
。
来看这条链路是怎么走通的:
步骤 1:你引入了 Redis 的 starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
它的依赖会自动包含:
-
spring-data-redis
-
lettuce-core
(默认客户端) -
spring-boot-autoconfigure
步骤 2:自动配置类生效
在 spring-boot-autoconfigure
包的 spring.factories
文件中,你会看到:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
这个配置类就被加载了。
步骤 3:RedisAutoConfiguration
中的 Bean 被自动注册
打开源码可以看到:
@Configuration
@ConditionalOnClass(RedisOperations.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {...}
}
这表示:
-
如果项目中有 Redis 相关类(即你引入了相关依赖)
-
如果容器里没有手动注入
RedisTemplate
-
那就自动帮你注册一个默认的
RedisTemplate
Bean
步骤 4:你就可以在代码中使用了
@Autowired
private RedisTemplate redisTemplate;
你并没有显式配置 Redis 相关的 Bean,但因为自动配置已经做完了,所以直接就能使用。
总结流程图
@SpringBootApplication↓
@EnableAutoConfiguration↓
AutoConfigurationImportSelector↓
读取 spring.factories / spring-autoconfigure-metadata↓
加载 xxxAutoConfiguration 类↓
根据条件注册 Bean(@ConditionalOnClass / OnBean / OnProperty)↓
你就能直接使用这些 Bean
补充:如何自定义或覆盖自动配置?
-
如果你自己定义了同名 Bean,比如
RedisTemplate
,就会覆盖自动配置(@ConditionalOnMissingBean 生效)。 -
想要禁用某个自动配置,可以通过:
spring.autoconfigure.exclude:- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
如果你有某个具体依赖包的例子(比如 MyBatis、Kafka、Elasticsearch),我也可以具体分析它的自动配置链路。需要的话随时说~