当前位置: 首页 > news >正文

【Spring】Bean的生命周期

在 Spring 容器中,Bean 的生命周期可以分为以下几个阶段:

实例化:创建 Bean 实例。
属性赋值:注入依赖属性。
        BeanPostProcessor 的 postProcessBeforeInitialization 方法:调用所有注册的         BeanPostProcessor 的 postProcessBeforeInitialization 方法。
初始化前:调用 InitializingBean 接口的 afterPropertiesSet 方法。
初始化前:调用 @PostConstruct 注解的方法。
初始化前:调用 init-method 配置的方法。
        BeanPostProcessor 的 postProcessAfterInitialization 方法:调用所有注册的         BeanPostProcessor 的 postProcessAfterInitialization 方法。
使用 Bean:Bean 完成初始化后,可以被其他 Bean 使用。
销毁:调用 DisposableBean 接口的 destroy 方法。
销毁:调用 @PreDestroy 注解的方法。
销毁:调用 destroy-method 配置的方法。


BeanPostProcessor 的调用顺序


1、postProcessBeforeInitialization 方法
在 Bean 的初始化方法(如 afterPropertiesSet、@PostConstruct、init-method)之前调用。
所有注册的 BeanPostProcessor 的 postProcessBeforeInitialization 方法都会按顺序调用。


2、postProcessAfterInitialization 方法
在 Bean 的初始化方法(如 afterPropertiesSet、@PostConstruct、init-method)之后调用。
所有注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法都会按顺序调用。


调用顺序的规则
1、按注册顺序调用:
BeanPostProcessor 的调用顺序是按照它们在 Spring 容器中注册的顺序来执行的。
如果你在配置文件中定义了多个 BeanPostProcessor,它们的调用顺序就是它们在配置文件中出现的顺序。
2、优先级:
如果 BeanPostProcessor 实现了 Ordered 接口,可以指定一个优先级。优先级数值越小,优先级越高。
优先级相同的 BeanPostProcessor 按照注册顺序调用。


示例
假设你有三个 BeanPostProcessor 实现类:CustomBeanPostProcessor1、CustomBeanPostProcessor2 和 CustomBeanPostProcessor3,并且它们都实现了 Ordered 接口。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;public class CustomBeanPostProcessor1 implements BeanPostProcessor, Ordered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor1 before initialization of bean: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor1 after initialization of bean: " + beanName);return bean;}@Overridepublic int getOrder() {return 1;}
}public class CustomBeanPostProcessor2 implements BeanPostProcessor, Ordered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor2 before initialization of bean: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor2 after initialization of bean: " + beanName);return bean;}@Overridepublic int getOrder() {return 2;}
}public class CustomBeanPostProcessor3 implements BeanPostProcessor, Ordered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor3 before initialization of bean: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("CustomBeanPostProcessor3 after initialization of bean: " + beanName);return bean;}@Overridepublic int getOrder() {return 3;}
}

配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic CustomBeanPostProcessor1 customBeanPostProcessor1() {return new CustomBeanPostProcessor1();}@Beanpublic CustomBeanPostProcessor2 customBeanPostProcessor2() {return new CustomBeanPostProcessor2();}@Beanpublic CustomBeanPostProcessor3 customBeanPostProcessor3() {return new CustomBeanPostProcessor3();}@Beanpublic MyBean myBean() {return new MyBean();}
}

运行结果
假设 MyBean 的定义如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {// 1. 实例化一个 ApplicationContext 对象ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 2. 获取并使用 BeanMyBean myBean = context.getBean(MyBean.class);myBean.doSomething();}
}

输出结果

CustomBeanPostProcessor1 before initialization of bean: myBean CustomBeanPostProcessor2 before initialization of bean: myBean CustomBeanPostProcessor3 before initialization of bean: myBean CustomBeanPostProcessor1 after initialization of bean: myBean CustomBeanPostProcessor2 after initialization of bean: myBean CustomBeanPostProcessor3 after initialization of bean: myBean

MyBean is doing something...

总结
调用顺序:BeanPostProcessor 的 postProcessBeforeInitialization 和 postProcessAfterInitialization 方法按注册顺序调用。
优先级:如果 BeanPostProcessor 实现了 Ordered 接口,可以指定优先级,优先级数值越小,优先级越高。
固定顺序:确保在 Bean 的生命周期中,BeanPostProcessor 的调用顺序是固定的,不会乱序。


http://www.mrgr.cn/news/47750.html

相关文章:

  • springboot项目部署至linux
  • 【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合
  • 国产3D CAD将逐步取代国外软件
  • 解锁 JMeter 的 ForEach Controller 高效测试秘籍
  • SQL语言的函数实现
  • 【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)
  • 【软件设计师】68道高频考题(附答案),无非就是考这些知识
  • 消防安全小程序推动社会消防安全意识提升
  • PHP生成RSA/ECC密钥对
  • 基于华为云函数工作流Functiongraph的AI风格化编程
  • Unity游戏通用框架——单例模式
  • MySQL中text类型对查询效率的影响
  • 扩散模型代码实战:无条件图像生成扩散模型
  • 零基础也可以搞懂负载均衡怎么配置!
  • 怎样批量删除大量的QQ邮件?
  • 《大模型应用开发极简入门》学习成为善用 AI 的人!看完懂得90%的大模型!{含pdf版电子书}_大模型应用开发极简入门 pdf
  • 精准控制外发文档的打开次数、时间,过期自动删除无法打开,赶紧收藏
  • MLCC贴片电容不同材质区别:【及电容工作原理】
  • 康达新材: 以CRM丰富数字化转型助推业务全面升级
  • 国企最爱的校招大学院校和专业,都有哪些呢?盘点一下
  • 【4G低功耗摄像头快速启动抓拍形式 秒级别唤醒方案功耗超低】
  • 2024选购文件加密软件的避坑指南 |如何选择好用的文档加密软件
  • tp框架网络请求
  • YOLOv11改进策略【注意力机制篇】| 引入SimAM注意力模块(一个简单的,无参数的卷积神经网络注意模块)
  • vue3--通用组件 popup 封装
  • 猫头虎分享:Python库 Django 的简介、安装、用法详解入门教程