IOC - bean 生命周期

Cyrus Huang / 2024-10-21 / 原文

生命周期

  1. 实例化:通过反射调用构造方法创建 Bean 实例
  2. 属性赋值:把配置文件的值或 IOC 容器中的其他 bean 注入属性中
  3. 初始化:bean 进入初始化阶段,spring 提供了 3 种方式对 bean 加工处理
    • @PostConstruct 注解指定初始化方法
    • 实现 InitializingBean 接口,复写 afterPropertiesSet 方法
    • @Bean 注册 bean 可以通过 initMethod 属性指定初始化方法
  4. 使用:到此 bean 完整了,程序可使用
  5. 销毁:程序关闭,释放资源,销毁 bean
    • @PreDestroy 注解指定销毁方法
    • 实现 DisposableBean 接口,复写 destroy 方法
    • @Bean 注册 bean 可以通过 destroyMethod 属性指定销毁方法

完整流程

  • BeanPostProcessor 不能感知当前类
  • BeanPostProcessor 会拦截所有 bean
  • @Autowired 就是 BeanPostProcessor 实现的
@Component
public class User implements BeanPostProcessor {

    // 其他 bean 会进这个方法,User 的 bean 不会走!!!
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Processing bean: " + beanName + " of type: " + bean.getClass().getName());
        if (bean instanceof Dog) {
            System.out.println("************************");
        }
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }
}
graph TD; st(start) --> io1[反射创建对象] io1 --> io2[属性赋值] io2 --> op1[Aware 感知接口回调] op1 --> op2[BeanPostProcessor 接口 postProcessBeforeInitialization 方法] op2 --> op3[@PostConstruct 标注的方法] op3 --> op4[InitializingBean 接口 afterPropertiesSet 方法] op4 --> op5[@Bean initMethod 指定的方法] op5 --> op6[BeanPostProcessor 接口 postProcessAfterInitialization 方法] op6 --> sub1[使用阶段] sub1 --> op7[@PreDestroy 标注的方法] op7 --> op8[DisposableBean 接口 destroy方法] op8 --> op9[@Bean destroyMethod 指定的方法] op9 --> e(end)