Loading

Bean的生命周期

Spring Boot 中的 Bean 生命周期与 Spring 框架一致,由 IoC 容器管理,涵盖从实例化到销毁的完整流程。以下是详细解析:


一、Bean 生命周期的核心阶段

Spring Boot 中 Bean 的生命周期主要分为 4 个阶段,每个阶段包含扩展点和关键逻辑:

1. 实例化(Instantiation)

  • 作用:通过反射创建 Bean 的实例,分配内存空间。
  • 扩展点
    • InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation:在实例化前执行,可返回代理对象替代原 Bean)。
    • InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation:实例化后调用,可跳过属性赋值阶段。
  • 示例
    public class UserService {
        public UserService() {
            System.out.println("Bean 实例化完成");
        }
    }
    

2. 属性赋值(Populate)

  • 作用:注入依赖、设置属性值(如 @Autowired@Value)。
  • 扩展点
    • InstantiationAwareBeanPostProcessor#postProcessProperties:自定义属性值修改。
  • 代码逻辑
    @Service
    public class OrderService {
        @Autowired
        private UserService userService; // 依赖注入
    }
    

3. 初始化(Initialization)

  • 步骤
    1. Aware 接口回调:执行 BeanNameAwareBeanFactoryAware 等接口,注入容器相关信息。
    2. 初始化前置处理:通过 BeanPostProcessor#postProcessBeforeInitialization 执行自定义逻辑(如日志、校验)。
    3. 初始化方法
      • InitializingBean#afterPropertiesSet:实现接口定义初始化逻辑。
      • @PostConstruct:注解标注的初始化方法。
      • XML 或 @Bean(initMethod = "xxx"):自定义初始化方法。
    4. 初始化后置处理:通过 BeanPostProcessor#postProcessAfterInitialization 执行(如代理增强)。
  • 示例
    @Service
    public class PaymentService implements InitializingBean {
        @PostConstruct
        public void init() {
            System.out.println("@PostConstruct 初始化");
        }
        @Override
        public void afterPropertiesSet() {
            System.out.println("InitializingBean 初始化");
        }
    }
    

4. 销毁(Destruction)

  • 触发条件:容器关闭时(如调用 context.close())。
  • 销毁逻辑
    • DisposableBean#destroy:实现接口定义销毁逻辑。
    • @PreDestroy:注解标注的销毁方法。
    • XML 或 @Bean(destroyMethod = "xxx"):自定义销毁方法。
  • 示例
    @Service
    public class CacheService implements DisposableBean {
        @PreDestroy
        public void cleanUp() {
            System.out.println("清理资源");
        }
        @Override
        public void destroy() {
            System.out.println("销毁 Bean");
        }
    }
    

二、扩展机制与最佳实践

1. 生命周期扩展接口

  • BeanPostProcessor:在初始化前后插入自定义逻辑(适用于所有 Bean)。
    @Component
    public class LoggingBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) {
            System.out.println("初始化前处理:" + beanName);
            return bean;
        }
    }
    
  • SmartInitializingSingleton:所有单例 Bean 初始化完成后触发。

2. 最佳实践

  • 资源管理
    • @PostConstruct 中初始化数据库连接、线程池。
    • @PreDestroy 中释放资源(如关闭文件句柄)。
  • 避免循环依赖:使用构造器注入或 @Lazy 注解。
  • 作用域控制@RequestScope 等短生命周期 Bean 需配合容器事件管理。

三、生命周期完整流程图

graph TD A[实例化 Bean] --> B[属性赋值] B --> C[初始化] C --> C1[Aware 接口回调] C1 --> C2[BeanPostProcessor 前置处理] C2 --> C3[执行初始化方法] C3 --> C4[BeanPostProcessor 后置处理] C4 --> D[使用 Bean] D --> E[销毁] E --> E1[@PreDestroy 方法] E1 --> E2[DisposableBean#destroy]

四、引用总结

  • 阶段划分:实例化 → 属性赋值 → 初始化 → 销毁。
  • 扩展点BeanPostProcessorAware 接口@PostConstruct/@PreDestroy
  • 线程安全:单例 Bean 需避免共享状态,原型 Bean 每次请求新实例。

通过合理利用生命周期扩展点,可以优化资源管理、增强功能(如 AOP),并提升应用健壮性。

posted @ 2025-04-23 15:23  我不想学编丿程  阅读(69)  评论(0)    收藏  举报