Spring Bean生命周期简介-笔记

发布于:2025-05-13 ⋅ 阅读:(10) ⋅ 点赞:(0)

1. Spring Bean 生命周期概述

Spring 框架中,Bean 的生命周期是其核心机制之一。了解 Bean 的完整生命周期有助于开发者更好地控制对象的创建、初始化、使用和销毁过程,尤其是在需要扩展、增强或定制 Bean 行为时,如资源加载、AOP 代理、日志记录等。

Spring Bean 的生命周期通常包括以下阶段(以 Singleton 作用域 为例):

阶段 描述 可干预方式 开发中可能的操作
1. 实例化 通过反射创建 Bean 实例 无需干预 通常由 Spring 自动完成
2. 属性注入 注入依赖属性(字段、构造器、setter) 无需干预 通过 @Autowired@Resource 注入依赖
3. 前处理(BeforeInit):

在初始化方法之前执行;

执行方法BeanPostProcessor#postProcessBeforeInitialization

实现BeanPostProcessor 接口 修改 Bean 属性、创建代理、日志记录
4. 初始化方法 执行 @PostConstructInitializingBean#afterPropertiesSet()、或 init-method 使用注解或配置 资源加载(如数据库连接)、校验逻辑、预处理
5. 后处理(AfterInit):

在初始化方法之后执行;

执行方法BeanPostProcessor#postProcessAfterInitialization

实现BeanPostProcessor 接口 AOP 代理创建、权限控制、日志记录
6. 使用阶段 Bean 已准备好,可供应用使用 无需干预 业务调用、依赖注入
7. 销毁方法 容器关闭时执行 @PreDestroyDisposableBean#destroy()、或 destroy-method 使用注解或配置 资源释放(如关闭连接池、停止线程)

2. Spring Bean生命周期的代码演示

2.1 代码示例

step1. 定义一个 Bean

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class MyBean implements InitializingBean, DisposableBean {

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

    public void initMethod() {
        System.out.println("4. init-method: 初始化方法");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("4. @PostConstruct: 初始化方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4. InitializingBean#afterPropertiesSet: 初始化方法");
    }

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

    @Override
    public void destroy() throws Exception {
        System.out.println("7. DisposableBean#destroy: 销毁方法");
    }
}

step2. 定义一个 BeanPostProcessor

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("3. BeanPostProcessor#postProcessBeforeInitialization: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("5. BeanPostProcessor#postProcessAfterInitialization: " + beanName);
        return bean;
    }
}

step3. 配置 Bean 的 init 和 destroy 方法(可选)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean(initMethod = "initMethod", destroyMethod = "destroy")
    public MyBean myBean() {
        return new MyBean();
    }
}

step4. 主启动类(Spring Boot 示例)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        MyBean myBean = context.getBean(MyBean.class);

        System.out.println("6. Bean 已使用");

        // 关闭容器以触发销毁方法
        context.close();
    }
}

启动主类后,控制台输出顺序(部分)示例

1. MyBean 实例化
3. BeanPostProcessor#postProcessBeforeInitialization: myBean
4. @PostConstruct: 初始化方法
4. InitializingBean#afterPropertiesSet: 初始化方法
4. init-method: 初始化方法
5. BeanPostProcessor#postProcessAfterInitialization: myBean
6. Bean 已使用
7. @PreDestroy: 销毁方法
7. DisposableBean#destroy: 销毁方法

2.2 注意事项

  • 多个初始化/销毁方法:Spring 支持多种方式定义初始化和销毁方法,按照以下优先级执行:
    • @PostConstruct > InitializingBean#afterPropertiesSet() > init-method
    • @PreDestroy > DisposableBean#destroy() > destroy-method
  • Bean 作用域影响
    • @Scope("prototype") 的 Bean 不会执行 destroy 方法,除非手动调用 destroy()
  • BeanPostProcessor 顺序:如果有多个 BeanPostProcessor,可通过 @Order 或实现 Ordered 接口控制执行顺序。

3. 总结

Spring Bean 的生命周期是一个清晰且可扩展的过程。通过理解每个阶段的功能和干预方式,开发者可以灵活地控制 Bean 的行为,实现诸如 AOP、日志、资源管理等高级功能。掌握生命周期不仅有助于调试,还能帮助构建更加健壮和可维护的 Spring 应用。相关应用场景举例如下:

场景 使用阶段
日志记录 BeanPostProcessor
资源加载 初始化方法(@PostConstruct
代理对象创建 postProcessAfterInitialization(AOP 实现)
数据库连接关闭 销毁方法(@PreDestroy
权限控制 postProcessBeforeInitialization

4.相关文档

BeanPostProcessor用法-笔记-CSDN博客

InitializingBean接口和@PostConstruct-笔记_postconstruct和initializingbean-CSDN博客

SpringBoot启动后自动执行方法的各种方式-笔记_springboot项目启动自动调用方法-CSDN博客

Spring的xxxAware接口工作原理-笔记-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到