Spring Bean 完整生命周期

发布时间:2026/7/27 19:20:28
Spring Bean 完整生命周期 Spring Bean 完整生命周期Bean 生命周期分四大阶段实例化 → 填充属性依赖注入 → 初始化 → 销毁配合扩展接口、注解、后置处理器完整流程同时区分单例 Bean与多例 Bean差异。前置说明执行入口refresh()→finishBeanFactoryInitialization()实例化所有非懒加载单例核心扩展点BeanPostProcessor贯穿初始化前后最重要后置处理器多例 Bean容器不管理销毁仅执行到初始化阶段容器关闭不会执行销毁方法一、完整生命周期分步流程单例 Bean阶段 1Bean 实例化 InstantiateSpring 根据 BeanDefinition 信息创建对象两种方式无参构造反射newInstance()工厂方法factory-method此时对象仅仅 new 出来所有属性都是默认 null依赖还未注入。阶段 2提前暴露工厂解决循环依赖关键实例化完成后立即将当前 Bean 的ObjectFactory存入三级缓存 singletonFactories。 作用如果产生循环依赖其他 Bean 可以提前拿到半成品对象支持 AOP 代理。阶段 3属性填充 PopulateBean依赖注入给实例化后的对象填充属性、完成依赖注入三种注入方式Autowired/Resource字段注入set 方法注入构造器注入实例化阶段就完成不走这里流程细节解析所有需要注入的依赖递归获取依赖 Bean触发依赖 Bean 完整生命周期通过反射给当前 Bean 赋值循环依赖就是在这一步触发依靠三级缓存拿到半成品完成注入。阶段 4执行 BeanPostProcessor 前置处理 postProcessBeforeInitializationBeanPostProcessor 是全局后置处理器对所有 Bean 生效java运行Object postProcessBeforeInitialization(Object bean, String beanName)执行时机属性填充完成初始化方法执行之前典型场景Value注解属性解析赋值AOP 代理创建大部分代理在这里生成循环依赖才会提前在三级缓存创建阶段 5执行自定义初始化方法 Initialization三层初始化逻辑顺序固定1. 执行Aware系列接口按固定顺序Aware 作用让 Bean 获取 Spring 容器底层资源 执行顺序BeanNameAwaresetBeanName (String name)获取当前 beanNameBeanFactoryAwaresetBeanFactory (BeanFactory factory)获取 Bean 工厂ApplicationContextAwaresetApplicationContext (ApplicationContext ctx)获取上下文2. 执行PostConstruct注解方法JSR-250 标准Java 官方注解写在自定义初始化方法上优先级高于 xml 的 init-method。java运行PostConstruct public void init(){}3. 执行 InitializingBean 接口 afterPropertiesSet ()Spring 内置接口重写方法做初始化逻辑java运行public void afterPropertiesSet() throws Exception;4. 执行 xml / 注解指定的自定义 init-methodxml 配置bean init-methodinit/注解Bean(initMethod init)阶段 6执行 BeanPostProcessor 后置处理 postProcessAfterInitializationjava运行Object postProcessAfterInitialization(Object bean, String beanName)执行时机所有初始化逻辑全部执行完毕后核心用途AOP 正常 Bean 的动态代理生成无循环依赖时在这里创建代理对象对 Bean 做包装、替换、自定义增强走完这一步Bean 完全创建完成存入一级缓存 singletonObjects业务代码可以直接使用。阶段 7Bean 就绪容器使用阶段单例 Bean 常驻容器每次获取直接从一级缓存返回 多例 Bean 每次 getBean 都会完整走一遍实例化、属性填充、初始化流程。阶段 8容器关闭销毁 Bean Destruction仅单例 Bean 执行调用ctx.close()/registerShutdownHook()触发销毁流程三层销毁逻辑顺序固定1.PreDestroy注解方法JSR 标准优先级最高java运行PreDestroy public void destroy(){}2. DisposableBean 接口 destroy () 方法Spring 内置销毁接口java运行public void destroy() throws Exception;3. xml/Bean 指定的 destroy-methodxmlbean destroy-methodclose/注解Bean(destroyMethod close)多例 BeanSpring 容器不缓存、不管理销毁关闭容器不会执行任何销毁方法。二、生命周期执行顺序极简总结背诵版实例化对象new存入三级缓存解决循环依赖填充属性、依赖注入BeanPostProcessor before 初始化Aware 接口回调 → PostConstruct → InitializingBean → init-methodBeanPostProcessor after 初始化AOP 代理生成Bean 放入一级缓存业务使用容器关闭PreDestroy → DisposableBean → destroy-method三、高频面试延伸问题1. BeanPostProcessor 和 InitializingBean 的区别BeanPostProcessor全局处理器所有 Bean 都会经过分前后两个方法AOP 核心依赖它InitializingBean单个 Bean 自身初始化接口仅当前 Bean 执行只有 afterPropertiesSet 一个方法。2. PostConstruct 和 InitializingBean、init-method 优先级优先级从高到低PostConstructInitializingBean#afterPropertiesSet() xml/Bean init-method3. 为什么多例 Bean 不会执行销毁方法多例 Bean 不会存入一级缓存容器不持有多例 Bean 的引用无法追踪对象GC 由 JVM 管理容器关闭无法主动调用销毁逻辑。4. AOP 代理对象在生命周期哪个阶段创建两种情况无循环依赖在postProcessAfterInitialization初始化之后创建代理存在循环依赖提前从三级缓存 ObjectFactory 生成代理存入二级缓存。四、完整流程图文字版plaintext加载BeanDefinition ↓ 实例化Bean反射new对象 ↓ 存入三级缓存 singletonFactories ↓ populateBean 属性填充、依赖注入 ↓ BeanPostProcessor.postProcessBeforeInitialization ↓ 执行Aware接口BeanName→BeanFactory→ApplicationContext ↓ 执行PostConstruct方法 ↓ 执行InitializingBean.afterPropertiesSet() ↓ 执行自定义init-method ↓ BeanPostProcessor.postProcessAfterInitialization创建AOP代理 ↓ 存入一级缓存 singletonObjects 应用使用Bean ↓ 容器关闭 ↓ 执行PreDestroy ↓ 执行DisposableBean.destroy() ↓ 执行自定义destroy-method