javaWeb从入门到进阶(SpringBoot原理及bean对象)

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 相关部分):

  1. SpringApplication.run()
  2. 创建 SpringApplication → 推断应用类型(Servlet / Reactive)
  3. 创建并刷新容器 → refreshContext(context)
  4. refresh() 中执行一系列关键步骤(下面会详细展开)

最核心的 13 个 refresh() 方法中,与 Bean 直接相关的几个

  • prepareRefresh():准备环境
  • obtainFreshBeanFactory():获取或创建 BeanFactory
  • prepareBeanFactory():给 BeanFactory 设置一些默认的后置处理器和类加载器
  • postProcessBeanFactory():子类扩展点(Spring Boot 在这里做了很多自动配置)
  • invokeBeanFactoryPostProcessors()BeanFactoryPostProcessor 执行阶段(非常关键!)
  • registerBeanPostProcessors():注册 BeanPostProcessor
  • finishBeanFactoryInitialization()初始化所有剩下的单例 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+ 个细节点(如下图所示)。

文字版流程(从创建到销毁):

  1. 实例化前
    InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
    (可以返回代理对象或直接返回 null 让容器继续实例化)
  2. 实例化(调用构造方法)
    → 通过反射调用构造方法(推断构造方法 → 有参/无参)
  3. 实例化后
    InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
    InstantiationAwareBeanPostProcessor.postProcessProperties()(属性赋值前)
  4. 属性赋值(依赖注入)
    @Autowired@Valuesetter 方法注入
    → 解析 @Autowired@Resource 等注解
  5. Aware 接口回调(按顺序)
  • BeanNameAware.setBeanName()
  • BeanClassLoaderAware.setBeanClassLoader()
  • BeanFactoryAware.setBeanFactory()
  • ApplicationContextAware.setApplicationContext()(最常用)
  1. 初始化前
    BeanPostProcessor.postProcessBeforeInitialization()
    (最典型实现:CommonAnnotationBeanPostProcessor 处理 @PostConstruct
  2. 初始化
  • @PostConstruct 方法
  • InitializingBean.afterPropertiesSet()
  • init-method 方法(xml 或 @Bean(initMethod))
  1. 初始化后
    BeanPostProcessor.postProcessAfterInitialization()
    (AOP 代理在这里生成!AnnotationAwareAspectJAutoProxyCreator 是关键)
  2. Bean 就绪(放入单例池或原型返回)
  3. 销毁阶段(容器关闭时)
    • @PreDestroy
    • DisposableBean.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 的实战案例

告诉我,我可以继续展开更细的讲解!

文章已创建 4391

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部