SpringBoot日常:Spring之@PostConstruct解析

简介

spring的Bean在创建的时候会进行初始化,而初始化过程会解析出@PostConstruct注解的方法,并反射调用该方法。
@PostConstruct 的使用和特点

  • 只有一个非静态方法能使用此注解;
  • 被注解的方法不得有任何参数;
  • 被注解的方法返回值必须为void;
  • 被注解的方法不得抛出已检查异常;
  • 被注解的方法只会被执行一次;
spring容器中Bean的生命周期内所有可扩展的点的调用顺序
扩展接口 实现接口
ApplicationContextlnitializer initialize
AbstractApplicationContext refreshe
BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor postProcessBeanFactory
BeanFactoryPostProcessor postProcessBeanFactory
instantiationAwareBeanPostProcessor postProcessBeforelnstantiation
SmartlnstantiationAwareBeanPostProcessor determineCandidateConstructors
MergedBeanDefinitionPostProcessor postProcessMergedBeanDefinition
InstantiationAwareBeanPostProcessor postProcessAfterlnstantiation
SmartInstantiationAwareBeanPostProcessor getEarlyBeanReference
BeanFactoryAware postProcessPropertyValues
ApplicationContextAwareProcessor invokeAwarelnterfaces
BeanNameAware setBeanName
InstantiationAwareBeanPostProcessor postProcessBeforelnstantiation|
BeanNameAware setBeanName
@PostConstruct
InitializingBean afterPropertiesSet
FactoryBean getobject
SmartlnitializingSingleton afterSingletonslnstantiated
CommandLineRunner run
DisposableBeandestroy

源码分析

在Bean创建完成后,进行初始化的过程中,主要包含了初始化的前置、后置处理,以及初始化方法的调用。@PostConstruct注解将在applyBeanPostProcessorsBeforeInitialization这个前置处理

@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;//遍历了在spring启动过程中被注册的BeanPostProcessor接口,for (BeanPostProcessor processor : getBeanPostProcessors()) {//调用其前置方法。Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;
}

@PostConstruct注解是会被一个专门的BeanPostProcessor接口的具体实现类来处理的InitDestroyAnnotationBeanPostProcessor

//org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 元数据解析  注解的初始化方法也会在这里被找到LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());try {// 触发初始化方法metadata.invokeInitMethods(bean, beanName);}catch (InvocationTargetException ex) {throw new BeanCreationException(beanName, "Invocation of init method failed", ex.getTargetException());}catch (Throwable ex) {throw new BeanCreationException(beanName, "Failed to invoke init method", ex);}return bean;
}
public void invokeInitMethods(Object target, String beanName) throws Throwable {Collection<LifecycleElement> checkedInitMethods = this.checkedInitMethods;Collection<LifecycleElement> initMethodsToIterate =(checkedInitMethods != null ? checkedInitMethods : this.initMethods);if (!initMethodsToIterate.isEmpty()) {for (LifecycleElement element : initMethodsToIterate) {if (logger.isTraceEnabled()) {logger.trace("Invoking init method on bean '" + beanName + "': " + element.getMethod());}//  调用element.invoke(target);}}
}

注意:在CommonAnnotationBeanPostProcessor这个后置处理器的构造方法中,@PostConstruct注解被设置为了initAnnotationType的值

//org.springframework.context.annotation.CommonAnnotationBeanPostProcessorpublic CommonAnnotationBeanPostProcessor() {setOrder(Ordered.LOWEST_PRECEDENCE - 3);setInitAnnotationType(PostConstruct.class);setDestroyAnnotationType(PreDestroy.class);ignoreResourceType("javax.xml.ws.WebServiceContext");// java.naming module present on JDK 9+?if (jndiPresent) {this.jndiFactory = new SimpleJndiBeanFactory();}
}

应用场景

@PostConstruct不算一个扩展点,但是也有比较实用的应用场景,主要在Servlet初始化之前加载一些缓存数据,比如

  • 数据字典,
  • 读取properties配置文件

代码示例

@Component
@Slf4j
public class TagPostConstruct {@Autowiredprivate TestAutowired testAutowired;public TagPostConstruct(){log.info("TagPostConstruct构造方法------run");}@PostConstructpublic void myPostConstruct() {log.info("PostConstruct------run");}
}@Slf4j
@Component
public class TestAutowired {public TestAutowired(){log.info("TestAutowired构造方法------run");}
}

运行示例

可以看出@PostConstruct注解在整个Bean初始化中执行的顺序:@Constructor(构造方法)-> @Autowired(依赖注入)-> @PostConstruct(注解的方法);
在这里插入图片描述

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

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

相关文章

npm登录

npm 登录问题 npm login --auth-typelegacy报错 原因 npm源非npm本身源&#xff0c;需要切换&#xff1a; 查看源 nrm ls切换为npm源 nrm use npm重新登录 输入OTP验证后登录成功&#xff1a;

python从入门到精通:数据可视化-图形开发

1、json数据格式 • Json是一种轻量级的数据交互格式&#xff0c;可以按照Json指定的格式去组织和封装数据 • Json本质上是一种带有特殊格式的字符串 主要功能&#xff1a;json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互&#xf…

【DSP+FPGA】基于2 个TMS320C6678+ XC7VX690T FPGA 的6U VPX 总线架构的高性能实时信号处理平台

6U VPX架构&#xff0c;符合VITA46规范板载 2 个TMS320C6678 多核DSP处理节点板载 1 片 XC7VX690T FPGA处理节点板载 2 个FMC 接口背板之间具有 4 路 x4 高速 GTH 互联&#xff0c;支持RapidIO、PCI ExpressFPGA 与 DSP 之间采用高速Rapid IO互联 基于6U VPX架构的高性能实时信…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT&#xff0c;它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al.&#xff0c; 2018a;Radford et al.&#xff0c; 2018)&#xff0c; BER…

组合式API-reactive和ref函数,computed计算属性,watch函数

一.reactive&#xff08;&#xff09;接收一个对象类型的数据&#xff0c;返回一个响应式的对象&#xff1a; <script setup> import {reactive} from vue const state reactive({count:100 }) const setCount () > {state.count } </script> <template>…

书生大模型实战营第三期进阶岛第三课——LMDeploy 量化部署实践

LMDeploy 量化部署实践 任务一&#xff1a;创建虚拟环境创建文件夹LMDEPLOY用于存放课程相关的文件创建模型软连接LMDeploy验证启动模型文件LMDeploy API部署InternLM2.5-1.8b以命令行形式连接API服务器以Gradio网页形式连接API服务器LMDeploy KV量化W4A16 模型量化和部署W4A16…

学习日志28

论文阅读&#xff1a;Quantum speed-ups in reinforcement learning 量子强化学习&#xff08;Quantum Reinforcement Learning, QRL&#xff09;是一种结合了量子计算和强化学习的方法&#xff0c;旨在利用量子力学的原理来加速和优化智能体的学习过程。量子加速则是指利用量子…

valgrind安装及使用

安装 下载源码下载地址 tar -jxvf valgrind-3.23.0.tar.bz2 cd valgrind-3.23.0 ./autogen.sh ./configure --prefix安装目录 make make install使用文档 官方文档

create-react-app 移除 ESLint 语法检查

ESLint 的作用&#xff1a; ESLint 是一个流行的 JavaScript 代码静态检查工具&#xff0c;旨在帮助开发者识别和修复代码中的问题。以下是关于 ESLint 的一些关键信息&#xff1a; 主要功能&#xff1a; 1.代码风格检查&#xff1a;ESLint 可以检查代码是否符合特定的编码风…

mysql 数据区备份

第一步 &#xff0c;进入mysql窗口锁住数据库&#xff08;不锁的可以只执行第二步&#xff09;&#xff1a; use dbName-- 使用xx数据库flush tables with read lock; -- 锁住数据库。第二步&#xff1a;打开cmd窗口&#xff0c;或者liunx命令行窗口 C:\Users\User>mysqld…

经典算法之链表篇(二)

目录 一&#xff1a;重排链表&#xff08;LeetCode.143&#xff09; 二&#xff1a;删除链表的节点&#xff08;LCR 136. 删除链表的节点&#xff09; 三&#xff1a;K个一组反转链表&#xff08;LeetCode.25&#xff09; 有关经典算法链表的第一篇内容&#xff0c;可以查看我…

ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“

目录 一、问题描述1.使用环境2.问题截图3.问题解析 二、解决方法Ⅰ1.按 ShiftF10 弹出命令提示符2.在弹出的Dos框中输入regedit&#xff0c;回车&#xff0c;进入注册表。3.打开HKEY_LOCAL_MACHINE\SYSTEM\Setup&#xff0c;并新建 LabConfig 的项&#xff0c;在 LabConfig 下创…

使用预训练的 ONNX 格式的 YOLOv8n 模型进行目标检测,并在图像上绘制检测结果

目录 __init__方法&#xff1a; pre_process方法&#xff1a; run方法&#xff1a; filter_boxes方法&#xff1a; view_img方法&#xff1a; __init__方法&#xff1a; 初始化类的实例时&#xff0c;创建一个onnxruntime的推理会话&#xff0c;加载名为yolov8n.onnx的模型…

C#开发基础之100个常用的C#正则表达式

前言 正则表达式是处理字符串的强大工具&#xff0c;特别是在文本搜索、替换和验证中。本文将100个常用的C#正则表达式进行分类&#xff0c;以帮助我们更快速地找到适合的正则表达式解决方案。 1. 基础匹配 这些正则表达式用于匹配一些基本的字符或字符串模式。 匹配任意字…

利用 Pytest Cache Fixture 实现中间数据缓存

接口自动化过程中&#xff0c;经常会遇到这样一些场景&#xff0c;“请求2需要用到请求1响应的数据”&#xff0c;常见的做法&#xff0c;进行用例依赖或者将请求1的响应结果写入一个文件&#xff0c;用到的时候读取文件。 当然这都不是这篇文章的重点&#xff0c;本片文章主要…

macos MacPort 包管理工具安装和使用

在macos v10.15版本中, xz, python等软件无法使用brew安装, 原因是brew对于旧版本的macos不再支持, 但是我们可以使用另外一个macos下的包管理工具来安装brew无法安装的软件, macport 是一个和brew类似的macos下的一个非常优秀的软件包安装管理工具. MacPort安装前提条件 安…

AR.js 开发与使用指南

1. AR.js 简介 AR.js 是基于 Web 技术的 AR 库&#xff0c;依赖于 WebGL 和 WebRTC&#xff0c;可以在大多数现代浏览器上运行。它的主要优势在于不需要安装任何插件或应用程序&#xff0c;用户只需通过浏览器即可体验 AR 效果。AR.js 提供了 Marker-based&#xff08;基于标记…

假期学习--对象底层结构和继承链

OC本质底层实现转化其实都是C/C代码。 OC对象的本质就是结构体。 NSObject底层是struct objc_object结构体 &#xff1b;struct objc_class : objc_object { …省略无关代码 // Class ISA; //ISA(从objc_object继承过来的) Class superclass; //指向其父类 cache_t cache…

【Istio】

Istio 是一个开源的服务网格&#xff08;Service Mesh&#xff09;平台&#xff0c;设计用于帮助开发者和运维人员管理、保护和监控微服务架构。随着微服务架构的广泛采用&#xff0c;服务间通信的管理变得越来越复杂。Istio 通过在服务之间插入一个透明的网络层&#xff0c;简…

旅游行业怎么利用C#接口发送短信

旅游企业一般拥有众多的分支机构&#xff0c;同时各地分支机构又有众多下属分散在当地各区的旅游营业报名点&#xff0c;以前传统的解决方案是采用专线、MODEM拔号等方式&#xff0c;专线的成本很高&#xff0c;MODEM拔号更费时&#xff0c;且长途拔号互联成本在多点情况下费用…