JavaWeb 从入门到进阶:Spring Boot 原理及 Bean 对象详解
Spring Boot 是目前 JavaWeb 开发的主流框架,它的核心就是 Spring 容器(IoC 容器)对 Bean 的管理。本文从“Spring Boot 为什么这么好用”入手,逐步深入到 Spring 容器如何创建和管理 Bean,再细讲 Bean 的完整生命周期,最后总结 Spring Boot 的“魔法”来源。
一、Spring Boot 核心原理:约定优于配置 + 自动装配
Spring Boot 的核心思想是:“约定优于配置” + “自动配置”。
- 你写很少的配置(甚至零配置),Spring Boot 就能自动帮你把需要的 Bean 创建好、注入好、初始化好。
- 这一切的背后,靠的是 Spring 的 IoC 容器 + 大量内置的自动配置类。
Spring Boot 启动流程简要回顾(重点关注 Bean 相关部分):
SpringApplication.run()- 创建
SpringApplication→ 推断应用类型(Servlet / Reactive) - 创建并刷新容器 →
refreshContext(context) - 在
refresh()中执行一系列关键步骤(下面会详细展开)
最核心的 13 个 refresh() 方法中,与 Bean 直接相关的几个:
prepareRefresh():准备环境obtainFreshBeanFactory():获取或创建 BeanFactoryprepareBeanFactory():给 BeanFactory 设置一些默认的后置处理器和类加载器postProcessBeanFactory():子类扩展点(Spring Boot 在这里做了很多自动配置)invokeBeanFactoryPostProcessors():BeanFactoryPostProcessor 执行阶段(非常关键!)registerBeanPostProcessors():注册 BeanPostProcessorfinishBeanFactoryInitialization():初始化所有剩下的单例 Bean(懒加载除外)
二、BeanFactory 与 ApplicationContext 的关系
- BeanFactory:最基础的 IoC 容器接口,只提供最基本的 Bean 获取、注册功能。
- ApplicationContext:BeanFactory 的子接口,功能更丰富(事件发布、国际化、资源加载、AOP 集成等)。
- Spring Boot 实际使用的是 AnnotationConfigServletWebServerApplicationContext(Web 环境)。
一句话记住:
Spring Boot 启动后,真正管理 Bean 的就是 ApplicationContext 内部持有的 DefaultListableBeanFactory。
三、Bean 的完整生命周期(2025-2026 面试最爱问的版本)
Spring Bean 生命周期大致分为 4 大阶段,实际有 10+ 个细节点(如下图所示)。
文字版流程(从创建到销毁):
- 实例化前
→InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
(可以返回代理对象或直接返回 null 让容器继续实例化) - 实例化(调用构造方法)
→ 通过反射调用构造方法(推断构造方法 → 有参/无参) - 实例化后
→InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
→InstantiationAwareBeanPostProcessor.postProcessProperties()(属性赋值前) - 属性赋值(依赖注入)
→@Autowired、@Value、setter方法注入
→ 解析@Autowired、@Resource等注解 - Aware 接口回调(按顺序)
- BeanNameAware.setBeanName()
- BeanClassLoaderAware.setBeanClassLoader()
- BeanFactoryAware.setBeanFactory()
- ApplicationContextAware.setApplicationContext()(最常用)
- 初始化前
→BeanPostProcessor.postProcessBeforeInitialization()
(最典型实现:CommonAnnotationBeanPostProcessor处理@PostConstruct) - 初始化
@PostConstruct方法InitializingBean.afterPropertiesSet()init-method方法(xml 或 @Bean(initMethod))
- 初始化后
→BeanPostProcessor.postProcessAfterInitialization()
(AOP 代理在这里生成!AnnotationAwareAspectJAutoProxyCreator是关键) - Bean 就绪(放入单例池或原型返回)
- 销毁阶段(容器关闭时)
@PreDestroyDisposableBean.destroy()destroy-method
经典流程图总结(建议背这个顺序):
构造方法 → 实例化后 → 属性赋值 → Aware → @PostConstruct → InitializingBean → init-method
↓
BeanPostProcessor.postProcessBeforeInitialization
↓
BeanPostProcessor.postProcessAfterInitialization(AOP 在这里)
↓
Bean 就绪
↓ (容器关闭)
@PreDestroy → DisposableBean → destroy-method
四、两个最重要的扩展点(面试必问)
| 扩展点 | 执行时机 | 能做什么 | 典型实现类 / 用途 |
|---|---|---|---|
| BeanFactoryPostProcessor | 所有 BeanDefinition 加载完,实例化之前 | 修改 BeanDefinition(元数据) | PropertySourcesPlaceholderConfigurer(@Value 占位符解析)、ConfigurationClassPostProcessor(@Configuration 解析) |
| BeanPostProcessor | 每个 Bean 实例化后、初始化前后 | 修改 Bean 实例、生成代理 | CommonAnnotationBeanPostProcessor(@PostConstruct)、AutowiredAnnotationBeanPostProcessor、AOP 代理生成器 |
一句话区分:
- BeanFactoryPostProcessor → 操作 Bean 的蓝图(定义)
- BeanPostProcessor → 操作 Bean 的实体(对象本身)
五、Spring Boot 中 Bean 的几种常见定义方式
| 方式 | 注解/写法 | Bean 名称默认规则 | 作用域默认 | 说明 |
|---|---|---|---|---|
| @Component 家族 | @Component、@Service、@Repository、@Controller | 类名首字母小写 | singleton | 最常用 |
| @Bean | @Bean(“自定义名称”) | 方法名(可自定义) | singleton | 配置类中定义第三方 Bean |
| @Configuration + @Bean | 标注在类上 | — | — | Spring Boot 自动配置类最常见写法 |
| @Import | 导入配置类、ImportSelector 等 | — | — | 高级导入方式 |
| @Conditional 系列 | @ConditionalOnClass 等 | — | — | 自动配置的条件开关 |
六、面试高频问题速查表
| 问题 | 核心答案关键词 |
|---|---|
| Spring Boot 自动配置原理? | @SpringBootApplication → @EnableAutoConfiguration → AutoConfigurationImportSelector → META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |
| Bean 的作用域有哪些? | singleton(默认)、prototype、request、session、application、websocket |
| @Bean 和 @Component 的区别? | @Bean 是方法级别(可带参数)、@Component 是类级别 |
| Bean 循环依赖怎么解决?(单例 setter 注入) | 三级缓存(singletonObjects、earlySingletonObjects、singletonFactories) |
| @PostConstruct 和 @Bean(initMethod) 区别? | 前者是 JSR-250 标准,后者是 Spring 自己的,执行顺序 @PostConstruct 先执行 |
| BeanPostProcessor 和 BeanFactoryPostProcessor 执行顺序? | FactoryPost 先(全局),Post 后(每个 Bean) |
总结:一句话记住 Spring Boot 的 Bean 魔法
Spring Boot 的“自动”本质就是提前写好了大量 BeanDefinition + BeanPostProcessor + BeanFactoryPostProcessor,然后在启动时通过条件装配把需要的 Bean 创建出来,并完成依赖注入、初始化、AOP 等工作。
你现在最想深入哪一块?
- Bean 生命周期的源码细节(AbstractAutowireCapableBeanFactory.doCreateBean)
- 三级缓存解决循环依赖的详细过程
- Spring Boot 自动配置的条件注解原理
- 自定义一个 BeanPostProcessor 或 BeanFactoryPostProcessor 的实战案例
告诉我,我可以继续展开更细的讲解!