spring ioc容器统一管理bean生命周期,包含实例化、属性赋值、初始化、使用、销毁五阶段;singleton bean全程托管,prototype仅创建注入,web作用域绑定http生命周期。

Spring 通过 IoC 容器统一管理 Bean 的生命周期,核心是控制“创建→装配→初始化→使用→销毁”全过程。关键不在于手动 new 对象,而是在容器启动和关闭时,按约定阶段自动触发回调逻辑。
Bean 生命周期的五个核心阶段
Spring 容器(如 AnnotationConfigApplicationContext 或 ClassPathXmlApplicationContext)对每个 singleton Bean 会严格走完以下流程:
- 实例化(Instantiation):根据 BeanDefinition,用反射创建对象(调用构造方法),此时属性还是 null
- 属性赋值(Populate Properties):完成依赖注入(@Autowired、@Value、setter/constructor 注入等)
- 初始化(Initialization):依次执行 Aware 接口(如 ApplicationContextAware)、BeanPostProcessor#postProcessBeforeInitialization、@PostConstruct、InitializingBean#afterPropertiesSet、自定义 init-method
- 就绪使用(In Use):Bean 放入单例池(singletonObjects),可被其他 Bean 引用或通过 getBean() 获取
- 销毁(Destruction):容器关闭时,依次执行 @PreDestroy、DisposableBean#destroy、自定义 destroy-method(仅 singleton 有效)
四种常用初始化与销毁方式(按推荐顺序)
开发者可在不同阶段插入自定义逻辑,优先级从高到低如下:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- @PostConstruct / @PreDestroy:JSR-250 标准注解,写在方法上,无需实现接口,语义清晰,推荐首选
- InitializingBean / DisposableBean 接口:需实现对应方法,侵入性强,不推荐新项目使用
- @Bean(initMethod = "xxx", destroyMethod = "yyy"):适用于配置类中声明的 Bean,方法名任意,但必须无参
- XML 配置中的 init-method / destroy-method:老项目遗留方式,已基本被注解替代
作用域对生命周期的影响
不是所有 Bean 都能走完完整生命周期——这取决于 scope 设置:
- singleton(默认):容器启动时创建,关闭时销毁;IoC 全程托管,支持全部生命周期回调
- prototype:每次 getBean() 都新建实例;容器只负责创建和依赖注入,不调用初始化后回调,也不管理销毁;销毁需由使用者自行处理(如手动 close)
- request/session 等 Web 作用域:绑定 HTTP 生命周期,由 Spring Web 容器(如 XmlWebApplicationContext)扩展支持
关键扩展点:BeanPostProcessor
若需在初始化前后做通用增强(如日志、代理、校验),应实现 BeanPostProcessor 接口:
- postProcessBeforeInitialization():在 @PostConstruct 和 afterPropertiesSet() 之前执行,适合包装原始对象或修改属性
- postProcessAfterInitialization():在所有初始化完成后执行,AOP 代理(如 @Service 加了 @Transactional)就是在此阶段生成的
注意:它对所有 singleton Bean 生效,且可注册多个,执行顺序由 Ordered 接口或 @Order 注解决定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










