Spring Boot自动配置原理

概述

面试中频率非常高的一个问题:Spring Boot如何实现自动配置?或其原理是什么?

如何简洁而又条理地抓住重点来回答这个问题,其实有点难。

必须要提到的几个要点:

  • 约定优于配置:Convention over Configuration,通过扫描类路径上的依赖和现有的 Bean 定义,动态地为应用提供合理的默认配置;
  • @EnableAutoConfiguration注解:通过启动类上的@SpringBootApplication引入;
  • AutoConfigurationImportSelector.selectImports():动态加载配置类;
  • 条件注解:根据类路径依赖、现有Bean、属性配置等条件决定是否启用某些配置;
  • spring.factories文件:基于SPI机制;
  • AutoConfiguration.imports文件:Spring Boot 3.0版本后推荐的方式。

原理

分析自动配置原理的入口是启动类,启动类使用@SpringBootApplication,这是一个组合注解,包括@EnableAutoConfiguration。

另外,自动配置源码在spring-boot-autoconfigure-3.2.4.jar,即,本文基于Spring Boot 3.2.4版本。

EnableAutoConfiguration

该注解的源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
   
   
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
	Class<?>[] exclude() default {
   
   };
	String[] excludeName() default {
   
   };
}

面对一个注解类,对其进行分析,要从两个地方入手:

  • 添加的注解:如@Target、@AutoConfigurationPackage等。
  • 属性:如exclude;

@Target等4个注解可略过,不清楚可参考Java基础之注解

@AutoConfigurationPackage,作用是将添加该注解的类所在的package作为自动配置package进行管理。

@Import,作用是将所有符合自动配置条件的Bean定义加载到Spring IoC容器。看注解时,还得看其参数,此处为AutoConfigurationImportSelector.class,请看后文。

此注解有两个属性excludeexcludeName,功能定位几乎相同,都是用于排除自动配置生效类,具体代码看getExclusions方法。

此外,还有个字段,ENABLED_OVERRIDE_PROPERTYAutoConfigurationImportSelector.selectImports()方法里用于判断自动配置是否生效:

protected boolean isEnabled(AnnotationMetadata metadata) {
   
   
	if (getClass() == AutoConfigurationImportSelector.class) {
   
   
		return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
	}
	return true;
}

AutoConfigurationImportSelector

看一下源码:

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
   
   
	// 关闭自动配置时返回空Entry
	private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry();
	// 关闭自动配置时返回空数组
	private static final String[] NO_IMPORTS = {
   
   };
	// 用于排除自动配置类
	private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude";
	// 
	private ConfigurableListableBeanFactory beanFactory;
	// 
	private Environment environment;
	// 类加载器
	private ClassLoader beanClassLoader;<
### Spring Boot 自动配置原理解释 #### 启动过程中的自动配置加载 当应用程序启动时,`SpringApplication.run()`方法会触发一系列初始化操作。其中一项重要任务就是加载并执行自动配置逻辑。这一过程中,框架通过读取位于 `META-INF/spring.factories` 文件内的配置项来识别哪些组件应该被激活[^1]。 #### 配置文件解析与条件化装配 对于每一个可能参与自动配置的服务或功能模块(如AOP、Nacos、事务管理等),都有对应的Java配置类负责创建所需的Bean实例。这些配置类通常带有特定的注解标记,比如`@ConditionalOnClass` 或者 `@ConditionalOnMissingBean`,用于判断当前环境是否满足启用该服务的前提条件。只有在所有前置条件都成立的情况下,才会真正地向IoC容器注册相应的Bean对象[^2]。 #### 注解驱动的便捷开发体验 开发者只需简单声明某个特性相关的启停开关型注解——例如`@EnableXXXAutoConfiguration`,即可轻松控制对应特性的开启与否。这是因为此类注解内部集成了对多个潜在可用配置的支持,并能够依据实际运行上下文动态调整行为模式。这种设计极大地减少了手动编写繁琐XML配置的需求,使得项目搭建更加高效快捷[^3]。 ```java @SpringBootApplication // 包含了@EnableAutoConfiguration等功能 public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` #### SPI机制支持灵活扩展 除了内置的功能外,第三方库也可以利用相同的SPI(Service Provider Interface)接口规范参与到Spring Boot自动配置体系当中去。只要遵循既定规则,在项目的依赖路径下放置合适的元数据描述文档(`META-INF/spring.factories`)以及实现具体的业务逻辑代码,则可以无缝集成新的能力到现有系统之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

晚饭能不能加鸡腿就靠你了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值