spring boot bean的生命周期

spring boot bean的生命周期

  • Bean创建和销毁过程中调用的顺序
    • Bean创建过程方法调用顺序
    • Bean销毁过程方法调用顺序
    • BeanPostProcessor
      • BeanPostProcessor内部执行顺序
      • `BeanPostProcessor`子类及其调用顺序相关因素
  • bean的扩展点
    • ApplicationContextAware
    • ApplicationContextInitializer
      • mian函数中添加
      • 配置文件中配置 application.properties
      • SpringBoot的SPI扩展---META-INF/spring.factories中配置
    • BeanPostProcessor
      • 例子:简单地打印了Bean的名字
    • InitializingBean
      • 构造一个bean的执行顺序
    • 常见的Aware接口

Bean创建和销毁过程中调用的顺序

在实际应用中,通常
不会同时使用@PostConstruct和InitializingBean#afterPropertiesSet(),
也不会同时使用@PreDestroy和DisposableBean#destroy(),
因为它们是重复的机制。
此外,还需要注意的是,Aware接口的方法调用通常发生在依赖注入之后,但在@PostConstruct之前。这是因为Aware接口提供的方法允许Bean访问其在Spring容器中的环境和配置信息,这可能需要依赖项已经被注入。

Bean创建过程方法调用顺序

调用顺序方法/注解描述
1构造方法通过调用Bean的构造方法来创建Bean对象
2@Autowired用于自动装配Bean的依赖项,通常在构造方法之后立即发生
3Aware接口方法如果Bean实现了Aware接口,会调用相应的方法,使Bean能够访问Spring容器的特定资源
4@PostConstruct在Bean的依赖项注入完成后被调用,用于执行Bean的初始化逻辑
5InitializingBean#afterPropertiesSet()如果Bean实现了InitializingBean接口,在所有的属性设置完毕并且依赖注入完成后调用
6@Bean#initMethod()如果在Bean的配置中指定了init-method属性,会调用指定的初始化方法

Bean销毁过程方法调用顺序

调用顺序方法/注解描述
1@PreDestroy在Bean即将被销毁之前调用,允许Bean执行一些资源清理的逻辑
2DisposableBean#destroy()如果Bean实现了DisposableBean接口,在Bean销毁时调用
3@Bean#destroyMethod()如果在Bean的配置中指定了destroy-method属性,会调用指定的销毁方法

BeanPostProcessor

BeanPostProcessor内部执行顺序

生命周期阶段事件/回调方法相关的BeanPostProcessor方法备注
实例化前无直接事件BeanFactoryPostProcessor.postProcessBeanFactory对BeanFactory进行后处理,此时Bean尚未实例化。
实例化Bean构造函数被调用无直接BeanPostProcessor方法Bean对象被创建,但属性尚未注入。
属性注入后无直接事件BeanPostProcessor.postProcessBeforeInitialization在Bean初始化之前调用,此时Bean的属性已注入,但自定义初始化方法尚未调用。
初始化InitializingBean.afterPropertiesSet 或 自定义的init方法无直接BeanPostProcessor方法,但在上一阶段和下一阶段之间执行执行Bean的自定义初始化逻辑。
初始化后无直接事件BeanPostProcessor.postProcessAfterInitialization在Bean初始化方法执行完毕后调用,此时Bean已完全初始化。
销毁前无直接事件无直接BeanPostProcessor方法在Bean销毁之前,可以通过DisposableBean.destroy或自定义的destroy-method进行资源清理。
销毁DisposableBean.destroy 或 自定义的destroy方法无直接BeanPostProcessor方法执行Bean的自定义销毁逻辑。

请注意,BeanFactoryPostProcessorBeanPostProcessor不同,它处理的是BeanFactory,而不是单个Bean。此外,BeanPostProcessor的两个方法postProcessBeforeInitializationpostProcessAfterInitialization分别在Bean的初始化方法之前和之后被调用。

此表格主要是为了展示Bean的生命周期阶段和与之相关的回调方法或事件。在实际应用中,开发者可以通过实现相应的接口或配置自定义的初始化/销毁方法来参与Bean的生命周期管理。

BeanPostProcessor子类及其调用顺序相关因素

子类/实现调用顺序确定因素描述
自定义BeanPostProcessor注册顺序按照在Spring配置中定义或扫描的顺序进行调用。
实现了Ordered接口的BeanPostProcessor实现优先级通过实现Ordered接口的getOrder()方法提供一个顺序值,值越小优先级越高。
使用@Order注解的BeanPostProcessor注解优先级使用@Order注解并指定一个值来确定调用顺序,值越小优先级越高。
依赖关系的BeanPostProcessor依赖关系如果存在依赖关系,被依赖的BeanPostProcessor会先被调用。
其他默认BeanPostProcessor默认顺序没有指定顺序的BeanPostProcessor按照默认顺序调用,通常基于注册顺序。

请注意,这个表格是为了说明影响BeanPostProcessor子类调用顺序的不同因素。实际上,在编写自定义的BeanPostProcessor时,并不一定会直接扩展BeanPostProcessor接口的子类,而是直接实现BeanPostProcessor接口,并根据需要实现Ordered接口或使用@Order注解来指定调用顺序。

此外,表格中的“自定义BeanPostProcessor”指的是开发者自己实现的BeanPostProcessor接口,而不是指一个具体的子类。开发者在实现自定义的BeanPostProcessor时,应该遵循Spring框架的规范,确保处理器能够在Bean的生命周期中正确地执行。

bean的扩展点

ApplicationContextAware

ApplicationContext是我们常用的IOC容器,而他的顶层接口便是BeanFactory,ApplicationContext对BeanFactory做了拓展,功能更加强大。

@Component
public class SpringtUtil implements ApplicationContextAware {private static ApplicationContext applicationContext = null;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringtUtil.applicationContext = applicationContext;}public static ApplicationContext getApplicationContext() {return applicationContext;}
}

ApplicationContextInitializer

用于在spring容器刷新之前初始化Spring ConfigurableApplicationContext的回调接口。
通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。

public class MyApplicationContextInitializer implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("-----MyApplicationContextInitializer initialize-----");}
}

mian函数中添加

@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MySpringBootApplication.class);application.addInitializers(new MyApplicationContextInitializer());application.run(args);}
}

配置文件中配置 application.properties

context.initializer.classes=org.springframework.boot.demo.common.MyApplicationContextInitializer

SpringBoot的SPI扩展—META-INF/spring.factories中配置

org.springframework.context.ApplicationContextInitializer=org.springframework.boot.demo.common.MyApplicationContextInitializer

BeanPostProcessor

BeanPostProcessor,中文名 Bean的后置处理器,在Bean创建的过程中起作用。
BeanPostProcessor是Bean在创建过程中一个非常重要的扩展点,因为每个Bean在创建的各个阶段,都会回调BeanPostProcessor及其子接口的方法。

例子:简单地打印了Bean的名字

@Component  
public class LoggingBeanPostProcessor implements BeanPostProcessor {  @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {StringBuilder sb = new  StringBuilder("Before Initialization:	");String fullName = bean.getClass().getName();sb.append(fullName);if(!fullName.equals(beanName)) {sb.append(",	aliasName=	").append(beanName);}System.err.println(sb);  return bean; // 直接返回传入的bean,不做额外处理  }  @Override  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
//        System.out.println("After Initialization : " + beanName);  return bean; // 直接返回传入的bean,不做额外处理  }  
}
父类名类名作用实际使用
BeanPostProcessorAutowiredAnnotationBeanPostProcessor处理 @Autowired@Value 注解,实现自动装配在 Spring 应用程序中自动注入依赖
BeanPostProcessorRequiredAnnotationBeanPostProcessor检查带有 @Required 注解的 bean 属性是否已设置确保必需属性被正确注入
BeanPostProcessorCommonAnnotationBeanPostProcessor处理 JSR-250 注解(如 @PostConstruct, @PreDestroy, @Resource在 bean 生命周期中调用注解方法,处理资源注入
BeanPostProcessorPersistenceAnnotationBeanPostProcessor扫描并处理 JPA 相关注解(如 @Entity集成 JPA 实体类到 Spring 应用程序中
BeanPostProcessorAsyncAnnotationBeanPostProcessor处理 @Async 注解,使方法异步执行在 Spring 应用程序中创建异步任务
BeanPostProcessorScheduledAnnotationBeanPostProcessor处理 @Scheduled 注解,按计划执行方法在 Spring 应用程序中创建定时任务
BeanPostProcessor自定义 BeanPostProcessor允许开发者自定义 bean 的初始化逻辑插入自定义代码到 bean 初始化过程

请注意,这个表格是为了提供信息而简化的,并且可能不包含所有 BeanPostProcessor 的实现。此外,随着 Spring 框架的发展,可能会有新的实现类被添加或现有类的用途发生变化。因此,建议参考 Spring 官方文档以获取最新和详细的信息。

InitializingBean

InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。

构造一个bean的执行顺序

@Component
public class MyInitializingBean implements InitializingBean {public MyInitializingBean() {System.out.println("我是MyInitializingBean构造方法执行...");}@PostConstructpublic void postConstruct() {System.out.println("我是postConstruct方法执行...");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("我是afterPropertiesSet方法执行...");}@Bean(initMethod = "init")public MyInitializingBean test() {return new MyInitializingBean();}public void init(){System.out.println("我是init方法执行...");}// 打印顺序:// 构造方法 > postConstruct >afterPropertiesSet > init方法
}

常见的Aware接口

在Spring框架中,常见的Aware接口允许Bean在其生命周期内感知并访问Spring容器的特定资源或功能。以下是一些常见的Aware接口以及它们的简要描述,以表格的形式呈现:

接口名称描述
ApplicationContextAware允许Bean访问它所在的ApplicationContext,从而能够使用应用上下文的功能,如资源加载、事件发布等。
BeanNameAware提供了Bean的名称,允许Bean知道它在Spring容器中的名字。
BeanFactoryAware允许Bean访问它所在的BeanFactory,从而可以查询其他Bean或容器的状态。
EnvironmentAware允许Bean访问Spring的Environment,用于读取配置属性、系统属性等。
ResourceLoaderAware提供了对资源加载器的访问,允许Bean加载外部资源,如配置文件、图片等。
ApplicationEventPublisherAware允许Bean访问ApplicationEventPublisher,从而可以发布应用事件到Spring容器中。
MessageSourceAware提供了对MessageSource的访问,用于获取本地化消息,支持国际化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泰克示波器(TBS2000系列)保存功能使用

目录 1.1 Save/Recall按钮1.2 保存动作1.3 文件格式1.4 保存 在使用示波器时,测量后的结果我们常常需要记录下来,大部分情况我们是拍照记录,单图像往往不清晰,这时使用示波器专用的保存功能,插入U盘即可保存&#xff0…

STM32--SPI通信协议(3)SPI通信外设

前言 硬件SPI:通过硬件电路实现,所以硬件SPI速度更快,有专门的寄存器和 库函数 ,使用起来更方便。 软件SPI:也称模拟SPI,通过程序控制IO口电平模拟SPI时序实现,需要程序不断控制IO电平翻转&am…

【无标题】summarizations onMysql

how to clear the screen of mysql 1.1 !clear 1.2 ctrl l

二级C语言笔试1

(总分96,考试时间90分钟) 一、选择题 下列各题A)、B)、C)、D)4个选项中,只有1个选项是正确的。 1. 有以下程序: void sum(int a[]) a[0]a[-1]a[1]; main() int a[10]1,2,3,4,5,6,7,8,9,10; sum(&a[2]); printf(…

JAVA字节流的两个重要子类FileOutputStream、FileInputStream

字节流,字符集,字符流 因为它们都是抽象类,所以要学习它们的子类 字节流的结构: FileOutputStream 操作本地文件的字节输出流,可以把程序中的数据写入本地文件。 书写步骤: 创建字节输出流对象写数据释放资源 演示:…

C语言开发单片机为什么大多数都采用全局变量的形式?

C语言开发单片机为什么大多数都采用全局变量的形式? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&…

STM32F4学习

F4系统架构 8个主控总线7个被控总线 主控总线 Cortex-M4内核 I总线Cortex-M4内核 D总线Cortex-M4内核 S总线DMA1存储器总线DMA2存储器总线DMA2外设总线以太网DMA总线USB OTG HS DMA总线 被控总线 内部FLASH ICode总线内部FLASH DCode总线主要内部SRAM1(112KB&a…

【PostgreSQL内核学习(二十六) —— (共享数据缓冲区)】

共享数据缓冲区 概述共享数据缓冲区管理共享缓冲区管理的核心功能包括:共享数据缓冲区的组织结构初始化共享缓冲池BufferDesc 结构体InitBufferPool 函数如何确定请求的数据页面是否在缓冲区中?BufferTag 结构体RelFileNode 结构体ForkNumber 结构体ReadBuffer_common 函数怎…

【AI绘画+Midjourney平替】Fooocus:图像生成、修改软件(Controlnet原作者重新设计的UI+Windows一键部署)

代码:https://github.com/lllyasviel/Fooocus windows一键启动包下载:https://github.com/lllyasviel/Fooocus/releases/download/release/Fooocus_win64_2-1-831.7z B站视频教程:AI绘画入门神器:Fooocus | 简化SD流程&#xff0c…

【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

Windows如何安装Node.js环境并制作贪吃蛇小游戏分享好友远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

JAVA中的类变量

一、如何定义类变量 定义语法: 访问修饰符 static 数据类型 变量名; static 访问修饰符 数据类型 变量名; 注:访问修饰符应遵守相关访问权限 如何访问类变量 类名.类变量名 或者 对象名.类变量名 public class StaticVar {public stat…

redis(6)

文章目录 一、redis clusterRedis Cluster 工作原理Redis cluster 基本架构Redis cluster主从架构Redis Cluster 部署架构说明部署方式介绍 原生命令手动部署原生命令实战案例:利用原生命令手动部署redis cluster 实战案例:基于Redis 5 的redis cluster部…

【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“

使用idea运行项目,显示错误信息如下: 原因是:idea配置的maven加载不到autoconfigure。 解决方案一: 第6步绕过证书语句如下: -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue 打开终端&am…

【视频编码\VVC】变换编码基础知识及标准设计相关参数

变化编码的基础知识 定义:变换编码是将以空间域像素形式描述的图像转换至变换域,以变换系数的形式加以表示。 大部分图像都包含较多平坦区域和内容变化缓慢的区域,使得图像能量在空间域的分散转换为变换域的相对集中分布,从而达…

Spring事务源码解析

Spring的事务属于逻辑事务。不是物理事务。 Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JDBC或者JTA等持久化机制所提供的相关平台框架的事务来实现。例如JDBC的事物管理器就是DataSourceTransactionManager。   Spr…

寒假作业2月5号

第四章 堆与拷贝构造函数 一 、程序阅读题 1、给出下面程序输出结果。 #include <iostream.h> class example {int a; public: example(int b5){ab;} void print(){aa1;cout <<a<<"";} void print()const {cout<<a<<endl;} …

算法学习——华为机考题库10(HJ64 - HJ69)

算法学习——华为机考题库10&#xff08;HJ64 - HJ69&#xff09; HJ64 MP3光标位置 描述 MP3 Player因为屏幕较小&#xff0c;显示歌曲列表的时候每屏只能显示几首歌曲&#xff0c;用户要通过上下键才能浏览所有的歌曲。为了简化处理&#xff0c;假设每屏只能显示4首歌曲&a…

基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道

基于MATLAB实现的OFDM仿真调制解调&#xff0c;BPSK、QPSK、4QAM、16QAM、32QAM&#xff0c;加性高斯白噪声信道、TDL瑞利衰落信道 相关链接 OFDM中的帧&#xff08;frame&#xff09;、符号&#xff08;symbol&#xff09;、子载波&#xff08;subcarriers&#xff09;、导频…

数据库管理-第144期 深入使用EMCC-01(20240204)

数据库管理144期 2024-02-04 数据库管理-第144期 深入使用EMCC-01&#xff08;20240204&#xff09;1 用户管理2 配置告警动作3 配置意外事件规则总结 数据库管理-第144期 深入使用EMCC-01&#xff08;20240204&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&am…