一、Bean 生命周期概览1.1 什么是 Bean 生命周期Bean 生命周期是指 Spring 容器中 Bean 从创建到销毁的完整过程包括实例化、属性赋值、初始化、使用、销毁五个阶段。1.2 生命周期五个阶段实例化创建对象属性赋值依赖注入初始化执行初始化逻辑使用提供服务销毁释放资源阶段说明关键操作实例化创建 Bean 对象调用构造器属性赋值注入依赖setter 注入、Autowired 注入初始化执行初始化逻辑PostConstruct、InitializingBean、init-method使用提供服务业务方法调用销毁释放资源PreDestroy、DisposableBean、destroy-method1.3 完整生命周期第四阶段销毁过程13. PreDestroy12. 容器关闭14. DisposableBean.destroy15. destroy-method第三阶段初始化处理7. PostConstruct6. BeanPostProcessor-Before8. InitializingBean.afterPropertiesSet9. init-method10. BeanPostProcessor-After第二阶段Aware 接口回调4. BeanFactoryAware3. BeanNameAware5. ApplicationContextAware第一阶段基础构建2. 设置属性1. 实例化 BeanBean 生命周期开始11. Bean 就绪二、Bean 创建完整流程2.1 核心源码路径// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) { // 1. 实例化 Bean Object bean doCreateBean(beanName, mbd, args); return bean; } protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) { // 1. 实例化 Bean创建对象 Object bean instanceWrapper.getWrappedInstance(); // 2. 属性赋值依赖注入 populateBean(beanName, mbd, instanceWrapper); // 3. 初始化 Bean Object exposedObject initializeBean(beanName, bean, mbd); return exposedObject; }2.2 详细步骤分解步骤 1实例化 BeancreateBeanInstanceprotected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { // 1.1 获取构造器 Constructor? ctorToUse mbd.getResolvedConstructorFactoryMethod(); // 1.2 使用反射创建对象 return bwCreator.newInstance(ctorToUse, args); }关键点使用反射机制调用构造器支持构造器注入处理循环依赖提前暴露引用步骤 2属性赋值populateBeanprotected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { // 2.1 执行 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { return; // 返回 false 则跳过属性赋值 } // 2.2 执行 InstantiationAwareBeanPostProcessor#postProcessProperties PropertyValues pvs ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName); // 2.3 应用属性值 applyPropertyValues(beanName, mbd, bw, pvs); }关键点Autowired 注入AutowiredAnnotationBeanPostProcessor#postProcessPropertiesResource 注入CommonAnnotationBeanPostProcessor#postProcessPropertiesXML 配置注入applyPropertyValues步骤 3初始化 BeaninitializeBeanprotected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) { // 3.1 执行 Aware 接口 invokeAwareMethods(beanName, bean); // 3.2 执行 BeanPostProcessor#postProcessBeforeInitialization Object wrappedBean applyBeanPostProcessorsBeforeInitialization(bean, beanName); // 3.3 执行初始化回调 invokeInitMethods(beanName, wrappedBean, mbd); // 3.4 执行 BeanPostProcessor#postProcessAfterInitialization wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); return wrappedBean; }2.3 完整时序图ClientSpring 容器BeanPostProcessorBean 对象getBean(userService)1. 实例化new UserService2. 属性赋值setUserRepository3. BeanNameAware.setBeanName4. BeanFactoryAware.setBeanFactory5. ApplicationContextAware.setApplicationContext6. postProcessBeforeInitialization返回 Bean 或 Proxy7. PostConstruct8. InitializingBean.afterPropertiesSet9. init-method10. postProcessAfterInitialization返回 Bean 或 ProxyAOP返回 BeanClientSpring 容器BeanPostProcessorBean 对象三、BeanPostProcessor 详解3.1 BeanPostProcessor 接口定义public interface BeanPostProcessor { /** * 初始化前回调 * 在 PostConstruct、InitializingBean、init-method 之前执行 */ Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; // 返回原 Bean 或代理对象 } /** * 初始化后回调 * 在 PostConstruct、InitializingBean、init-method 之后执行 * AOP 代理在此创建 */ Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; // 返回原 Bean 或代理对象AOP } }3.2 执行时机属性赋值完成Aware 接口回调BeanPostProcessorpostProcessBeforeInitializationPostConstructInitializingBeanafterPropertiesSetinit-methodBeanPostProcessorpostProcessAfterInitializationAOP 代理创建3.3 典型应用场景BeanPostProcessor应用场景执行时机AutowiredAnnotationBeanPostProcessorAutowired 注入postProcessPropertiesCommonAnnotationBeanPostProcessorResource、PostConstruct、PreDestroypostProcessProperties、postProcessBeforeInitializationApplicationContextAwareProcessorAware 接口回调postProcessBeforeInitializationAbstractAutoProxyCreatorAOP 代理创建postProcessAfterInitialization3.4 自定义 BeanPostProcessorComponent public class CustomBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) { if (userService.equals(beanName)) { System.out.println(初始化前回调 beanName); } return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) { if (userService.equals(beanName)) { System.out.println(初始化后回调 beanName); } return bean; } }执行顺序容器启动时注册所有BeanPostProcessor创建每个 Bean 时按顺序执行所有BeanPostProcessor执行顺序Ordered接口 →Order注解 → 注册顺序四、InstantiationAwareBeanPostProcessor 详解4.1 接口定义public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { /** * 实例化前回调 * 可以返回代理对象跳过默认实例化逻辑 */ Nullable default Object postProcessBeforeInstantiation(Class? beanClass, String beanName) { return null; // 返回 null 则继续默认实例化 } /** * 实例化后回调 * 可以在属性赋值前修改 Bean 状态 */ default boolean postProcessAfterInstantiation(Object bean, String beanName) { return true; // 返回 false 则跳过属性赋值 } /** * 属性赋值回调 * 可以修改属性值 */ Nullable default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { return pvs; // 返回修改后的属性值 } }4.2 执行时机是否否是1. postProcessBeforeInstantiation返回代理?跳过实例化2. 实例化 Bean3. postProcessAfterInstantiation返回 true?跳过属性赋值4. postProcessProperties5. 应用属性值6. Aware 回调4.3 典型应用场景InstantiationAwareBeanPostProcessor应用场景AutowiredAnnotationBeanPostProcessorAutowired 注入CommonAnnotationBeanPostProcessorResource 注入RequiredAnnotationBeanPostProcessorRequired 检查五、初始化回调顺序5.1 三种初始化回调方式Component public class UserService { // 方式1PostConstruct 注解 PostConstruct public void init1() { System.out.println(方式1PostConstruct); } } // 方式2InitializingBean 接口 Component public class UserService implements InitializingBean { Override public void afterPropertiesSet() throws Exception { System.out.println(方式2InitializingBean); } } // 方式3init-method Configuration public class AppConfig { Bean(initMethod init3) public UserService userService() { return new UserService(); } } public class UserService { public void init3() { System.out.println(方式3init-method); } }5.2 执行顺序PostConstructInitializingBeanafterPropertiesSetinit-method执行顺序PostConstructJSR-250 规范InitializingBean#afterPropertiesSetSpring 接口init-methodXML/注解配置推荐使用PostConstruct标准化、不耦合 Spring六、销毁流程6.1 三种销毁回调方式// 方式1PreDestroy 注解 Component public class UserService { PreDestroy public void destroy1() { System.out.println(方式1PreDestroy); } } // 方式2DisposableBean 接口 Component public class UserService implements DisposableBean { Override public void destroy() throws Exception { System.out.println(方式2DisposableBean); } } // 方式3destroy-method Configuration public class AppConfig { Bean(destroyMethod destroy3) public UserService userService() { return new UserService(); } } public class UserService { public void destroy3() { System.out.println(方式3destroy-method); } }6.2 执行顺序PreDestroyDisposableBeandestroydestroy-method执行顺序PreDestroyJSR-250 规范DisposableBean#destroySpring 接口destroy-methodXML/注解配置6.3 触发销毁的时机// 方式1关闭容器 ConfigurableApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class); context.close(); // 触发销毁 // 方式2注册关闭钩子 ConfigurableApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class); context.registerShutdownHook(); // JVM 关闭时触发销毁 // 方式3使用 try-with-resourcesSpring 5 try (ConfigurableApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class)) { // 使用容器 } // 自动关闭触发销毁七、自检Q1: Bean 的生命周期是什么⭐⭐⭐⭐⭐答 Bean 生命周期分为 5 个阶段实例化创建对象调用构造器属性赋值依赖注入Autowired、setter初始化执行初始化逻辑PostConstruct、InitializingBean、init-method使用提供服务业务方法调用销毁释放资源PreDestroy、DisposableBean、destroy-methodQ2: BeanPostProcessor 的执行时机⭐⭐⭐⭐⭐答BeanPostProcessor有两个回调方法postProcessBeforeInitialization在 PostConstruct、InitializingBean、init-method之前执行postProcessAfterInitialization在 PostConstruct、InitializingBean、init-method之后执行关键应用AOP 代理在postProcessAfterInitialization中创建。Q3: PostConstruct、InitializingBean、init-method 的执行顺序⭐⭐⭐⭐⭐答 执行顺序PostConstructJSR-250 规范InitializingBean#afterPropertiesSetSpring 接口init-methodXML/注解配置推荐使用PostConstruct标准化、不耦合 SpringQ4: AOP 代理在 Bean 生命周期的哪个阶段创建⭐⭐⭐⭐⭐答 AOP 代理在BeanPostProcessor#postProcessAfterInitialization阶段创建。执行流程容器启动时扫描 Aspect 注解创建 Advisor创建 Bean 对象执行postProcessAfterInitialization时AbstractAutoProxyCreator判断是否需要代理如果需要创建代理对象JDK 或 CGLIB返回代理对象注册到容器Q5: BeanFactory 和 ApplicationContext 在 Bean 生命周期上的区别⭐⭐⭐⭐答特性BeanFactoryApplicationContextAware 回调部分支持全部支持BeanPostProcessor手动注册自动注册事件发布不支持支持国际化不支持支持资源加载不支持支持核心区别ApplicationContext在容器启动时自动注册所有BeanPostProcessor而BeanFactory需要手动添加。Q6: 如何在 Bean 创建过程中插入自定义逻辑⭐⭐⭐⭐答方式1实现 BeanPostProcessorComponent public class CustomBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) { // 初始化前逻辑 return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) { // 初始化后逻辑可以创建代理 return bean; } }方式2实现 InstantiationAwareBeanPostProcessorComponent public class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { Override public Object postProcessBeforeInstantiation(Class? beanClass, String beanName) { // 实例化前逻辑可以返回代理对象 return null; } Override public boolean postProcessAfterInstantiation(Object bean, String beanName) { // 实例化后逻辑返回 false 则跳过属性赋值 return true; } Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { // 属性赋值逻辑可以修改属性值 return pvs; } }Q7: 循环依赖在 Bean 生命周期中如何解决⭐⭐⭐⭐⭐答 Spring 通过三级缓存解决 Setter 注入的循环依赖singletonObjects一级缓存存放完全初始化的 BeanearlySingletonObjects二级缓存存放提前暴露的 Bean未完全初始化singletonFactories三级缓存存放 Bean 工厂可能创建代理对象解决流程创建 A 对象实例化后放入三级缓存A 注入 B开始创建 BB 注入 A从三级缓存获取 A移入二级缓存B 初始化完成放入一级缓存A 继续初始化从二级缓存获取 B完成初始化A 放入一级缓存清理二级缓存构造器注入无法解决因为实例化时就需要依赖对象无法提前暴露。 核心源码路径// Bean 创建核心类 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory - #createBean() // 创建 Bean - #doCreateBean() // 执行创建 - #createBeanInstance() // 实例化 - #populateBean() // 属性赋值 - #initializeBean() // 初始化 // BeanPostProcessor 接口 org.springframework.beans.factory.config.BeanPostProcessor org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor // 典型实现 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor org.springframework.context.annotation.CommonAnnotationBeanPostProcessor org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator // Aware 回调接口 org.springframework.beans.factory.BeanNameAware org.springframework.beans.factory.BeanFactoryAware org.springframework.context.ApplicationContextAware // 初始化回调接口 javax.annotation.PostConstruct // PostConstruct org.springframework.beans.factory.InitializingBean // InitializingBean org.springframework.beans.factory.DisposableBean // DisposableBean javax.annotation.PreDestroy // PreDestroy