Skip to content

springboot自动配置原理

一、核心注解:@SpringBootApplication

@SpringBootApplication 是SpringBoot项目的核心启动注解,它封装了三个关键注解:

  1. @SpringBootConfiguration:本质是 @Configuration,声明当前类为配置类;
  2. @EnableAutoConfiguration:自动配置的核心注解;
  3. @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。

二、自动配置核心:@EnableAutoConfiguration

@EnableAutoConfiguration 是实现自动化配置的关键,其工作流程如下:

  1. 通过 @Import 导入 AutoConfigurationImportSelector
  2. 读取项目及依赖Jar包的 classpathMETA-INF/spring.factories 文件;
  3. 加载文件中配置的所有自动配置类的全类名;
  4. 这些配置类中的Bean会根据条件注解决定是否导入Spring容器。

三、条件注解的作用

自动配置类中通过条件注解实现按需加载,常见注解:

  • @ConditionalOnClass:判断类路径中是否存在指定类,存在时才加载配置;
  • @ConditionalOnMissingBean:判断Spring容器中是否不存在指定Bean,不存在时才创建Bean;
  • @ConditionalOnProperty:判断配置文件中是否存在指定属性,满足条件时才加载配置。

示例:Redis自动配置类

java
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(name = {"redisTemplate"})
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

四、完整自动配置流程

  1. 启动类添加 @SpringBootApplication 注解;
  2. @EnableAutoConfiguration 触发,通过 AutoConfigurationImportSelector 读取 spring.factories
  3. 加载所有自动配置类,根据条件注解判断是否生效;
  4. 生效的配置类向Spring容器中注册Bean,完成自动配置;
  5. 项目根据依赖自动装配所需组件,无需手动编写配置。

面试相关问题

  1. 问:SpringBoot自动配置的原理是什么?答: SpringBoot自动配置的核心是 @EnableAutoConfiguration 注解,它通过 AutoConfigurationImportSelector 读取 META-INF/spring.factories 文件中配置的自动配置类,再根据条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean)判断这些配置类是否生效,生效的配置类会向Spring容器中注册Bean,从而实现根据项目依赖自动装配组件,无需手动编写XML配置。

  2. 问:@SpringBootApplication注解由哪几个注解组成?各自的作用是什么?答: 它由三个注解组成:

    • @SpringBootConfiguration:声明当前类为配置类,可定义Bean;
    • @EnableAutoConfiguration:自动配置的核心,加载并条件化生效自动配置类;
    • @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包,注册标注了 @Component@Service 等注解的Bean。
  3. 问:spring.factories文件的作用是什么?答: spring.factories 文件位于 META-INF 目录下,用于配置所有自动配置类的全类名。SpringBoot启动时会读取该文件,加载其中的自动配置类,再根据条件注解判断是否生效,是自动配置实现的关键文件。

  4. 问:条件注解在自动配置中的作用是什么?答: 条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean)用于控制自动配置类的生效条件,确保只有当项目中存在指定依赖、配置或Bean时,对应的自动配置才会生效,避免不必要的Bean注册,实现按需自动装配。

Powered by VitePress 1.6.4 | 持续更新中