1. 什么是SpringBoot自动装配?
自动装配(Auto Configuration)是SpringBoot最核心的特性之一。简单来说,就是SpringBoot根据你引入的依赖,自动帮你配置好相关的Bean,让你不用再像传统Spring项目那样写大量的XML配置或Java配置类。
SpringBoot 实现自动装配,靠的是一种"约定"机制。你可以把它想象成:第三方组件(比如 Redis、MyBatis)提前把"我需要自动配置哪些 Bean"的信息,写在一个固定的位置------META-INF/spring.factories 文件中。SpringBoot 启动时,会自动去这个约定好的位置读取信息,然后帮你把那些 Bean 创建好。这样,组件提供方和 SpringBoot 框架之间不需要硬编码依赖,只要双方遵守这个"文件路径 + 格式"的约定,就能自动完成装配。
SpringBoot启动流程

首先在启动类启动后会创建 IOC 容器 ,然后将源配置类 放进去,接着开始加载所有的配置类 。这个过程主要由 @ComponentScan 和 @Import 进行扫描:前者负责扫描指定包下的 Bean,而第三方包中的 Bean 路径信息未知,因此通过 @Import 来查找。由于源配置类上有 @SpringBootApplication 注解,它间接包含了 @EnableAutoConfiguration 和 @Import(AutoConfigurationImportSelector.class),所以会通过 @Import 执行 AutoConfigurationImportSelector.class 中的方法。该方法通过 SpringFactoriesLoader 读取 spring.factories 中需要进行自动配置的 Bean 路径信息,将集合返回;然后将扫描到的所有 Bean 信息封装成 BeanDefinition,再进行后续 Bean 的实例化和初始化。
举个例子:你引入spring-boot-starter-web依赖后,SpringBoot会自动帮你配置好Tomcat服务器、DispatcherServlet、视图解析器等Web开发所需的组件,你直接写Controller就能运行。
2. 自动装配的核心原理
自动装配的实现主要依赖以下几个关键机制:
- @SpringBootApplication注解 :这是一个组合注解,包含了
@EnableAutoConfiguration、@ComponentScan和@Configuration。 - spring.factories文件 :在
META-INF/spring.factories文件中,配置了所有自动配置类的全限定名。 - 条件注解 :如
@ConditionalOnClass、@ConditionalOnMissingBean等,控制配置类是否生效。
3. AutoConfiguration什么时候加载?
自动配置类的加载时机是在SpringBoot应用启动时,具体流程如下:
- SpringBoot启动时,会加载
@SpringBootApplication注解。 - 该注解中的
@EnableAutoConfiguration会导入AutoConfigurationImportSelector类。 AutoConfigurationImportSelector会读取所有META-INF/spring.factories文件中配置的自动配置类。- 然后根据条件注解(如
@ConditionalOnClass)判断哪些配置类应该生效。 - 只有满足条件的自动配置类才会被加载到Spring容器中。
简单记忆:启动时扫描 → 读取配置 → 条件判断 → 按需加载。
4. 场景示例:Redis自动装配
假设你的项目中引入了Redis依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
当你启动SpringBoot应用时,自动装配过程如下:
- 第一步 :SpringBoot扫描
spring.factories文件,发现RedisAutoConfiguration类。 - 第二步 :检查条件注解
@ConditionalOnClass({RedisOperations.class}),发现类路径下确实有RedisOperations类(因为引入了依赖),条件满足。 - 第三步 :检查
@ConditionalOnMissingBean(name = "redisTemplate"),发现容器中还没有redisTemplate这个Bean,于是自动创建并注册。 - 第四步 :同时读取
application.yml中的spring.redis配置(如host、port),注入到RedisProperties中。
最终效果:你只需要在application.yml中配置Redis连接信息,就可以直接在代码中注入RedisTemplate来操作Redis了:
java
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void setValue(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
整个过程你不需要写任何配置类,这就是自动装配的魅力。
5. 总结
SpringBoot自动装配的本质是:通过约定大于配置的方式,在启动时根据类路径下的依赖和配置,自动判断并注册所需的Bean。它大大简化了Spring应用的开发,让开发者可以专注于业务逻辑。