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

Bean的生命周期详解保姆级教程,结合spring boot和spring.xml两种方式讲解,5/7/10大小阶段详细分析

文章目录

    • Spring Bean的生命周期
      • 一、为什么知道 Bean 的生命周期?
      • 二、生命周期大致了解
      • 三、详细分析生命周期
        • 3.1 ① 初步划分为 5 步:
          • 3.1.1 spring 框架中怎么理解
          • 3.1.2 spring boot 项目中怎么理解
        • 3.2 ② 细分 5 步为 7 步:
          • 3.2.1 spring 框架中怎么理解
          • 3.2.2 spring boot 项目中怎么理解
        • 3.3 ③ 细分 7 步为 10 步:
      • 四、再谈scpoe下bean的管理方式
        • 4.1 spring 框架中理解
        • 4.2 spring boot 项目中理解
      • 五 、自己new的对象如何让Spring管理

Spring Bean的生命周期

一、为什么知道 Bean 的生命周期?

生命周期的本质:在哪个时间节点上调用了哪个类的哪个方法?我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点!只有我们知道了这些特殊的时间节点都在哪,到时候我们才可以确定代码写到哪。我们可能需要在某个特殊的时间节点上执行一段特定的代码,这段代码就可以放到这个节点上;当生命线走到这里的时候,自然会被调用。

二、生命周期大致了解

1、Spring Bean 的生命周期是指一个 Bean 在容器中从创建、初始化、销毁的全过程。

2、容器启动 ----> 实例化 Bean ----> 依赖注入 ----> 初始化前逻辑(BeanPostProcessor)----> 初始化(@PostConstruct/InitializingBean/init-method)----> 初始化后逻辑(BeanPostProcessor)----> 使用 Bean ----> 销毁(@PreDestory/DisposableBean/destroy-method

3、各阶段解析与方法:

阶段描述可插入的自定义方法/接口
实例化容器通过反射创建 Bean 实例,但未设置属性或依赖调用无参构造器创建对象
依赖注入容器将依赖注入到 Bean 的属性中通过依赖注入(例如 @Autowired、@Resource、XML 配置或 Java 配置)将属性注入到 Bean 中
初始化前Bean 实例化和依赖注入后,执行初始化前的一些逻辑实现 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法
初始化执行 Bean 的初始化逻辑@PostConstruct、实现 InitializingBean、配置文件指定的 init-method 方法
初始化后执行初始化后的一些逻辑实现 BeanPostProcessor 接口的 postProcessAfterInitialization 方法
使用 Bean
销毁容器关闭或 Bean 的生命周期结束时,执行销毁逻辑@PreDestroy、实现 DisposableBean、配置文件指定的 destroy-method 方法

三、详细分析生命周期

3.1 ① 初步划分为 5 步:

第一步:实例化 Bean(调用无参数构造方法)
第二步:给 Bean 属性赋值(调用set方法)
第三步:初始化 Bean(会调用 Bean 的 init 方法。注意:这个 init 方法需要自己写)
第四步:使用 Bean
第五步:销毁 Bean(会调用 Bean 的 destroy 方法。注意:这个 destroy 方法需要自己写)

3.1.1 spring 框架中怎么理解

代码测试:spring.xml 版

1、定义一个 Bean:

public class User {private String username;public void setUsername(String username) {System.out.println("第二步:给对象的属性赋值");this.username = username;}public User() {System.out.println("第一步:实例化Bean,无参数构造方法执行了");}// 初始化Bean,需要自己写,自己配,方法名随意public void initBean() {System.out.println("第三步:初始化Bean");}// 销毁Bean,需要自己写,自己配,方法名随意public void destroyBean() {System.out.println("第五步:销毁Bean");}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +'}';}
}

2、spring.xml 中配置:需要在 <bean>标签中 设置 init-methoddestroy-method 属性,手动指定初始化方法和销毁方法!

<bean id="user" class="全类名" init-method="initBean" destroy-method="destroyBean"><!--给属性赋值--><property name="username" value="张三"/>
</bean>

3、开始测试:

@Test
public void test(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = applicationContext.getBean("user", User.class);System.out.println("第四步:使用Bean" + User);// 需要手动关闭Spring容器ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;context.close();

注意:需要手动关闭 Spring 容器(调用close方法),这样 Spring 容器才会销毁 Bean,才会去调用我们定义的 destroyBean 方法

结果:

3.1.2 spring boot 项目中怎么理解

代码测试:spring boot 版(Spring Boot 中没有 xml 怎么配置?)

1、同样定义一个 User(内容不变)

2、启动类

@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);User user = run.getBean(User.class);//属性赋值user.setUsername("张三");//使用beanSystem.out.println("第四步:使用Bean" + user);//关闭容器run.close();}//直接在注解中指明@Bean(initMethod = "initBean", destroyMethod = "destroyBean")public User getUserBean() {return new User();}
}

结果:

为什么?当前的行为是因为属性赋值是手动触发的,而非通过 Spring 的依赖注入机制完成。如果希望严格按照 Spring 生命周期,请确保所有操作都交由 Spring 管理,而不是手动调用属性方法。

  • Spring 在生命周期的 第二步 时(属性赋值),它会使用 依赖注入机制 来完成,但你的 User 类没有定义依赖属性,也没有配置 @Value 或 XML 属性,因此 Spring 不会自动调用 setUsername 方法。
  • 当 Spring 完成了实例化和初始化过程后,你手动调用 setUsername,此时才出现 “第二步” 的输出。

修改:使用 @Value;

3.2 ② 细分 5 步为 7 步:

在以上的5步中,第3步是初始化Bean,如果你还想在初始化前初始化后添加代码,可以编写一个类(这个类叫做 Bean 后处理器)实现BeanPostProcessor接口重写里面的 befor 和 after 方法。

第一步:实例化 Bean
第二步:Bean 属性赋值
第三步:初始化前逻辑
第四步:初始化 Bean
第五步:初始化后逻辑
第六步:使用 Bean
第七步:销毁 Bean

3.2.1 spring 框架中怎么理解

代码测试:spring.xml 版

1、编写类实现接口,重写方法,该方法有两个参数:创建的 Bean 对象、Bean 的名字

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("Bean后处理器的before方法执行,即将开始初始化");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("Bean后处理器的after方法执行,已完成初始化");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

2、在 spring.xml 文件中配置 Bean后处理器(MyBeanPostProcessor)

<bean id="user" class="全类名" init-method="initBean" destroy-method="destroyBean"><!--给属性赋值--><property name="username" value="张三"/>
</bean><!-- 配置Bean后处理器。这个后处理器将作用于当前配置文件中所有的bean。-->
<bean class="MyBeanPostProcessor的全类名"/>

注意:是当前配置文件中所有的 bean。也就是有几个 bean,就会执行几次这个 后处理器,怎么解决?----> 下面会讲

运行结果:

3.2.2 spring boot 项目中怎么理解

代码测试:spring boot 版(Spring Boot 中没有 xml 怎么配置?)

同样:跟 xml 版一样,需要写个类去实现 BeanPostProcessor 接口,然后只需要在类上直接加 @Configuration 注解

注意:也会执行很多次,比如:

原因:这两个方法对 每个注册到容器的 Bean 都会被调用,Spring 容器默认会加载一些内部 Bean,因此输出会多次触发。

解决:加条件判断即可

@Configuration
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof User)System.out.println("Bean后处理器的before方法执行,即将开始初始化");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof User)System.out.println("Bean后处理器的after方法执行,已完成初始化");return bean;}
}

结果:

3.3 ③ 细分 7 步为 10 步:

问:在 Bean 后处理器 before方法之前 干了什么事?

答:检查 Bean 是否实现了 Aware 相关的接口,如果实现了接口则调用这些接口中的方法;调用这些方法的目的是为了给你传递一些数据,让你更加方便使用。

问:在 Bean 后处理器 before方法之后 干了什么事?

答:检查 Bean 是否实现了 InitializingBean 接口,如果实现了,则调用接口中的方法。

问:使用 Bean 之后,或者说 销毁 Bean 之前 干了什么事?

答:检查 Bean 是否实现了 DisposableBean 接口,如果实现了,则调用接口中的方法。

总结: 添加的这三个点位的特点,都是在检查你这个 Bean 是否实现了某些特定的接口,如果实现了这些接口,则 Spring 容器会调用这个接口中的方法!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Aware 相关的接口包括:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

① 当 Bean 实现了 BeanNameAware,Spring 会将 Bean 的名字传递给 Bean。

② 当 Bean 实现了 BeanClassLoaderAware,Spring 会将加载该 Bean 的类加载器传递给 Bean。

③ 当 Bean实现了 BeanFactoryAware,Spring 会将 Bean 工厂对象传递给 Bean。

代码测试:两个版本都一样:只需修改 Bean(User)即可:

public class User implementsBeanNameAware, BeanClassLoaderAware, BeanFactoryAware,InitializingBean, DisposableBean {private String username;@Value("张三")public void setUsername(String username) {System.out.println("第二步:给对象的属性赋值");this.username = username;}public User() {System.out.println("第一步:实例化Bean,无参数构造方法执行了");}// 初始化Bean,需要自己写,自己配,方法名随意public void initBean() {System.out.println("第三步:初始化Bean");}// 销毁Bean,需要自己写,自己配,方法名随意public void destroyBean() {System.out.println("第五步:销毁Bean");}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +'}';}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("类加载器:" + classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("Bean工厂:" + beanFactory);}@Overridepublic void setBeanName(String s) {System.out.println("Bean的名字:" + s);}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean destroy方法执行了");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean afterPropertiesSet方法执行了");}
}

结果:

四、再谈scpoe下bean的管理方式

我们已经知道 Bean 中的 scpoe 就是 Bean 的作用域:

这里结合 Bean 的生命周期再谈 scope。

1、Spring 根据 Bean 的作用域来选择管理方式:

  • 对于 singleton(单例)作用域的 Bean:Spring 能够精确地知道该 Bean 何时被创建、何时初始化完成、以及何时被销毁。

  • 而对于 prototype(多例/原型) 作用域的 Bean:Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。

    Spring 容器关闭,不会销毁类的对象,而是交给 Java 内存回收机制。

4.1 spring 框架中理解

2、测试:spring.xml 版

<!-- 指明scope属性-->
<bean id="user" class="全类名" init-method="initBean" destroy-method="destroyBean" scope="prototype"><!--给属性赋值--><property name="username" value="张三"/>
</bean>

再次测试 10 步的代码,发现:检查 Bean 是否实现了 DisposableBean接口 和 销毁Bean不管了

4.2 spring boot 项目中理解

spring boot 版:只需要在返回对象那里加个注解即可:

@Bean(initMethod = "initBean", destroyMethod = "destroyBean")
@Scope(value = "prototype")
public User getUserBean() {return new User();
}

五 、自己new的对象如何让Spring管理

需求:有些时候可能会遇到这样的需求,某个 java 对象是我们自己手动 new 的,然后希望这个对象被 Spring 容器管理,怎么实现呢?

解决:

  • 创建 DefaultListableBeanFactory 对象!
  • 注册Bean:调用上面创建的对象的 registerSingleton() 方法,把自己创建的对象传进去,并起一个名字!
  • 根据名字,调用 getBean 方法从 Spring 容器当中获取 Bean 对象!

测试:

public class Student {
}
@Test
public void test(){//自己new的对象,没有被spring管理Student student = new Student();System.out.println(student);DefaultListableBeanFactory factory = new DefaultListableBeanFactoru();factory.registerSingleton("studentBean", student);factory.getBean("studentBean", Student.class);System.out.println(studentBean);
}

结果:输出的对象地址一摸一样,说明:获取到的是同一个 Bean 对象,说明确实是把我们创建的对象放到Spring 容器当中进行管理!

相关文章:

Bean的生命周期详解保姆级教程,结合spring boot和spring.xml两种方式讲解,5/7/10大小阶段详细分析

文章目录 Spring Bean的生命周期一、为什么知道 Bean 的生命周期&#xff1f;二、生命周期大致了解三、详细分析生命周期3.1 ① 初步划分为 5 步&#xff1a;3.1.1 spring 框架中怎么理解3.1.2 spring boot 项目中怎么理解 3.2 ② 细分 5 步为 7 步&#xff1a;3.2.1 spring 框…...

2024年11月26日Github流行趋势

项目名称&#xff1a;v2rayN 项目维护者&#xff1a;2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍&#xff1a;一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数&#xff1a;70,383 项目fork数&#xff1a;11,602 项目名称&#xff1a;fre…...

分页/列表分页

分页和单列表差不多,只是多加了点数据 一 : 实体类 1. 原生实体类 和 2.vo实体类 vo实体类包含原生实体类的所有字段 再新字段 原生(数据库里的字段) vo(多条件查询字段 ,分页字段) 分页字段 : private Integer pageNum1 //起始页 private Integer pageSize 4 //显示页数…...

微信小程序学习指南从入门到精通

&#x1f5fd;微信小程序学习指南从入门到精通&#x1f5fd; &#x1f51d;微信小程序学习指南从入门到精通&#x1f51d;✍前言✍&#x1f4bb;微信小程序学习指南前言&#x1f4bb;一、&#x1f680;文章列表&#x1f680;二、&#x1f52f;教程文章的好处&#x1f52f;1. ✅…...

STM32外设应用

STM32系列单片机是由意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M内核的32位微控制器。STM32以其高性能、低功耗、丰富的外设接口以及灵活的应用场景,广泛应用于嵌入式系统中。STM32的外设功能非常强大,几乎涵盖了大多数常见嵌入式开发所需的硬件接口。本篇文…...

Vue进阶面试题目(一)

Vue 自定义事件中&#xff0c;父组件如何接收子组件传递的多个参数? 在 Vue 中&#xff0c;子组件可以通过 $emit 方法触发自定义事件&#xff0c;并传递参数。父组件可以通过监听这个事件来接收参数。如果子组件需要传递多个参数&#xff0c;可以将这些参数作为数组或对象传…...

人工智能——大语言模型

5. 大语言模型 5.1. 语言模型历史 20世纪90年代以前的语言模型都是基于语法分析这种方法&#xff0c;效果一直不佳。到了20世纪90年代&#xff0c;采用统计学方法分析语言&#xff0c;取得了重大进展。但是在庞大而复杂的语言信息上&#xff0c;基于传统统计的因为计算量巨大…...

每天五分钟机器学习:支持向量机数学基础之超平面分离定理

本文重点 超平面分离定理(Separating Hyperplane Theorem)是数学和机器学习领域中的一个重要概念,特别是在凸集理论和最优化理论中有着广泛的应用。该定理表明,在特定的条件下,两个不相交的凸集总可以用一个超平面进行分离。 定义与表述 超平面分离定理(Separating Hy…...

树链剖分(重链剖分)

树链剖分的核心思想就是将一棵树剖分成一条一条的链 因为树不好处理 但链比较好处理 为了学会它 我们先要学会树上dfs&#xff08;深度优先搜索&#xff09; 然后就没了&#xff08;雾&#xff09; Because 树链剖分需要用到两个dfs 哦对了 我们还要了解以下的知识点 1.子…...

Spring Boot 开发环境搭建及示例应用

文章目录 1. 准备开发工具安装 JDK安装 IDE安装 Maven 2. 创建 Spring Boot 项目使用 Spring Initializr 创建项目导入项目到 IDE 3. 编写代码主类创建控制器创建实体类创建仓库接口创建服务类创建控制器 4. 配置文件5. 运行应用程序6. 测试应用程序7. 调试与优化8. 部署应用 1…...

网站布局编辑器前端开发:设计要点与关键考量

一、设计说明 &#xff08;一&#xff09;功能模块 可视化操作区域 这是用户进行网站布局设计的主要画布。通过拖放各种页面元素&#xff08;如文本框、图片、按钮、导航栏等&#xff09;到该区域&#xff0c;用户能够直观地构建网站页面的布局结构。支持对元素的实时缩放、旋…...

网络编程第一课

0voice第一课 https://github.com/0voice 今日学习&#xff1a;网络通信IO 网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似&#xff0c;在c语言中&#xff0c;通过fopen、fclose、fread、fwrite实现了对文件的操作&#xff0c;socket…...

关于网络安全攻防知识

DNS 劫持 什么是DNS劫持&#xff1f; DNS劫持又叫域名劫持&#xff0c;&#xff08;劫持了路由器或域名服务器等&#xff09;&#xff0c;篡改了域名的解析结果&#xff0c;使得指向该域名的IP指向IP&#xff0c;你想访问正经网站结果给你跳到一个不正经的网站&#xff0c;实现…...

途普科技企业知识中台完成华为昇思MindSpore技术认证

近日&#xff0c;北京途普科技有限公司&#xff08;以下简称“途普科技”&#xff09;作为华为昇腾大模型方向的应用软件伙伴&#xff0c;核心产品企业知识中台已成功与华为AI框架昇思MindSpore完成相互兼容性认证。这一成就标志着途普科技在AI领域与华为的合作进一步加深&…...

等保测评在云计算方面的应用讲解

等保测评&#xff08;信息安全等级保护测评&#xff09;在云计算方面的应用主要聚焦于如何满足等级保护相关要求&#xff0c;并确保云计算平台及其上运行的业务系统的安全性。以下是主要内容的讲解&#xff1a; 1. 云计算中的等保测评概述 等保测评是在我国网络安全等级保护制…...

【PTA】【数据库】【SQL命令】编程题2

数据库SQL命令测试题2 测试题目录 10-1 查询“李琳”老师所授课程的课程名称10-2 查询成绩比所有课程的平均成绩高的学生的学号及成绩10-3 创建带表达式的视图StuView10-4 从视图PerView中查询数据10-5 查询工资高于在“HR”部门工作的所有员工的工资的员工信息10-6 查询选修的…...

flask请求头回显的学习和探究如何进行错误页面污染回显

请求头 首先我们要了解一些flask的请求和响应是利用了什么。 flask的请求和响应主要利用了werkzeug&#xff0c;那么我们就要先了解一下什么是werkzeug&#xff0c;其结构又是什么。 werkzeug是一个基于python开发的一个web工具包&#xff0c;其是flask的核心组件之一。其功能…...

Node.js的url模块与querystring模块

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 4.3.1 http模块——创建HTTP服务器、客户端 要使用http模块&#xff0…...

Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂

一、自定义线程工厂 自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口&#xff0c;重写newThread方法。 示例代码&#xff1a; package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory; import java.util.conc…...

自动化的内存管理技术之垃圾回收机制-JavaScript引用数据内存回收机制

垃圾回收机制&#xff08;Garbage Collection, GC&#xff09; 是一种自动化的内存管理技术&#xff0c;用于回收程序中不再使用的内存空间&#xff0c;避免内存泄漏。JavaScript&#xff08;尤其是 V8 引擎&#xff09;使用了一些经典的垃圾回收算法&#xff0c;如 标记-清除 …...

如何使用MySQL实现多租户架构:设计与实现全解析

项目背景 在现代SaaS&#xff08;软件即服务&#xff09;应用中&#xff0c;多租户架构是一种常见的设计模式。多租户架构能够让多个客户&#xff08;租户&#xff09;共享同一个应用实例和数据库资源&#xff0c;而不会相互干扰。在实际的业务场景中&#xff0c;采用多租户架…...

Flink学习连载文章8--时间语义

Time的分类 (时间语义) EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间 IngestionTime:摄入时间,是事件/数据到达流处理系统的时间 ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间 EventTime的重要性 假设&#xff0c;你正在去往地下停…...

jvm核心组件介绍

1. 类加载器&#xff08;ClassLoader&#xff09;&#xff1a; • 想象它是一个快递员&#xff0c;负责把Java类&#xff08;.class文件&#xff09;这个“包裹”从磁盘这个“发货地”送到JVM内部这个“目的地”。类加载器确保每个类只被加载一次&#xff0c;并维护一个类的层级…...

【WEB开发.js】getElementById :通过元素id属性获取HTML元素

getElementById 是 JavaScript 中常用的一个 DOM 方法&#xff0c;用于通过元素的 id 属性获取文档中对应的 HTML 元素。这个方法返回的是一个包含该元素的引用&#xff0c;如果没有找到指定的元素&#xff0c;则返回 null。 语法&#xff1a; document.getElementById(id);i…...

java基础知识(Math类)

引入&#xff1a;Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根 import java.util.Math 1.abs绝对值 int abs Math.abs(-9); 2.pow求幂 double pow Math.pow(2,4); 3.向上取整 double ceil Math.ceil(3.9);//ceil 4 4.向下取整 dou…...

图像分割——区域增长

一 区域增长 图像灰度阈值分割技术都没有考虑到图像像素空间的连通性。区域增长法则正好相反,顾及像素的连接性. 方法&#xff1a;1&#xff09;选择一个或一组种子&#xff1b; 2&#xff09;选择特征及相似性判决准则&#xff1b; 3&#xff09;从该种子开始向外生长&#x…...

JavaScript中的构造函数(工厂函数)以及部分包装类

创建对象 1.1 工厂函数 我们来思考一个问题&#xff1a;如果需要在开发中创建一系列的相似对象&#xff0c;我们应该如何操作呢 比如下面的例子 游戏中创建一系列的英雄&#xff08;英雄具备的特性是相似的&#xff0c;比如都有名字&#xff0c;技能&#xff0c;价格&#xff…...

三维地形图计算软件(三)-原基于PYQT5+pyqtgraph旧代码

最先入手设计三维地形图及平基挖填方计算软件时&#xff0c;地形图的显示方案是&#xff1a;三维视图基于pyqtgraph.opengl显示和二维视图基于pyqtgraph的PlotWidget来显示地形地貌&#xff0c;作到一半时就发现&#xff0c;地形点过多时&#xff0c;将会造成系统卡顿(加载时主…...

MATLAB 中有关figure图表绘制函数设计(论文中常用)

在撰写论文时&#xff0c;使用 MATLAB 导出的图像常常因大小和格式不统一&#xff0c;导致投稿时编辑部频繁退稿&#xff0c;要求修改和调整。这不仅浪费时间&#xff0c;也增加了工作量。为了减少这些麻烦&#xff0c;可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...

Android adb shell dumpsys audio 信息查看分析详解

Android adb shell dumpsys audio 信息查看分析详解 一、前言 Android 如果要分析当前设备的声音通道相关日志&#xff0c; 仅仅看AudioService的日志是看不到啥日志的&#xff0c;但是看整个audio关键字的日志又太多太乱了&#xff0c; 所以可以看一下系统提供的一个调试指令…...

网络工具-nc(Netcat)

介绍 nc&#xff08;Netcat&#xff09;是一个功能强大的网络工具&#xff0c;通常被称为“网络中的瑞士军刀”。它能够进行网络调试、分析以及简单的服务器和客户端操作。nc 支持多种协议&#xff0c;尤其是 TCP 和 UDP&#xff0c;广泛用于网络诊断、端口扫描、数据传输等任…...

8:00面试,8:06就出来了,问的问题有点变态。。。

在职业生涯的旅途中&#xff0c;我们总会遇到各种意想不到的挑战和转折。我从一家小公司跳槽至另一家公司&#xff0c;原以为能够迎接全新的工作环境和机遇&#xff0c;却未曾料到&#xff0c;等待我的是一场职场风暴。 新公司的加班文化让我倍感压力&#xff0c;虽然薪资诱人…...

【前端】ES6基础

1.开发工具 vscode地址 :https://code.visualstudio.com/download, 下载对应系统的版本windows一般都是64位的 安装可以自选目录&#xff0c;也可以使用默认目录 插件&#xff1a; 输入 Chinese&#xff0c;中文插件 安装&#xff1a; open in browser&#xff0c;直接右键文件…...

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…...

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元&#xff1a;httpx库的崛起**第一部分&#xff1a;背景介绍第二部分&#xff1a;httpx库是什么&#xff1f;第三部分&#xff1a;如何安装httpx库&#xff1f;第四部分&#xff1a;简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...

25A物联网微型断路器 智慧空开1P 2P 3P 4P-安科瑞黄安南

微型断路器&#xff0c;作为现代电气系统中不可或缺的重要组件&#xff0c;在保障电路安全与稳定运行方面发挥着关键作用。从其工作原理来看&#xff0c;微型断路器通过感知电流的异常变化来迅速作出响应。当电路中的电流超过预设的安全阈值时&#xff0c;其内部的电磁感应装置…...

openjudge- 简单英文题【12:Maximum Product of Sequence】

题目 12:Maximum Product of Sequence 总时间限制: 1000ms 内存限制: 65536kB 描述 Find a sequence of M positive numbers with the maximum product, while the sum of them is N. 输入 Two positive integers M (M < 10) and N (N < 100). 输出 One line contains …...

网络安全风险评估

项目背景 随着信息化技术的快速发展&#xff0c;特别是面向社会、政府机构、企业等业务系统的投入使用&#xff0c;各组织机构对网络和信息系统安全防护都提出了新的要求。为满足安全需求&#xff0c;需对组织机构的网络和信息系统的安全进行一次系统全面的评估&#xff0c;以…...

微信小程序 WXS 的概念与基本用法教程

微信小程序 WXS 的概念与基本用法教程 引言 在微信小程序的开发中,WXS(WeiXin Script)是一种特殊的脚本语言,旨在解决小程序在逻辑处理和数据处理上的一些限制。WXS 允许开发者在小程序的 WXML 中嵌入 JavaScript 代码,以便实现更复杂的逻辑处理。本文将深入探讨 WXS 的…...

绪论相关题目

1.在数据结构中,从逻辑上可以把数据结构分成( C)。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结构和非线性结构 D. 内部结构和外部结构 2.在数据结构中,从存储结构上可以将之分为( B)。 A. 动态结构和静态结构 B. 顺序存储和非顺序存储 C. 紧凑结构和非紧…...

【Linux】基础IO-文件描述符

【Linux】基础IO C语言的文件接口文件的初步理解文件IO的系统接口打开文件writeread 文件描述符fd语言层的fd文件描述符的分配规则重定向和缓冲区的理解重定向缓冲区作用刷新策略C语言的缓冲区 模拟实现重定向检查是否是重定向执行命令 0、1、2的作用 C语言的文件接口 这里我们…...

IDEA2024创建一个spingboot项目

以下是创建一个基本的 Spring Boot 项目的步骤和示例&#xff1a; 初始化一个springboot工程其实有许多方法&#xff0c;笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台&#xff08;start.spring.io&#xff09;进行配置&#xff0c;然后下载压缩包就可以获取…...

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…...

OpenCV相机标定与3D重建(5)鱼眼镜头畸变校正的函数estimateNewCameraMatrixForUndistortRectify()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 估计用于去畸变或校正的新相机内参矩阵。 cv::fisheye::estimateNewCameraMatrixForUndistortRectify 是 OpenCV 中用于鱼眼镜头畸变校正的一个函…...

RabbitMQ入门

目录 MQ 相关概念 什么是MQ MQ 的作用 什么是RabbitMQ RabbitMQ的安装 安装 erlang 安装 RabbitMQ 安装 RabbitMQ 管理界面 开放云服务器端口 访问 RabbitMQ 管理界面 RabbitMQ 的用户角色 RabbitMQ的工作流程 Producer 和 Consumer Connection 和 Channel Vi…...

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis 缓存 流程图&#xff1a; data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们的单体项目中可以用Map作…...

英伟达发布 Edify 3D 生成模型,可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。

英伟达发布 Edify 3D 生成模型&#xff0c;可以利用 Agents 自动判断提示词场景中需要的模型&#xff0c;生成后将他们组合为一个场景。 Edify 3D 可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。 相关链接 论文&#xff1a;htt…...

数字电路——触发器2(集成触发器,相互转化)

集成触发器基于RS触发器和钟控触发器&#xff0c;想要了解可以参考文章RS和钟控触发器。 一、集成触发器 这里介绍的集成触发器是将其他类型的触发器与RS触发器相结合 1.1 集成D触发器 1.逻辑符号 区分同步和异步工作&#xff1a; 当同步时&#xff0c;和都为1&#xff0c;…...

拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流

在前端开发的世界里&#xff0c;我们总是在不断追寻更高效、更简洁的方式来构建令人惊艳的用户界面。而今天&#xff0c;我要向大家隆重介绍一款具有创新性的工具 ——NoCss.js&#xff0c;它将彻底颠覆你对传统前端开发的认知&#xff0c;引领我们进入一个全新的无 CSS 编程时…...

CentOS 7 安装部署 KVM

1.关闭虚拟机 打开相关选项 打开虚拟机centos7 连接xshell 测试网络&#xff0c;现在就是没问题的&#xff0c;因为我们要使用网络源 安装 GNOME 桌面环境 安装KVM 模块 安装KVM 调试工具 构建虚拟机的命令行工具 qemu 组件,创建磁盘、启动虚拟机等 输入这条命令&#xff0c;…...