Spring Bean生命周期简介-笔记
1. Spring Bean 生命周期概述
Spring 框架中,Bean 的生命周期是其核心机制之一。了解 Bean 的完整生命周期有助于开发者更好地控制对象的创建、初始化、使用和销毁过程,尤其是在需要扩展、增强或定制 Bean 行为时,如资源加载、AOP 代理、日志记录等。
Spring Bean 的生命周期通常包括以下阶段(以 Singleton 作用域 为例):
阶段 | 描述 | 可干预方式 | 开发中可能的操作 |
---|---|---|---|
1. 实例化 | 通过反射创建 Bean 实例 | 无需干预 | 通常由 Spring 自动完成 |
2. 属性注入 | 注入依赖属性(字段、构造器、setter) | 无需干预 | 通过 @Autowired 、@Resource 注入依赖 |
3. 前处理(BeforeInit): | 在初始化方法之前执行; 执行方法 | 实现BeanPostProcessor 接口 | 修改 Bean 属性、创建代理、日志记录 |
4. 初始化方法 | 执行 @PostConstruct 、InitializingBean#afterPropertiesSet() 、或 init-method | 使用注解或配置 | 资源加载(如数据库连接)、校验逻辑、预处理 |
5. 后处理(AfterInit): | 在初始化方法之后执行; 执行方法 | 实现BeanPostProcessor 接口 | AOP 代理创建、权限控制、日志记录 |
6. 使用阶段 | Bean 已准备好,可供应用使用 | 无需干预 | 业务调用、依赖注入 |
7. 销毁方法 | 容器关闭时执行 @PreDestroy 、DisposableBean#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: 初始化方法");}@PostConstructpublic void postConstruct() {System.out.println("4. @PostConstruct: 初始化方法");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("4. InitializingBean#afterPropertiesSet: 初始化方法");}@PreDestroypublic void preDestroy() {System.out.println("7. @PreDestroy: 销毁方法");}@Overridepublic 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 {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("3. BeanPostProcessor#postProcessBeforeInitialization: " + beanName);return bean;}@Overridepublic 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博客