Java 面试题:Spring Bean 生命周期与三级缓存

一、Bean 生命周期

实例化(构造) → 属性填充 → Aware 回调(BeanName/BeanFactory…) → BeanPostProcessor 前置 → @PostConstruct/init-method → BeanPostProcessor 后置 → 使用中 → @PreDestroy/destroy-method 销毁。

二、三级缓存解决循环依赖

一级 singletonObjects       成品 Bean
二级 earlySingletonObjects    早期暴露(已实例化未填充)
三级 singletonFactories      早期工厂(生成代理)

单例 setter/字段注入场景下,A 创建时把工厂放三级缓存,填充时发现依赖 B,B 又依赖 A,从三级拿到 A 的早期引用,从而闭环。构造器注入无法解决(没机会放缓存),@Lazy 可打破。

三、作用域

singleton(默认,容器一个)/prototype(每次新实例,不缓存、不管理销毁)/request/session(Web)。prototype 的循环依赖不解决。