Spring bean的生命周期

时间:2025-04-21 08:08:16

第一幕:精子卵子结合(实例化)

  • 操作:容器掏出反射大法 new Instance() 硬生生造出对象
  • 黑科技:构造函数就像试管婴儿,用@Autowired能指定体位(构造器注入)
// 相当于此处有个隐形的 new YourBean();

第二幕:填鸭式教育(属性注入)

  • 暴力操作:Spring用反射把@Autowired的依赖怼进对象
  • 潜规则:私有字段被扒光(field.setAccessible(true)
public class YourBean {
    @Autowired // Spring:给老子进去吧你!
    private Dependency dependency;
}

第三幕:身份证登记(Aware接口)

  • 觉醒时刻:Bean突然意识到自己的身份
    • BeanNameAware:知道自己叫"userService"
    • BeanFactoryAware:知道自己被哪个厂子(容器)管控
public class YourBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("皇上,臣妾名叫" + name); 
    }
}

第四幕:美颜滤镜(BeanPostProcessor前置处理)

  • 整容手术postProcessBeforeInitialization给Bean微调
  • 经典案例:AOP代理就是这时候给Bean套上替身(动态代理)
public class MyProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name) {
        // 此处可以给Bean打玻尿酸
        return bean; 
    }
}

第五幕:成人礼三连击(初始化)

  1. @PostConstruct:富二代的生日派对
    @PostConstruct
    public void 土豪初始化() { System.out.println("开兰博基尼上学"); }
    
  2. InitializingBean:官二代的入职培训
    @Override
    public void afterPropertiesSet() { System.out.println("爹安排进国企"); }
    
  3. XML配置的init-method:普通人的大学毕业
    <bean init-method="搬砖准备" ... />
    

第六幕:套娃操作(BeanPostProcessor后置处理)

  • 终极改造postProcessAfterInitialization二次加工
  • 杀手锏:这里才是AOP动态代理真正生效的地方!
public Object postProcessAfterInitialization(Object bean, String name) {
    if(bean instanceof Service) {
        return Proxy.newProxyInstance(...); // 套上代理马甲
    }
    return bean;
}

第七幕:社畜打工期(Bean可用)

  • 高光时刻:此时Bean已经进入单例池(SingletonObjects
  • 使用姿势:被各种@Autowired拉去当工具人
@Service
public class YourBean {
    // 此时已经在996写bug了
}

第八幕:临终关怀(销毁)

  1. @PreDestroy:金盆洗手宴
    @PreDestroy
    public void 跑路前夜() { System.out.println("转移资产到海外"); }
    
  2. DisposableBean:*坦白局
    @Override
    public void destroy() { System.out.println("交代贪污赃款"); }
    
  3. XML的destroy-method:普通人的遗嘱
    <bean destroy-method="火化" ... />
    

生命周期流程图(厕所蹲坑记忆版)

new对象 → 填鸭式注入 → 领身份证 → 美颜滤镜 → 
成人礼三连 → 套娃加工 → 打工 → 火葬场

彩蛋:特殊死亡情况

  • 原型Bean(@Scope(“prototype”)):用后即焚,Spring不管销毁
  • 容器关闭:ctx.close() 触发集体火化
  • JVM退房:直接拉闸断电,没机会执行destroy

下次面试被问到,你就翘着二郎腿说:“Spring Bean的一生啊,比杨超越的锦鲤人生还跌宕起伏~”