跳转到内容

Bean生命周期(Spring框架)

来自代码酷
Admin留言 | 贡献2025年5月12日 (一) 00:27的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)


概述[编辑 | 编辑源代码]

Bean生命周期是Spring框架中描述一个Bean从创建到销毁的完整过程的核心概念。理解Bean生命周期对于掌握Spring的依赖注入(DI)、AOP以及容器管理机制至关重要。Spring通过回调接口和注解提供了多个扩展点,允许开发者在Bean生命周期的不同阶段插入自定义逻辑。

生命周期阶段[编辑 | 编辑源代码]

Spring Bean的生命周期可分为以下主要阶段(以基于XML的配置为例):

graph TD A[实例化] --> B[属性赋值] B --> C[BeanNameAware.setBeanName] C --> D[BeanFactoryAware.setBeanFactory] D --> E[ApplicationContextAware.setApplicationContext] E --> F[BeanPostProcessor.postProcessBeforeInitialization] F --> G[@PostConstruct] G --> H[InitializingBean.afterPropertiesSet] H --> I[init-method] I --> J[BeanPostProcessor.postProcessAfterInitialization] J --> K[使用阶段] K --> L[@PreDestroy] L --> M[DisposableBean.destroy] M --> N[destroy-method]

详细阶段说明[编辑 | 编辑源代码]

1. 实例化[编辑 | 编辑源代码]

通过构造器或工厂方法创建Bean实例:

// 等价于 <bean class="com.example.MyBean"/>
public class MyBean {
    public MyBean() {
        System.out.println("1. 实例化");
    }
}

2. 属性赋值[编辑 | 编辑源代码]

Spring通过依赖注入设置属性值:

<bean class="com.example.MyBean">
    <property name="message" value="Hello"/>
</bean>

3. Aware接口回调[编辑 | 编辑源代码]

若Bean实现了Aware接口,会依次触发:

public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("3. BeanNameAware: " + name);
    }
}

4. 初始化前处理[编辑 | 编辑源代码]

模板:注意

public class MyPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String name) {
        System.out.println("4. BeforeInit: " + name);
        return bean;
    }
}

5. 初始化阶段[编辑 | 编辑源代码]

按顺序执行三种初始化方式:

  • @PostConstruct注解方法
  • InitializingBean接口的afterPropertiesSet()
  • XML中定义的init-method
public class MyBean {
    @PostConstruct
    public void postConstruct() {
        System.out.println("5.1 @PostConstruct");
    }

    public void customInit() {
        System.out.println("5.3 init-method");
    }
}

6. 初始化后处理[编辑 | 编辑源代码]

public class MyPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String name) {
        System.out.println("6. AfterInit: " + name);
        return bean;
    }
}

7. 销毁阶段[编辑 | 编辑源代码]

容器关闭时执行销毁操作,顺序与初始化相反:

  • @PreDestroy注解方法
  • DisposableBean接口的destroy()
  • XML中定义的destroy-method

完整示例[编辑 | 编辑源代码]

配置类[编辑 | 编辑源代码]

@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public LifecycleBean lifecycleBean() {
        return new LifecycleBean();
    }

    @Bean
    public static MyPostProcessor postProcessor() {
        return new MyPostProcessor();
    }
}

执行结果[编辑 | 编辑源代码]

1. 实例化
2. 属性赋值
3. BeanNameAware: lifecycleBean
4. BeforeInit: lifecycleBean
5.1 @PostConstruct
5.2 afterPropertiesSet
5.3 init-method
6. AfterInit: lifecycleBean
... [使用阶段] ...
@PreDestroy
DisposableBean.destroy
customDestroy

生命周期扩展机制[编辑 | 编辑源代码]

通过接口[编辑 | 编辑源代码]

接口 方法 说明
BeanPostProcessor postProcessBefore/AfterInitialization 全局处理器
InstantiationAwareBeanPostProcessor postProcessBeforeInstantiation 实例化前干预

通过注解[编辑 | 编辑源代码]

  • @PostConstruct / @PreDestroy (JSR-250)
  • @Bean(initMethod/destroyMethod)

实际应用场景[编辑 | 编辑源代码]

案例:数据库连接池初始化 1. @PostConstruct中建立初始连接 2. @PreDestroy中关闭所有连接

public class ConnectionPool {
    @PostConstruct
    public void init() {
        // 创建10个初始连接
    }

    @PreDestroy
    public void cleanup() {
        // 关闭所有连接
    }
}

常见问题[编辑 | 编辑源代码]

模板:问答

模板:问答

数学表示[编辑 | 编辑源代码]

生命周期阶段可形式化为有序集合: 解析失败 (语法错误): {\displaystyle L = \\{Instantiation, Population, AwareCallbacks, PreInit, Init, PostInit, Usage, PreDestroy, Destruction\\} }