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

Spring |(二)IoC相关内容 | bean

文章目录

  • 📚bean基础配置
    • 🐇bean的id和class
    • 🐇bean的name属性
    • 🐇bean作用范围scope配置
    • 🐇bean基础配置小结
  • 📚bean实例化
    • 🐇构造方法实例化(常用)
    • 🐇静态工厂实例化
    • 🐇实例工厂与FactoryBean
  • 📚bean的生命周期
    • 🐇生命周期设置
    • 🐇销毁操作未调用解决方法
    • 🐇Spring提供的生命周期控制接口

学习来源:黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术

📚bean基础配置

🐇bean的id和class

  • id:使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
  • class:bean的类型,即配置的bean的全路径类名
    在这里插入图片描述

🐇bean的name属性

  • name属性,定义bean的别名,可定义多个,使用逗号、分号、空格分隔。
    在这里插入图片描述

  • 配置别名:打开spring的配置文件applicationContext.xml。

    <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
    <bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao"/>
    </bean>
    
  • 根据名称容器获取bean对象(对应名称必须在spring配置文件中存在)

    public class AppForName {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//此处根据bean标签的id属性和name属性的任意一个值来获取bean对象BookService bookService = (BookService) ctx.getBean("service4");bookService.save();}
    }
    

🐇bean作用范围scope配置

  • 验证思路:同一个bean获取两次,将对象打印到控制台,看打印出的地址值是否一致。

    BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
    BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
    System.out.println(bookDao1);
    System.out.println(bookDao2);
    

    打印结果:
    在这里插入图片描述

  • 默认情况下,Spring创建的bean对象都是单例的。

  • 在Spring配置文件中,配置scope属性来实现bean的非单例创建。

    <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope=""/>
    
    • 将scope设置为singleton
      在这里插入图片描述
    • 将scope设置为prototype
      在这里插入图片描述
  • bean默认为单例? bean为单例是指在Spring的IoC容器中只会有该类的一个对象。这避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高。

  • 线程安全问题?

    • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据,那所有请求线程共用一个bean对象会存在线程安全问题。
    • 如果对象是无状态对象,即该对象没有成员变量进行数据存储的,方法中的局部变量在方法调用完成后会被销毁,不会存在线程安全问题。
  • 表现层对象、业务层对象、数据层对象、工具对象适合交给容器进行管理。

  • 封装实例的域对象,因为会引发线程安全问题,不适合交给容器进行管理。

🐇bean基础配置小结

在这里插入图片描述

📚bean实例化

以下涉及到的project结构如下:
在这里插入图片描述

🐇构造方法实例化(常用)

  • bean本质上就是对象,对象在new的时候会使用构造方法完成,创建bean也是使用构造方法完成的。
  • 步骤1:准备一个BookDao和BookDaoImpl类,即【提供可访问的构造方法】。
    public interface BookDao {public void save();
    }public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}}
    
  • 步骤2:将类【配置】到Spring容器
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--方式一--><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/></beans>
    
  • 步骤3:编写运行程序
    public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    
  • Spring容器在创建对象的时候走的是类的无参构造方法,且底层用的是反射,能访问类中的私有构造方法。真正在使用这种方式的时候,我们什么也不需要做。

🐇静态工厂实例化

  • 步骤1:准备一个OrderDao和OrderDaoImpl类。
    public interface OrderDao {public void save();
    }public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
    }
    
  • 步骤2:创建一个工厂类OrderDaoFactory并提供一个【静态方法】。
    //静态工厂创建对象
    public class OrderDaoFactory {public static OrderDao getOrderDao(){return new OrderDaoImpl();}
    }
    
  • 步骤3:在spring的【配置】文件application.properties中添加以下内容↓
    <!--方式二-->
    <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
    
    在这里插入图片描述
  • 步骤4:在AppForInstanceOrder运行类,使用从IoC容器中获取bean的方法进行运行测试
    public class AppForInstanceOrder {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
    }
    

  • 静态工厂方法的意义?
    • 主要的原因是在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,这些操作必不可少(直接new对象的方式就无法添加其他的业务内容),比如:
      public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println("factory setup....");//模拟必要的业务操作return new OrderDaoImpl();}
      }
      
  • 静态工厂实例化一般是用来兼容早期的一些老系统,所以了解为主

🐇实例工厂与FactoryBean

  • 步骤1:准备一个UserDao和UserDaoImpl类。
    public interface UserDao {public void save();
    }public class UserDaoImpl implements UserDao {public void save() {System.out.println("user dao save ...");}
    }
    
  • 步骤2:创建一个【实例工厂】类OrderDaoFactory并提供一个普通方法(注意此处和静态工厂的工厂类不一样的是不是静态方法)。
    public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
    }
    
  • 步骤3:在spring的【配置】文件中添加以下内容↓
    <!--方式三-->
    <bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
    
    在这里插入图片描述
  • 步骤4:在AppForInstanceUser运行类,使用从IoC容器中获取bean的方法进行运行测试。
    public class AppForInstanceUser {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");userDao.save();}
    }
    

  • 以上就是实例工厂实例化的方式,Spring为了简化这种配置方式提供了一种叫FactoryBean的方式来简化开发。
    在这里插入图片描述

  • 步骤1:【创建一个UserDaoFactoryBean的类】,【实现FactoryBean接口】,重写接口的方法。

    public class UserDaoFactoryBean implements FactoryBean<UserDao> {//【代替】原始实例工厂中创建对象的方法public UserDao getObject() throws Exception {return new UserDaoImpl();}//返回所创建类的Class对象public Class<?> getObjectType() {return UserDao.class;}
    }
    
    • 这里造出的对象【默认是单例】的,如果要改成非单例,则加上下
      public boolean isSingleton() {return false;
      }
      
  • 步骤2:在Spring的配置文件中进行配置。

    <!--方式四-->
    <bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
    
  • 步骤3:AppForInstanceUser运行类不用做任何修改,直接运行。


在这里插入图片描述

📚bean的生命周期

⭐️下述内容涉及到的环境配置↓
在这里插入图片描述

  1. 项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类。
    public interface BookDao {public void save();
    }public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}
    }public interface BookService {public void save();
    }public class BookServiceImpl implements BookService{private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void save() {System.out.println("book service save ...");bookDao.save();}
    }
    
  2. resources下提供spring的配置文件。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    </beans>
    
  3. 编写AppForLifeCycle运行类,加载Spring的IoC容器,并从中获取对应的bean对象。
    public class AppForLifeCycle {public static void main( String[] args ) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    

🐇生命周期设置

  • 生命周期:从创建到消亡的完整过程。
  • 在上面这个环境中来为BookDao添加生命周期的控制方法,具体的控制有两个阶段:
    • bean创建之后,想要添加内容,比如用来初始化需要用到资源。
    • bean销毁之前,想要添加内容,比如用来释放用到的资源。
  • 步骤1:添加初始化和销毁方法。在BooDaoImpl类中分别添加两个方法(方法名任意)。
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}//表示bean初始化对应的操作public void init(){System.out.println("init...");}//表示bean销毁前对应的操作public void destory(){System.out.println("destory...");}
    }
    
  • 步骤2:配置生命周期。
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
    
  • 步骤3:AppForLifeCycle.java运行。
    public class AppForLifeCycle {public static void main( String[] args ) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    
  • 运行AppForLifeCycle打印结果为:
    在这里插入图片描述
  • init方法执行了,但是destroy方法却未执行?
    • Spring的IoC容器是运行在JVM中。
    • 运行main方法后,JVM启动,Spring加载配置文件生成IoC容器,从容器获取bean对象,然后调方法执行。
    • main方法执行完后,JVM退出,这个时候IoC容器中的bean还没有来得及销毁就已经结束了,所以没有调用对应的destroy方法。

🐇销毁操作未调用解决方法

  • 方法一】:close()关闭容器

    public class AppForLifeCycle {public static void main( String[] args ) {//ApplicationContext中没有close方法,将ApplicationContext更换成ClassPathXmlApplicationContextClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//关闭容器(这句话一出现就直接暴力关闭)ctx.close();}
    }
    

    在这里插入图片描述

  • 方法二】:注册钩子关闭容器,registerShutdownHook()。在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器。

    public class AppForLifeCycle {public static void main( String[] args ) {//registerShutdownHook在ApplicationContext中也没有ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器(这句代码可以往后放,位置放哪不影响)ctx.registerShutdownHook();BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    

    在这里插入图片描述

  • 👀比较上述两种方法

    • 相同点:这两种都能用来关闭容器。
    • 不同点:close()是在调用的时候关闭,registerShutdownHook()是在JVM退出前调用关闭。

🐇Spring提供的生命周期控制接口

  • Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-methoddestroy-method
  • 在BookServiceImpl完成这两个接口的使用:修改BookServiceImpl类,添加两个接口InitializingBeanDisposableBean并实现接口中的两个方法afterPropertiesSetdestroy
    public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void save() {System.out.println("book service save ...");bookDao.save(); }public void destroy() throws Exception {System.out.println("service destroy");}public void afterPropertiesSet() throws Exception {System.out.println("service init");}
    }
    
  • 重新运行AppForLifeCycle类↓
    在这里插入图片描述

⭐️小细节

  • 对于InitializingBean接口中的afterPropertiesSet方法,翻译过来为属性设置之后,对于BookServiceImpl来说,bookDao是它的一个属性,setBookDao方法是Spring的IoC容器为其注入属性的方法。
  • 思考:afterPropertiesSet和setBookDao谁先执行?
    • 验证——在setBookDao方法中添加一句话↓
      public void setBookDao(BookDao bookDao) {System.out.println("set .....");this.bookDao = bookDao;
      }
      
    • 重新运行AppForLifeCycle,打印结果如下↓
      在这里插入图片描述
    • 所以初始化方法会在类中属性设置之后执行。

⭐️对于bean的生命周期控制在bean的整个生命周期中所处的位置如下
在这里插入图片描述

相关文章:

Spring |(二)IoC相关内容 | bean

文章目录 &#x1f4da;bean基础配置&#x1f407;bean的id和class&#x1f407;bean的name属性&#x1f407;bean作用范围scope配置&#x1f407;bean基础配置小结 &#x1f4da;bean实例化&#x1f407;构造方法实例化&#xff08;常用&#xff09;&#x1f407;静态工厂实例…...

flux的版本

1.flux1-dev.safetensors https://huggingface.co/black-forest-labs/FLUX.1-devhttps://huggingface.co/black-forest-labs/FLUX.1-dev原生的23.8G的模型。原生12B的模型,float16的。需要配合ae.safetensors,flux1-dev.safetensors以及clip-l和T5的权重使用,注意ae.sft和f…...

基于Springboot+Vue的房屋系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...

【Bluedroid】A2DP SINK播放流程源码分析

在Bluedroid协议栈中,A2DP(Advanced Audio Distribution Profile)SINK播放流程是一个复杂但有序的过程,它涉及多个层次和组件的交互。 一、概述 1.1. 初始化流程 在A2DP SINK播放之前,系统需要进行一系列初始化操作,以确保A2DP SINK服务能够正确运行。这些操作包括启动…...

【什么是Redis?】

Redis&#xff1a;高性能内存数据库的深度探索 在当今这个数据驱动的世界里&#xff0c;数据库的选择直接关系到应用程序的性能、可扩展性和可靠性。在众多数据库解决方案中&#xff0c;Redis以其卓越的性能、丰富的数据结构和灵活的使用场景脱颖而出&#xff0c;成为众多开发…...

TCL大数据面试题及参考答案

Mysql 索引失效的场景 对索引列进行运算或使用函数:当在索引列上进行数学运算、函数操作等,索引可能失效。例如,在存储年龄的列上建立了索引,若查询语句是 “SELECT * FROM table WHERE age + 1 = 20”,这里对索引列 age 进行了加法运算,数据库会放弃使用索引而进行全表扫…...

提高总线数据传输率

提高总线数据传输率是一个涉及多个方面的技术问题&#xff0c;以下是一些有效的方法&#xff1a; 一、提高总线时钟频率 总线时钟频率是影响总线传输速率的重要因素之一。通过提高总线时钟频率&#xff0c;可以缩短每个时钟周期的时间&#xff0c;从而在相同的时间内传输更多…...

_FYAW智能显示控制仪表的简单使用_串口通信

一、简介 该仪表可以实时显示位移传感器的测量值&#xff0c;并可设定阈值等。先谈谈简单的使用方法&#xff0c;通过说明书&#xff0c;我们可以知道长按SET键可以进入参数选择状态&#xff0c;按“↑”“↓”可以选择该组参数的上一个或者下一个参数。 从参数一览中可以看到有…...

图的遍历。

图的遍历这一部分&#xff0c;离不开广度优先和深度优先&#xff0c;如果大家已经学过搜索算法的话&#xff0c;这部分将是易如反掌。 万能搜索算法-CSDN博客 文章中不会提太多离散数学中图的专有名词&#xff0c;因为本篇博客只涉及最简单的图的遍历&#xff0c;故以练习题为主…...

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…...

IT资产管理工具-NetBox

IT资产管理工具-NetBox 推荐一款IT资产管理工具 了解推荐阅读官方中文文档 https://docs.wangluohe.com/introduction/ 硬件要求 ​ - 建议4Core 8G以上&#xff0c;100G存储空间 这里我使用的Linux镜像为 CentOS8-Stream 提前关闭Selinux和防火墙 部署NetBox 一&#…...

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网&#xff1a;控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…...

AWTK 最新动态:支持鸿蒙系统(HarmonyOS Next)

HarmonyOS是全球第三大移动操作系统&#xff0c;有巨大的市场潜力&#xff0c;在国产替代的背景下&#xff0c;机会多多&#xff0c;AWTK支持HarmonyOS&#xff0c;让AWTK开发者也能享受HarmonyOS生态的红利。 AWTK全称为Toolkit AnyWhere&#xff0c;是ZLG倾心打造的一套基于C…...

React基础知识一

写的东西太多了&#xff0c;照成csdn文档编辑器都开始卡顿了&#xff0c;所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。&#xff08;没使用jsx可以不装&#xff09;1.1 在html中…...

Oracle热备过程中对数据库崩溃的处理方法

引言 在热备过程中如果发生数据库崩溃、断电等情况该如何处理? 如果正在备份 users 表空间的数据文件过程中,此时的数据文件表头 SCN 会被锁定,此时正在复制数据文件时数据库崩溃,系统断电。 从而导致数据文件表头与控制文件中的不一致,导致数据库无法打开,会要求介质恢…...

身份证实名认证API接口助力电商购物安全

亲爱的网购达人们&#xff0c;你们是否曾经因为网络上的虚假信息和诈骗而感到困扰&#xff1f;在享受便捷的网购乐趣时&#xff0c;如何确保交易安全成为了我们共同关注的话题。今天&#xff0c;一起来了解一下翔云身份证实名认证接口如何为电子商务保驾护航&#xff0c;让您的…...

win10 禁止更新

一、winR 输入 regedit 二、输入注册列表路径&#xff1a; &#xff08;1&#xff09;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings &#xff08;2&#xff09;按照格式&#xff0c;创建文件命名: FlightSettingsMaxPauseDays &#xff08;3&…...

运维百科:网络性能20大关键指标

网络性能评估是确保网络服务质量和用户体验的关键环节。在网络、运维领域中&#xff0c;存在着一系列关键的性能指标&#xff0c;共同构成了衡量网络性能的基础。以下是网络性能的20大关键指标&#xff0c;每个指标都承载着特定的意义和重要性。 1.速率&#xff08;Rate&#…...

java编程开发基础,正则表达式的使用案例Demo

java编程开发基础,正则表达式的使用案例Demo!实际开发中&#xff0c;经常遇到一些字符串&#xff0c;信息的裁剪和提取操作&#xff0c;正则表达式是经常使用的&#xff0c;下面的案例&#xff0c;可以帮助大家快速的了解和熟悉&#xff0c;正则表达式的使用技巧。 package com…...

结构控制

目录​​​​​​​ 1.顺序结构 2.分支结构 2.1.单分支结构 2.2.二分支结构 2.3.多分支结构 2.4.嵌套分支结构 3.循环结构 3.1.while 循环结构 3.2.while...else 循环结构 PS&#xff1a;break 关键字 PS&#xff1a;pass 关键字 3.3.for 循环结构 PS&#xff1a;…...

Go语言中的内存分配与初始化:new与make函数详解

在Go语言中&#xff0c;内存分配和初始化是编程的基础操作。Go提供了两个内置函数new和make&#xff0c;用于不同场景下的内存分配和初始化。理解这两个函数的区别和适用场景对于编写高效、安全的Go代码至关重要。本文将详细介绍new和make函数&#xff0c;并提供示例说明它们的…...

The 2024 ICPC Kunming Invitational Contest

VP链接&#xff1a;https://codeforces.com/gym/105386 B. Gold Medal 签到题。对每一个读入的数 a&#xff0c;先记录已有奖牌数量&#xff0c;即 &#xff0c;再将 a 对 k 取模。然后将 a 数组从大到小排序&#xff0c;将每个不足 k 的数补到 k。如果 m 有剩余&#xff0c;…...

对原jar包解压后修改原class文件后重新打包为jar

文章目录 背景三种修改方式1.POM中移除原jar中依赖的历史版本2.原jar它不使用pom依赖而是直接放在源码中再编译使用JarEditor 插件对源码进行修改(推荐)使用java-decompiler反编译后修改源码覆盖原class&#xff08;不好用-不推荐直接跳过&#xff09;提醒 参考资料-推荐阅读拓…...

【C++】ReadFile概述,及实践使用时ReadFile的速率影响研究

ReadFile 函数概述 ReadFile 是 Windows API 函数&#xff0c;用于从文件或设备&#xff08;如串口、硬盘等&#xff09;中读取数据。它是同步和异步 I/O 操作的基础函数。 函数原型 BOOL ReadFile(_In_ HANDLE hFile, // 文件或设备句柄_Out_write…...

WebGL进阶(十一)层次模型

理论基础&#xff1a; 效果&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…...

Django:从入门到精通

一、Django背景 Django是一个由Python编写的高级Web应用框架&#xff0c;以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发&#xff0c;旨在简化Web应用的开发过程。作为一个开放源代码项目&#xff0c;Django迅速吸引了大量的开发…...

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…...

Perfetto学习大全

Perfetto 是一个功能强大的性能分析和追踪工具&#xff0c;主要用于捕获和分析复杂系统中的事件和性能数据&#xff0c;特别是在 Android 和 Linux 环境下。它的核心目标是帮助开发者深入了解系统和应用程序的运行状态&#xff0c;以便优化性能和诊断问题。 Perfetto的主要作用…...

管家婆财贸ERP BR040.销售单明细表变更

最低适用版本&#xff1a; C系列 23.8 插件简要功能说明&#xff1a; 销售明细表支持直接修改单据自由项1-16更多细节描述见下方详细文档 插件操作视频&#xff1a; 进销存类定制插件--销售单明细表变更 1. 应用中心增加菜单【销售单明细表变更】 a. 复制23.8版本销售单明细…...

2411rust,实现特征

原文 在Rust2024中,impl Trait在中位置的默认工作方式有了变化.是为了简化impl Trait,以更好地匹配人们一般的需求. 还添加了一个灵活的语法,让你需要时可完全控制. 从Rust2024开始,一直在更改,何时可在返回位置impl Trait的隐藏类型中使用泛型参数的规则: 1,即对返回位置i…...

SpringBoot3与JUnit5集成测试

你可以在 Spring Boot 3 中轻松设置和运行 JUnit 集成测试。合理使用 Spring 提供的注解和工具&#xff0c;可以确保测试的高效性和可靠性。以下是集成测试的步骤和示例&#xff1a; 1. 添加依赖 在 pom.xml 中添加 Spring Boot Starter Test 依赖&#xff0c;它包含 JUnit 5 …...

工程企业需要什么样的物资管理系统?为什么需要物资管理系统?

一、背景与意义 在工程项目的建设中&#xff0c;无论是高楼大厦的拔地而起&#xff0c;还是高速公路的绵延铺展&#xff0c;物资都是最基础的要素之一。从钢筋水泥到施工机械&#xff0c;任何一种物资的管理不善都可能导致项目延误、成本超支&#xff0c;甚至质量问题。然而&a…...

Vue + Websocket播放PCM(base64转ArrayBuffer、 字符串转ArrayBuffer)

文章目录 引言I 音视频处理相关概念和APIII 案例:基于开源库 pcm-player方式播放借助MediaSource和Audio对象播放音频流。基于原生api AudioContext 播放操作III 格式转换js字符串转ArrayBufferbase64 转 ArrayBufferIV 解决pcm-player分片播放问题引言 需求: 基于webscoket传…...

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…...

Mesh路由组网

Mesh无线网格网络&#xff0c;多跳&#xff08;multi-hop&#xff09;网络&#xff0c;为解决全屋覆盖信号&#xff0c;一般用于家庭网络和小型企业 原理 网关路由器&#xff08;主路由&#xff0c;连接光猫&#xff09;&#xff0c;Mesh路由器&#xff08;子路由&#xff0c;…...

【数据结构】七种常用排序总结

一、七种排序及其讲解 以下为七种排序的讲解&#xff1a; 【数据结构】插入排序——直接插入排序 和 希尔排序 【数据结构】选择排序——选择排序 和 堆排序 【数据结构】交换排序——冒泡排序 和 快速排序 【数据结构】归并排序 —— 递归及非递归解决归并排序 二、排序的…...

【在Linux世界中追寻伟大的One Piece】多线程(一)

目录 1 -> Linux线程概念 1.1 -> 什么是线程 1.2 -> 线程的优点 1.3 -> 线程的缺点 1.4 -> 线程异常 1.5 -> 线程用途 2 -> Linux线程 VS 进程 2.1 -> 线程和进程 2.2 -> 进程的多个线程共享 3 -> Linux线程控制 3.1 -> POSIX线程…...

《Python编程实训快速上手》第十天--处理CSV文件和JSON数据

CSV&#xff1a;简化的电子表格&#xff0c;被保存为纯文本文件 JSON&#xff1a;是一种数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…...

基于springboot停车场管理系统源码和论文

如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大&#xff0c;容错率低&#xff0c;…...

Linux的桌面

Linux的桌面是可以卸载的 的确&#xff0c;Linux并不像Windows&#xff0c;Linux本身是一个基于命令行的操作系统&#xff0c;在内核眼中&#xff0c;桌面只不过是个普通的应用程序&#xff0c;所以&#xff0c;在Linux的桌面中可以完成的事情&#xff0c;命令行中也基本可以完…...

Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE

Spring Boot 3.0废弃了JavaEE&#xff0c;改用了Jakarta EE 历史背景 javax变成Jakarta的主要原因是因为Java EE项目从Oracle转移到了Eclipse Foundation&#xff0c;并改名为Jakarta EE。 JavaEE是从Java 1.2版本开始推出的Java企业级开发平台&#xff0c;最初的名称是J2EE(J…...

java-排序算法汇总

排序算法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09; 选择排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insertion Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 归并排序&#xff08;Merge Sort&#xff09; 堆排序&…...

C0030.Clion中运行提示Process finished with exit code -1073741515 (0xC0000135)解决办法

1.错误提示 2.解决办法 添加环境变量完成之后&#xff0c;重启Clion软件&#xff0c;然后就可以正常调用由mingw编译的opencv库了。...

如何理解JS的 异步

JS是一门单线程的语言&#xff0c;这是因为它运行在浏览器的渲染主线程中&#xff0c;而渲染主线程只有一个。 而渲染主线程承担着诸多的工作&#xff0c;渲染页面、执行JS都在其中运行。 如果使用同步的方式&#xff0c;就极有可能导致主线程产生阻塞&#xff0c;从而导致消…...

vsgithub

VS&GitHub项目联动&#xff08;上传和克隆&#xff09;&#xff0c;创建你的第一个仓库&#xff0c;小白配置_vs上传代码到github-CSDN博客...

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…...

10 - Clickhouse集群部署以及副本和分片

目 一、副本 1、简介 2、副本写入流程 3、副本配置步骤 3.1、启动zookeeper集群 3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下&#xff1a; 3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如…...

FreeRTOS的软件定时器与事件标志组

目录 1.FreeRTOS软件定时器 1.1 什么是FreeRTOS软件定时器&#xff1f; 1.2 学习软件定时器的意义 1.3 软件定时器的简介 1.3.1 软件定时器概述 1.3.2 编写回调函数的注意事项 1.4 定时器服务/Daemon 任务 1.4.1 定时器服务任务与队列 1.4.2 定时器相关配置 configUSE_T…...

生产制造领域的多元化模式探索

在当今全球化和信息化的时代背景下&#xff0c;生产制造领域正经历着前所未有的变革。随着消费者需求的多样化、市场竞争的加剧以及技术的不断进步&#xff0c;传统的生产制造模式已经难以满足现代企业的需求。因此&#xff0c;多种生产制造模式应运而生&#xff0c;以适应不同…...

大数据技术之SparkCore

RDD概述 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象。代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD五大特性 RDD编程 RDD的创…...