Spring Boot 中的各种原理解析说一说

Spring Boot 启动原理

入口点:SpringApplication.run()

1
2
3
4
5
6
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

@SpringBootApplication 是一个复合注解:

1
2
3
4
5
6
7
8
9
@SpringBootConfiguration  // 继承 @Configuration
@EnableAutoConfiguration // 开启自动配置
@ComponentScan(
excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
}
)
public @interface SpringBootApplication {}

SpringApplication 启动流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SpringApplication.run()

new SpringApplication(primarySources).run(args)

[构造阶段] deduceWebApplicationType() // 推断应用类型 (Servlet/Reactive/None)

[构造阶段] setInitializers() // 加载 ApplicationContextInitializer

[构造阶段] setListeners() // 加载 ApplicationListener

[运行阶段] run()
├─ 1. 启动计时器 (StartupInfoLogger)
├─ 2. 获取 SpringApplicationRunListeners
├─ 3. 发布 ApplicationStartingEvent
├─ 4. 准备环境 (prepareEnvironment)
│ ├─ 加载配置文件 (application.properties/yml)
│ ├─ 加载系统环境变量
│ └─ 发布 ApplicationEnvironmentPreparedEvent
├─ 5. 打印 Banner
├─ 6. 创建 ApplicationContext
│ ├─ Servlet: AnnotationConfigServletWebServerApplicationContext
│ └─ Reactive: AnnotationConfigReactiveWebServerApplicationContext
├─ 7. 准备 Context (prepareContext)
│ ├─ 执行 Initializers
│ ├─ 加载主类作为 Configuration
│ └─ 发布 ApplicationPreparedEvent
├─ 8. 刷新 Context (refreshContext) ← **核心:Bean 加载在此完成**
├─ 9. 启动 WebServer (如果是 Web 应用)
├─ 10. 发布 ApplicationStartedEvent
├─ 11. 执行 CommandLineRunner / ApplicationRunner
└─ 12. 发布 ApplicationReadyEvent

Bean 加载原理

刷新上下文的核心流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// AbstractApplicationContext.refresh()
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 1. 准备刷新
prepareRefresh();

// 2. 获取/刷新 BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// 3. 准备 BeanFactory
prepareBeanFactory(beanFactory);

try {
// 4. 子类扩展点 (空实现,供子类重写)
postProcessBeanFactory(beanFactory);

// 5. 执行 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);

// 6. 注册 BeanPostProcessor
registerBeanPostProcessors(beanFactory);

// 7. 初始化 MessageSource
initMessageSource();

// 8. 初始化 ApplicationEventMulticaster
initApplicationEventMulticaster();

// 9. 子类扩展:初始化 WebServer (ServletWebServerApplicationContext)
onRefresh();

// 10. 注册事件监听器
registerListeners();

// 11. 实例化所有非懒加载的单例 Bean
finishBeanFactoryInitialization(beanFactory);

// 12. 完成刷新,发布 ContextRefreshedEvent
finishRefresh();
}
// ... catch 和 finally
}
}

配置类解析与 Bean 定义注册

invokeBeanFactoryPostProcessors() 是理解 Bean 加载的关键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
invokeBeanFactoryPostProcessors()

ConfigurationClassPostProcessor.processConfigBeanDefinitions()

// 解析所有 @Configuration 类
ConfigurationClassParser.parse()
├─ 1. 处理 @ComponentScan
│ ↓
│ ComponentScanAnnotationParser.parse()
│ ↓
│ ClassPathBeanDefinitionScanner.doScan()
│ ↓
│ 扫描 classpath,将 @Component 类注册为 BeanDefinition

├─ 2. 处理 @Import
│ ↓
│ 递归处理 ImportSelector / ImportBeanDefinitionRegistrar
@EnableAutoConfiguration 就是在这里加载的
│ ↓
│ AutoConfigurationImportSelector.selectImports()
│ 读取 META-INF/spring.factories 中的自动配置类

├─ 3. 处理 @ImportResource (XML 配置)

└─ 4. 处理 @Bean 方法

ConfigurationClassBeanDefinitionReader.loadBeanDefinitions()

@Bean 方法解析为 BeanDefinition

Bean 定义注册源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// ConfigurationClassParser.java
protected void processConfigurationClass(ConfigurationClass configClass) throws IOException {
// 1. 条件注解判断 (@Conditional)
if (this.conditionEvaluator.shouldSkip(configClass.getMetadata())) {
return;
}

// 2. 处理 @ComponentScan
Set<AnnotationAttributes> componentScans = AnnotationConfigUtils
.attributesForRepeatable(sourceClass.getMetadata(), ComponentScans.class);
if (!componentScans.isEmpty()) {
for (AnnotationAttributes componentScan : componentScans) {
Set<BeanDefinitionHolder> scannedBeanDefinitions =
this.componentScanParser.parse(componentScan, sourceClass.getMetadata());
// 递归检查扫描到的类是否也是 @Configuration
for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
parse(bdCand.getBeanClassName(), holder.getBeanName());
}
}
}

// 3. 处理 @Import
processImports(configClass, sourceClass, getImports(sourceClass), true);

// 4. 处理 @Bean 方法
Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
for (MethodMetadata methodMetadata : beanMethods) {
configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
}
}

Bean 加载中的类继承关系

核心类继承图谱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Object
└── BeanFactory (接口) ← 最顶层,定义获取 Bean 的基本方法
└── HierarchicalBeanFactory (接口) ← 支持层级结构
└── AutowireCapableBeanFactory (接口) ← 支持自动装配
└── ConfigurableListableBeanFactory (接口) ← 可配置、可列表
└── DefaultListableBeanFactory ← 标准实现

Object
└── ApplicationContext (接口) ← 应用上下文接口
└── ConfigurableApplicationContext (接口) ← 可配置
└── AbstractApplicationContext ← 骨架实现
└── GenericApplicationContext
└── AnnotationConfigApplicationContext
└── ServletWebServerApplicationContext
└── AnnotationConfigServletWebServerApplicationContext

Object
└── BeanDefinition ← Bean 定义抽象
├── AnnotatedBeanDefinition ← 注解方式
│ └── ScannedGenericBeanDefinition ← @Component 扫描
│ └── ConfigurationClassBeanDefinition ← @Configuration
└── AbstractBeanDefinition
└── RootBeanDefinition ← 最终的 Bean 定义
└── GenericBeanDefinition ← 通用的 Bean 定义

BeanFactory 继承体系详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// ========== 1. BeanFactory - 根接口 ==========
public interface BeanFactory {
Object getBean(String name); // 核心:按名称获取 Bean
<T> T getBean(String name, Class<T> requiredType); // 按名称和类型获取
<T> T getBean(Class<T> requiredType); // 按类型获取
boolean containsBean(String name); // 是否包含
boolean isSingleton(String name); // 是否单例
boolean isPrototype(String name); // 是否原型
}

// ========== 2. HierarchicalBeanFactory - 层级支持 ==========
public interface HierarchicalBeanFactory extends BeanFactory {
BeanFactory getParentBeanFactory(); // 父容器,用于分层架构
}

// ========== 3. AutowireCapableBeanFactory - 自动装配能力 ==========
public interface AutowireCapableBeanFactory extends BeanFactory {
int AUTOWIRE_NO = 0; // 不自动装配
int AUTOWIRE_BY_NAME = 1; // 按名称装配
int AUTOWIRE_BY_TYPE = 2; // 按类型装配
int AUTOWIRE_CONSTRUCTOR = 3; // 按构造器装配

<T> T createBean(Class<T> beanClass); // 创建 Bean
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck);
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName);
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName);
}

// ========== 4. ConfigurableListableBeanFactory - 完整能力 ==========
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
void registerSingleton(String beanName, Object singletonObject);
void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
Iterator<String> getBeanNamesIterator();
void freezeConfiguration();
boolean isConfigurationFrozen();
}

Bean 生命周期中的继承协作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Bean 生命周期 (AbstractAutowireCapableBeanFactory.doCreateBean)

┌─────────────────────────────────────────────────────────────┐
│ 阶段 1: 实例化 (Instantiation)
│ ├─ createBeanInstance()
│ │ ├─ 推断构造器 (SmartInstantiationAwareBeanPostProcessor)
│ │ └─ instantiateBean() 或 autowireConstructor()
│ └─ 此时:对象已创建,但未注入依赖 │
├─────────────────────────────────────────────────────────────┤
│ 阶段 2: 属性赋值 (Populate)
│ ├─ populateBean()
│ │ ├─ InstantiationAwareBeanPostProcessor.postProcessProperties()
│ │ └─ applyPropertyValues()
│ │ ├─ @Autowired 解析 │
│ │ ├─ @Value 解析 │
│ │ └─ @Resource 解析 │
│ └─ 此时:依赖已注入,但尚未初始化 │
├─────────────────────────────────────────────────────────────┤
│ 阶段 3: 初始化 (Initialization)
│ ├─ initializeBean()
│ │ ├─ BeanPostProcessor.postProcessBeforeInitialization()
│ │ │ └─ @PostConstruct 执行 (InitDestroyAnnotationBeanPostProcessor)
│ │ ├─ InitializingBean.afterPropertiesSet()
│ │ ├─ init-method 执行 │
│ │ └─ BeanPostProcessor.postProcessAfterInitialization()
│ │ └─ AOP 代理在此创建 │
│ └─ 此时:Bean 完全就绪 │
├─────────────────────────────────────────────────────────────┤
│ 阶段 4: 销毁 (Destruction)
│ └─ 容器关闭时 │
│ ├─ @PreDestroy 执行 │
│ ├─ DisposableBean.destroy()
│ └─ destroy-method 执行 │
└─────────────────────────────────────────────────────────────┘

后置处理器继承体系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// BeanPostProcessor - Bean 后置处理器 (所有 Bean 都会经过)
public interface BeanPostProcessor {
default Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
default Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
}

// InstantiationAwareBeanPostProcessor - 扩展实例化阶段
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) {
return true;
}
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
return null;
}
}

// MergedBeanDefinitionPostProcessor - 合并 BeanDefinition 阶段
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
default void resetBeanDefinition(String beanName) {}
}

// SmartInstantiationAwareBeanPostProcessor - 智能实例化 (预测类型、确定构造器)
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
default Class<?> predictBeanType(Class<?> beanClass, String beanName) {
return null;
}
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) {
return null;
}
default Object getEarlyBeanReference(Object bean, String beanName) {
return bean;
}
}

关键实现类:

后置处理器作用
AutowiredAnnotationBeanPostProcessor处理 @Autowired, @Value 注入
CommonAnnotationBeanPostProcessor处理 @Resource, @PostConstruct, @PreDestroy
AsyncAnnotationBeanPostProcessor处理 @Async 异步代理
TransactionalProxyFactoryBean处理 @Transactional 事务代理
AbstractAutoProxyCreatorAOP 代理创建基类

自动配置原理

@EnableAutoConfiguration 工作机制

1
2
3
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
AutoConfigurationImportSelector

selectImports()

getAutoConfigurationEntry()
├─ 1. 读取 META-INF/spring.factories
│ 键:org.springframework.boot.autoconfigure.EnableAutoConfiguration
│ 值:所有自动配置类全限定名列表

├─ 2. 去重 (removeDuplicates)

├─ 3. 排除 (getExclusions)
│ ├─ @EnableAutoConfiguration(exclude = {...})
│ └─ spring.autoconfigure.exclude

└─ 4. 过滤 (filter)

OnClassCondition.checkCandidates()

@ConditionalOnClass / @ConditionalOnMissingClass

条件注解实现

1
2
3
4
5
6
7
@ConditionalOnClass(DataSource.class)  // 类路径有 DataSource 才生效
@ConditionalOnMissingBean(DataSource.class) // 容器中没有 DataSource Bean 才生效
@ConditionalOnProperty(prefix = "spring.datasource", name = "url") // 配置存在才生效
@AutoConfigureAfter(DataSourceAutoConfiguration.class) // 在指定配置之后
public class HibernateJpaAutoConfiguration {
// ...
}

条件注解实现原理:SpringBootCondition.matches()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class SpringBootCondition implements Condition {
@Override
public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String classOrMethodName = getClassOrMethodName(metadata);
try {
ConditionOutcome outcome = getMatchOutcome(context, metadata);
logOutcome(classOrMethodName, outcome);
recordEvaluation(context, classOrMethodName, outcome);
return outcome.isMatch();
}
catch (NoClassDefFoundError ex) {
throw new IllegalStateException("Could not evaluate condition...", ex);
}
}

public abstract ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata);
}

总结

核心流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌─────────────────────────────────────────────────────────────┐
│ Spring Boot 启动 │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
@SpringBootApplication
│ ├─ @SpringBootConfiguration@Configuration
│ ├─ @EnableAutoConfiguration → 加载 META-INF/spring.factories │
│ └─ @ComponentScan → 扫描当前包及子包 │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ SpringApplication.run()
│ ├─ 创建 SpringApplication (推断类型、加载初始化器)
│ └─ 运行 run() 方法 │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ AbstractApplicationContext.refresh()
│ ├─ obtainFreshBeanFactory() → 获取 BeanFactory │
│ ├─ invokeBeanFactoryPostProcessors() → 解析配置类 │
│ │ └─ ConfigurationClassPostProcessor │
│ │ ├─ 处理 @ComponentScan
│ │ ├─ 处理 @Import (包括自动配置)
│ │ └─ 处理 @Bean 方法 │
│ ├─ registerBeanPostProcessors() → 注册后置处理器 │
│ ├─ onRefresh() → 启动 WebServer │
│ └─ finishBeanFactoryInitialization() → 实例化所有单例 Bean │
│ └─ DefaultListableBeanFactory.preInstantiateSingletons()
│ └─ AbstractAutowireCapableBeanFactory.doCreateBean()
│ ├─ createBeanInstance() → 实例化 │
│ ├─ populateBean() → 属性赋值 │
│ └─ initializeBean() → 初始化 │
│ └─ BeanPostProcessor (AOP代理在此)
└─────────────────────────────────────────────────────────────┘

关键设计思想

  1. 模板方法模式AbstractApplicationContext 定义骨架,onRefresh() 等由子类实现
  2. 策略模式BeanPostProcessor 允许自定义 Bean 处理逻辑
  3. 观察者模式:事件机制 (ApplicationListener, ApplicationEventMulticaster)
  4. 工厂模式BeanFactory 负责 Bean 的创建和管理
  5. 委托模式ApplicationContext 委托给 BeanFactory 处理 Bean

调试技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 1. 查看自动配置报告
java -jar app.jar --debug
# 或 application.properties: debug=true

# 2. 查看 Bean 定义
@Autowired
private ApplicationContext ctx;

public void printBeans() {
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name + " = " + ctx.getBean(name).getClass());
}
}

# 3. 查看 Bean 生命周期
@Component
public class BeanLifecycleLogger implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before init: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After init: " + beanName);
return bean;
}
}

理解这些原理,才能真正掌握 Spring Boot,而不是停留在 “开箱即用” 的表面。