Skip to content

Spring Bean 生命周期

TIP

了解 Bean 的生命周期有助于在合适的时机做合适的初始化或销毁工作。

生命周期流程

实例化 → 属性赋值 → 初始化前置 → 初始化 → 初始化后置 → 就绪 → 销毁

完整生命周期

java
@Component
public class MyBean implements InitializingBean, DisposableBean {

    public MyBean() {
        System.out.println("1. 实例化");
    }

    @Autowired
    public void setDependency(Dependency dep) {
        System.out.println("2. 属性赋值");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("3. @PostConstruct 初始化");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4. InitializingBean.afterPropertiesSet()");
    }

    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public void customInit() {
        System.out.println("5. @Bean initMethod 初始化");
    }

    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public void customDestroy() {
        System.out.println("6. @Bean destroyMethod 销毁");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("7. @PreDestroy 销毁前");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("8. DisposableBean.destroy()");
    }
}

BeanPostProcessor

可以在 Bean 初始化前后统一处理:

java
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof MyBean) {
            System.out.println("初始化前置处理: " + beanName);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof MyBean) {
            System.out.println("初始化后置处理: " + beanName);
        }
        return bean;
    }
}

TIP

实际开发中常用 @PostConstruct 做初始化,@PreDestroy 做资源释放,避免实现 InitializingBean 等 Spring 接口以保持代码低耦合。