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

Spring Bean生命周期执行流程详解

文章目录

  • 一、什么是Spring Bean生命周期?
  • 工作流程图:
  • 二、Bean生命周期执行流程验证
    • 1.编写测试代码验证结果
    • 2.源码追溯Bean初始化回调过程


一、什么是Spring Bean生命周期?

Spring Bean生命周期是指从Bean的创建到销毁的整个过程,其中涉及到Spring容器对Bean的一系列处理操作,包对Bean的实例化、依赖注入、初始化和销毁。Spring框架中Bean的生命周期主要包括以下关键步骤:

  1. 实例化BeanSpring容器根据Bean的定义从容器中取出Bean的类,通过反射机制进行实例化。
  2. 属性填充:Spring容器从Bean定义中获取属性值,将这些属性值注入到新创建的Bean实例中,这个过程也叫做依赖注入。
  3. Aware接口回调:如果Bean涉及到实现了BeanNameAwareBeanClassLoaderAwareBeanFactoryAware接口,则会触发BeanNameAware.setBeanNameBeanClassLoaderAware.setBeanClassLoaderBeanFactory.setBeanFactory方法的调用。
  4. BeanPostProcessor接口回调:触发前置方法BeanPostProcessor.postProcessBeforeInitialization。注意的是ApplicationContextAwareProcessorInitDestroyAnnotationBeanPostProcessor都是BeanPostProcessor的实现类,因此可能触发ApplicationContextAwaresetApplicationContext方法回调和init-Method回调。
  5. InitializingBean接口回调:触发InitializingBean.afterPropertiesSet方法。
  6. BeanPostPorcessor接口回调:触发后置方法BeanPostProcessor.postProcessAfterInitialization方法。
  7. Bean初始化完成,可以投入使用
  8. Bean实现了DisposableBean接口时,Spring容器关闭时,会回调DisposableBean.destory方法。
  9. Bean被销毁,生命周期结束。

工作流程图:

在这里插入图片描述


二、Bean生命周期执行流程验证

1.编写测试代码验证结果

定义一个LifeCycleBean类,将其作为SpringBean进行管理,让其实现BeanNameAware, BeanFactoryAware, BeanPostProcessor, ApplicationContextAware, InitializingBean, DisposableBean接口,在实现方法中打印对应的信息,查看方法调用的顺序。


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class LifeCycleBean implements BeanNameAware, BeanFactoryAware, BeanPostProcessor, ApplicationContextAware, InitializingBean, DisposableBean {//前置处理是否被调用标识private volatile boolean beforeInitializationInvoked = false;//后置处理是否被调用标识private volatile boolean afterInitializationInvoked = false;@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware.name be invoked");}@PostConstructpublic void init() {System.out.println("PostConstruct.init be invoked");}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean.destroy be invoked");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean.afterPropertiesSet be invoked");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("ApplicationContextAware.setApplicationContext be invoked");}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (!beforeInitializationInvoked) {beforeInitializationInvoked = true;System.out.println("BeanPostProcessor.postProcessBeforeInitialization be invoked");}return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (!afterInitializationInvoked) {afterInitializationInvoked = true;System.out.println("BeanPostProcessor.postProcessAfterInitialization be invoked");}return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("BeanFactoryAware.setBeanFactory be invoked");}
}

启动项目,查看控制台打印结果如下:
在这里插入图片描述
关闭容器后,控制台打印如下:
在这里插入图片描述
因此可以得出,Bean启动后,初始化的执行顺序是:BeanNameAware->BeanFactoryAware->ApplicationContextAware(由ApplicationContextAwareProcessor调用)->PostConstruct(由InitDestroyAnnotationBeanPostProcessor调用)->BeanPostProcessor.postProcessBeforeInitialization(自定义)->InitializingBean.afterPropertiesSet->BeanPostProcessor.postProcessAfterInitialization–>DisposableBean.destory


2.源码追溯Bean初始化回调过程

通过断点可以得出Bean初始化的入口在AbstractAutowireCapableBeanFactory.initializeBean方法。

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}

其中的一个方法invokeAwareMethods的命名十分明显,用于调用一些Aware接口的实现类,进入invokeAwareMethods方法后,通过判断当前bean是否为Aware类型,如果是则进一步判断是Aware接口下的哪一种类型,然后进行类型转换调用对应的方法。

	private void invokeAwareMethods(String beanName, Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}

执行完invokeAwareMethods后,则调用initializeBean方法中的applyBeanPostProcessorsBeforeInitialization方法,通过遍历现有的BeanPostProcessor类,依次调用其postProcessBeforeInitialization方法。

	@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

其中重点关注ApplicationContextAwareProcessorInitDestroyAnnotationBeanPostProcessor两个类,他们都属于BeanPostPorcessor的实现类,因此在循环时都会调用其postProcessBeforeInitialization方法。ApplicationContextAwareProcessor.postProcessBeforeInitialization方法中有一个比较重要的方法invokeAwareInterfaces,该方法也是用于回调一些实现了Aware接口的类。其中ApplicationContextAware.setApplicationContext就是在此处被调用,当然还涉及到EnvironmentAwareEmbeddedValueResolverAwareMessageSourceAware等的回调。

	private void invokeAwareInterfaces(Object bean) {if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}

InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization方法重要是通过反射机制调用被注释PostConstruct修饰的init-Method.

在完成applyBeanPostProcessorsBeforeInitialization调用后,则会调用invokeInitMethods方法, 如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet()方法。

protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isTraceEnabled()) {logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null && bean.getClass() != NullBean.class) {String initMethodName = mbd.getInitMethodName();if (StringUtils.hasLength(initMethodName) &&!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}}}

最调用applyBeanPostProcessorsAfterInitialization方法,通过遍历BeanPostProcessor的实现类,调用其postProcessAfterInitialization后置方法。

	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

相关文章:

Spring Bean生命周期执行流程详解

文章目录 一、什么是Spring Bean生命周期&#xff1f;工作流程图&#xff1a;二、Bean生命周期执行流程验证1.编写测试代码验证结果2.源码追溯Bean初始化回调过程 一、什么是Spring Bean生命周期&#xff1f; Spring Bean生命周期是指从Bean的创建到销毁的整个过程&#xff0c…...

windows 安装 pygame( pycharm)

一、安装流程 1.查看python版本 2.检查是否安装pip 3.下载pygame安装文件 下载地址&#xff1a;https://pypi.org/project/pygame/#files 选择合适的版本&#xff08;我选择的是 python3.7 windows 64bit&#xff09;&#xff1a; 4.使用pip安装pygame 将下载好的whl文件移动到…...

Envoy网关实例异常重启排查总结

一、事件背景 于10月24日凌晨业务租户有业务应用发版上线&#xff0c;中午收到pod连续5分钟重启严重告警&#xff0c;登录管理节点查看异常重启的应用网关pod日志&#xff0c;存在内核段错误报错信息导致进程终止并触发监控检查异常并重启; 该报错主要是访问的内存超出了系统…...

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件&#xff0c;支持单选或多选操作&#xff0c;适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合&#xff0c;支持动…...

【Linux网络编程】UDP Echo Server的实现

本文专栏&#xff1a;Linux网络编程 目录 一&#xff0c;Socket编程基础 1&#xff0c;IP地址和端口号 端口号划分范围 理解端口号和进程ID 源端口号和目的端口号 理解Socket 2&#xff0c;传输层的典型代表 3&#xff0c;网络字节序 4&#xff0c;Socket编程接口 s…...

8.3.5 ToolStripContainer(工具栏容器)控件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 ToolStripContainer控件是一个容器&#xff0c;可以包含菜单和工具条、状态栏。 在设计窗体中放入一个ToolStripContainer&#xff1…...

代码随想录-06-二叉树-05.05 N叉树的层序遍历

N叉树的层序遍历 #模板题 题目描述 给定一个 N 叉树&#xff0c;返回其节点值的_层序遍历_。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 具体思路 …...

【NEPVR】《A Lightweight Palm Vein Recognition Algorithm NEPVR》

[1]马莉,刘子良,谭振林,等.一种轻量级掌静脉识别算法NEPVR[J].计算机技术与发展,2024,34(12):213-220.DOI:10.20165/j.cnki.ISSN1673-629X.2024.0248. 文章目录 1、背景2、相关工作3、创新点4、NEPVR 手掌静脉识别算法5、实验结果及分析6、总结 / 未来工作 1、背景 手掌静脉独…...

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记1

&#xff08;适合GIS开发入门者&#xff0c;通俗解析核心知识点&#xff09; 目录 一、ArcGIS Engine是什么&#xff1f; 二、ArcGIS Engine能做什么&#xff1f; 三、ArcGIS Engine与ArcObjects的区别 四、开发资源与学习路径 五、对象模型图&#xff08;OMD&#xff09;…...

架构师论文《论模型驱动软件开发方法在智能制造转型实践中的应用》

摘要&#xff1a; 本人现任某大型装备制造企业智能制造研究院首席架构师&#xff0c;主导集团级数字化工厂平台建设。面对多品种小批量生产模式下普遍存在的交付周期超预期&#xff08;平均延期21天&#xff09;、设备综合效率OEE不足65%的痛点&#xff0c;我司于2021年启动基…...

探索MCP.so:AI生态的创新枢纽

今天在研究MCP时发现了一个还不错的网站,分享给大家。后续会基于这些mcp servers做一些有趣的应用。 在人工智能飞速发展的当下,AI与各类工具、数据源的协同合作变得愈发关键。MCP.so这个平台,正悄然成为AI领域的重要枢纽,为众多开发者和AI爱好者打开了新的大门。 MCP,即…...

JVM底层详解

JVM底层详解 目录 JVM概述JVM内存模型垃圾回收机制类加载过程JIT编译JVM调优JVM监控与故障排查JVM与多线程JVM与性能优化JVM发展历程与未来JVM实战案例分析JVM高级特性JVM安全机制JVM与容器化 一、JVM概述 1.1 什么是JVM Java虚拟机&#xff08;Java Virtual Machine&…...

多点:分布式升级助力新零售转型,成本节省超80% | OceanBase 案例

本文作者&#xff1a;多点数据库DBA团队 编者按&#xff1a;多点是零售行业数字&#xff08;智&#xff09;化的先行者&#xff0c;为全球企业提供创新的数字化解决方案。然而&#xff0c;在数字化转型的过程中&#xff0c;多点原有的数据库架构逐渐暴露出架构复杂、成本上升等…...

Java权限修饰符深度解析

Java权限修饰符深度解析与最佳实践 一、权限修饰符总览 Java提供四种访问控制修饰符&#xff0c;按访问范围从宽到窄排序如下&#xff1a; 修饰符类内部同包类不同包子类全局范围public✔️✔️✔️✔️protected✔️✔️✔️❌默认&#xff08;无&#xff09;✔️✔️❌❌pr…...

RocketMQ和kafka 的区别

一、数据可靠性与容错机制 数据可靠性 RocketMQ支持同步刷盘和同步复制&#xff0c;确保消息写入磁盘后才返回确认&#xff0c;单机可靠性高达10个9&#xff0c;即使操作系统崩溃也不会丢失数据159。而Kafka默认采用异步刷盘和异步复制&#xff0c;虽然吞吐量高&#xff0c;但极…...

分布式限流器框架 eval-rate-limiter

分布式限流器框架 eval-rate-limiter 文章目录 分布式限流器框架 eval-rate-limiter前言设计流程图 核心方法tryAcquire 获取通信证增加访问次数 incrementRequestCount生成分布式 key generateRateLimiterKey 测试测试代码结果Redis 客户端 前言 基于 redis 实现的分布式限流…...

使用Docker部署Java项目的完整指南

前言 Docker是一个轻量级的容器化平台&#xff0c;可将应用及其依赖打包成标准化单元&#xff0c;实现快速部署和环境隔离。本文以Spring Boot项目为例&#xff0c;演示如何通过Dockerfile部署Java应用。 准备工作 本地环境 安装Docker Desktop&#xff08;官网下载&#xff0…...

机器学习数据需求与应用分析

监督学习、无监督学习和强化学习作为机器学习的核心范式&#xff0c;对数据条件的需求存在显著差异。以下是具体分析&#xff1a; 一、监督学习的数据条件 数据要求 监督学习需要带标签&#xff08;labeled&#xff09;的数据集&#xff0c;即每个输入样本都有对应的目标输出&a…...

【机器学习算法】基于python商品销量数据分析大屏可视化预测系统(完整系统源码+数据库+开发笔记+详细启动教程)✅

目录 一、项目背景 二、技术思路 三、算法介绍 四、项目创新点 五、开发技术介绍 六、项目展示 一、项目背景 本项目基于Python技术栈构建了"商品销量数据分析与预测系统"&#xff0c;通过自动化爬取淘宝商品多维数据&#xff08;价格、销量、评价、品类等&a…...

springboot集成springcloud vault读值示例

接上三篇 Vault---机密信息管理工具安装及常用示例 Vault机密管理工具集群配置示例 vault签发根证书、中间证书、ca证书流程记录 项目里打算把所有密码都放到vault里管理&#xff0c;vault提供了springcloud vault用来在springboot里连接vault&#xff0c;启动加载vault里的值放…...

BERT 模型是什么

BERT 模型是什么&#xff1f; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Transformer架构的深度学习模型&#xff0c;由Google于2018年提出。它在自然语言处理领域取得了显著成就&#xff0c;成为众多NLP任务的基础。 …...

三元电池正极材料除杂工艺介绍

三元电池正极材料的除杂工艺对于提高电池性能、安全性和稳定性至关重要。以下是对三元电池正极材料除杂工艺的详细介绍&#xff1a; 物理除杂工艺 磁选 原理&#xff1a;利用磁场对磁性杂质的吸引作用实现分离。在三元电池正极材料生产中&#xff0c;常混入铁、钴、镍等磁性金…...

wx212基于ssm+vue+uniapp的科创微应用平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

Multi Agents Collaboration OS:数据与知识协同构建数据工作流自动化

1-背景 传统数据系统与业务数字化的开发与维护面临诸多挑战&#xff1a;行业知识获取壁垒高、需求变化快导致开发周期长、系统复杂度高以及人力与资源投入成本巨大。同时&#xff0c;用户在使用过程中也常遇到痛点&#xff1a;手动录入数据繁琐低效、数据分散于各模块难以整合…...

elemenPlus中,如何去掉el-input中 文本域 textarea自带的边框和角标

1、去掉角标 :deep(.el-textarea__inner) {resize: none !important; // 去除右下角图标 }2、去除边框&#xff0c;并自定义背景色 <el-inputref"textareaRef"v-model"tempContent":style"{--el-border-color: rgba(255,255,255,0.0),--el-input-…...

Excel 动态比较两列数据:实现灵活的数据验证

目录 动态比较两列数据的需求动态公式的实现使用INDIRECT和ROW函数公式解释应用 动态公式的优点 快速添加一列公式的技巧使用快捷键Ctrl D使用VBA宏自动化使用“表格”功能自动填充 实际应用场景数据验证动态报告数据清洗 注意事项总结 在数据处理和分析中&#xff0c;Excel 是…...

谷歌推出可免费使用的Firebase Studio:Gemini全栈AI开发利器

谷歌刚刚发布了Firebase Studio,这是其打造的一款沉浸式代码开发平台,旨在与Cursor、Lovable、Bolt和V0等工具竞争。如果你是一名网页开发者,可能只知道Firebase是谷歌的数据库工具。 但现在,它已远不止于此。 Firebase已发展成一个完整的生态系统,如今能帮助你从头到尾…...

spark(二)

本节课接上节课继续对于RDD进行学习&#xff0c;首先是对于创建RDD的不同方式&#xff0c;接着学习了RDD的三种转换算子&#xff1a;Value类型、双Value类型、Key-Value类型&#xff0c;以及各个转换算子的不同使用方式。 学习到如下的区别&#xff1a; map 与 mapPartitions…...

Fay 数字人部署环境需求

D:\ai\Fay>python main.py pygame 2.6.1 (SDL 2.28.4, Python 3.11.9) Hello from the pygame community. https://www.pygame.org/contribute.html [2025-04-11 00:10:16.7][系统] 注册命令... [2025-04-11 00:10:16.8][系统] restart 重启服务 [2025-04-11 00:10:16.8][…...

【Harmony】端云一体化(云函数)

一、云函数的概述 1、什么是云函数 官方解释 云函数是一项Serverless计算服务&#xff0c;提供FaaS&#xff08;Function as a Service&#xff09;能力&#xff0c;一方面云函数将开发测试的对象聚焦到函数级别&#xff0c;可以帮助您大幅简化应用开发与运维相关的事务&…...

利用大模型和聚类算法找出 Excel 文件中重复或相似度高的数据,并使用 FastAPI 进行封装的详细方案

以下是一个利用大模型和聚类算法找出 Excel 文件中重复或相似度高的数据,并使用 FastAPI 进行封装的详细方案: 方案流程 数据读取:从 Excel 文件中读取数据。文本向量化:使用大模型将文本数据转换为向量表示。聚类分析:运用聚类算法对向量进行分组,将相似度高的数据归为…...

通过远程桌面连接wsl2中安装的ubuntu24.04

要介绍的这种方式其实跟直接用wsl来执行命令差不多&#xff0c;是在终端去操作ubuntu。WSL2 默认只提供命令行界面&#xff0c;本文安装xrdp后通过windows远程桌面连接过去。 1、更新软件包列表 sudo apt update 确保你的软件包列表是最新的&#xff0c;否则可能找不到某些包…...

对接和使用国内稳定无水印的 Suno API

随着 AI 的应用日益广泛&#xff0c;各种 AI 程序已经融入我们的日常生活。从最早的写作&#xff0c;到医疗、教育&#xff0c;如今甚至扩展到了音乐领域。 Suno 是一个专注于高质量 AI 歌曲和音乐创作的平台。用户只需输入简单的文本提示词&#xff0c;便可以按照流派风格和歌…...

LeetCode算法题(Go语言实现)_38

我将按照您提供的文档结构为您整理二叉树最近公共祖先&#xff08;LCA&#xff09;问题的解决方案&#xff1a; 一、代码实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {if root nil ||…...

Linux学习笔记 1

1.发展史 略...... 2.xshell的使用方法 2.1登录 ssh root公网地址 输入密码&#xff0c;用 uname -r 指令来鉴定是否登录成功。之后就可以进行命令行操作了。 alt enter 全屏、退出 设置多用户指令&#xff0c;新建用户 adduser 名字 passwd 密码 销毁用户&#xf…...

微信小程序跳4

formatMillisecondsTime: function(milliseconds, formatStr) { // 创建一个新的Date对象&#xff0c;传入毫秒值 const date new Date(milliseconds); // 获取年月日时分秒&#xff0c;并确保它们都是两位数 const year date.getFullYear(); const month (date.getMonth() …...

STM32单片机入门学习——第31节: [10-1] I2C通信协议

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.10 STM32开发板学习——第31节: [10-1] I2C通信协议 前言开发板说明引用解答和科普一…...

OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用双边滤波到图像。 该函数对输入图像应用双边滤波&#xff0c;如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…...

【图像处理基石】什么是影调?并用python实现一个哈苏色彩影调

影调是摄影语言的核心&#xff0c;通过控制明暗、虚实与色彩&#xff0c;可精准传达创作意图。实际选择需结合主题情感、光线条件及画面结构&#xff0c;灵活运用高调、低调或冷暖色调&#xff0c;以强化视觉表现力。 一、影调的定义 影调指画面中明暗、虚实、色彩的层次与对比…...

融智学三大定律:打开人机协同智慧大门的钥匙

...

MySQL行列转换

创建一个sc表并插入数据 方法一: select distinct uid, (select score from sc where s.uiduid and course语文)语文, (select score from sc where s.uiduid and course数学)数学, (select score from sc where s.uiduid and course英语)英语 from sc s; 方法二: select * fro…...

cookie和session哪个生成的时间早

Cookie 和 Session 的出现时间都可以追溯到 Web 开发的早期阶段&#xff0c;但它们的生成顺序在实际应用中通常是先生成 Session&#xff0c;然后通过 Cookie 来存储 Session ID。 详细解释&#xff1a; Session 的生成过程 • 用户请求服务器&#xff1a; • 用户首次访问网…...

sh脚本删除指定后缀.txt的文件,保留6个月的数据

1、linux下脚本删除指定后缀.txt和.path的文件&#xff0c;保留6个月的数据&#xff1a; 下面代码内容&#xff1a; #!/bin/bash # 指定要删除文件的路径列表 paths("/data/fail")# 获取当前系统日期6个月之前的日期 six_months_ago$(date -d "-6 months"…...

嵌入式Linux按键监控模块详解:实现设备重启与长按检测

嵌入式Linux按键监控模块详解&#xff1a;实现设备重启与长按检测 在嵌入式Linux设备开发中&#xff0c;物理按键仍然是用户与设备交互的重要方式。本文将分享一个轻量级但功能完整的按键监控模块&#xff0c;它可以精确识别按键的短按和长按事件&#xff0c;并执行对应操作如…...

[错误经验 坑]关于UDP服务器和客户端通信使用的recvfrom的输出型参数len没有被初始化导致的问题

[错误经验 坑]关于UDP服务器和客户端通信使用的recvfrom的输出型参数len没有被初始化导致的问题 水墨不写bug 文章目录 一、困惑&#xff1a;二、解答&#xff1a;&#xff08;1&#xff09;函数原型1. int sockfd2. void *buf3. size_t len4. int flags5. struct sockaddr *sr…...

KaiwuDB:面向AIoT场景的多模融合数据库,赋能企业数字化转型

引言 在万物互联的AIoT时代&#xff0c;企业面临着海量时序数据处理、多模数据融合和实时分析等挑战。KaiwuDB应运而生&#xff0c;作为一款面向AIoT场景的分布式、多模融合、支持原生AI的数据库产品&#xff0c;为企业提供了一站式数据管理解决方案。 产品概述 KaiwuDB是一…...

Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”

在Web3基础设施内卷加剧的今天&#xff0c;“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot&#xff0c;正在用一套名为 Polkadot 2.0 的架构升级方案&#xff0c;重新定义这一问题的解法。 这套升级最…...

Elasticsearch 学习规划

Elasticsearch 学习规划 明确学习目标与动机 场景化需求分析 - **S**&#xff1a;掌握Elasticsearch架构体系&#xff0c;熟练使用Elasticsearch 进行数据分析,Elasticsearch结合java 项目落地案例 - **M**&#xff1a;搜索和Elasticsearch相关GitHub项目 - **A**&#xff1a;每…...

OpenHarmony如何编译安装系统应用(以settings设置为例)

开发环境 1.OpenHarmony 2.DevEco Studio 3 .Full Sdk 实现步骤 1.获取设置应用源码 https://gitee.com/openharmony/applications_settings/tree/OpenHarmony-v5.0.0-Release/ 2,使用 DevEco Studio 和 Full SDK对系统应用进行签名,默认工程是未配置签名的状态,所构建…...

手撕 STL 之—— list

目录 引言 1, list_node类及其构造函数 2, list类的创建 3, list基本功能函数 3_1&#xff0c; 构造函数 3_2&#xff0c;push_back 3_3&#xff0c;push_front 3_4&#xff0c; pop_back 3_5&#xff0c;pop_front 4&#xff0c;迭代器 (重点) 4_1&#xff0c;如何设…...