Spring IOC实战指南:从零到一的构建过程
Spring 优点:
- 方便解耦,简化开发。将所有对象创建和依赖关系维护交给 Spring 管理(IOC 的作用)
- AOP 切面编程的支持。方便的实现对程序进行权限的拦截、运行监控等功能(可扩展性)
- 声明式事务的支持。只需通过配置就可以完成对事务的管理,无需手动编程
- 方便程序测试。Spring 对 junit4 支持,可以通过注解方便测试 Spring 程序
- 方便集成各种优秀框架
- 降低 API 的使用难度
IOC:控制权反转
- 作用:
- 将创建对象的过程交给 Spring 框架进行管理
- 降低代码的耦合度。利用 IOC 容器进行控制
- 一个程序失控后不会影响其他程序的运转
- 一个程序失控后不会影响其他程序的运转
- 使用:
- 创建 Maven 项目,导入依赖:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency> </dependencies>
- 项目基本结构:
- 编写 Spring 核心的配置文件:
- 在 resources 下边创建 application.xml 文件
- xml 方式创建对象:
<!--IOC容器管理的bean--> <!--利用spring工厂创建对象--> <!--id: 唯一表示符 -> 对象名称 --> <!--class: 类的全路径--> <bean id="userService" class="com.qcby.spring.service.impl.UserServiceImpl" />
- 测试类:
public class TestIOC {//传统调用@Testpublic void run(){UserServiceImpl userService = new UserServiceImpl();userService.sayHello();}//Spring 创建对象写法@Testpublic void run(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean("userService");userService.sayHello();} }
- 创建 Maven 项目,导入依赖:
- IOC 技术总结:
- ApplicationContext 接口:工厂的接口,使用接口可以获取到具体的 Bean 对象
- 该接口下有两个实现类,SpringCould 配置中心:
- ClassPathXmlApplicationContext:加载类路径下的 Spring 配置文件
- FileSystemXmlApplicationContext:加载本地磁盘下的 Spring 配置文件
Spring 对对象的管理:
- 分类:
- 基于配置文件的方式:
- 创建对象
- 注入属性
- 基于注解方式实现:
- 创建对象
- 注入属性
- 基于配置文件的方式:
- Spring 框架的 Bean 管理的配置文件的方式:
- ID 属性:
- 给 Bean 起个名字,在约束中采用 ID 的唯一约束
- 取值要求:必须以字母开始,可以使用字母、数字、下划线、句号、冒号。不能出现特殊字符
- class 属性:Bean 对象的全路径
- scope 属性:scope 属性代表 Bean 的作用范围
- singleton 属性:表示单例 (默认值),最常用的方式
- prototype 属性:应用在 Web 项目中,同一个 HTTP Session 共享一个 Bean
- ID 属性:
- Bean 对象的创建和销毁的两个属性配置:
- 说明:
- Spring 初始化 Bean 或销毁 Bean 时,有时需要做一些处理工作,因此 spring 可以在创建和拆卸 bean 的时候调用 bean 的两个声明周期方法
- init-method 属性:当 bean 被加载到容器的时候用 init-method 属性指定的方法
- destory-method 属性:当 bean 从容器中删除的时候用 destory-method 属性指定的方法
- 说明:
- 实例化 Bean 对象的三种方法:
- 默认无参数的构造方法(默认方法,基本使用)
<bean id="userService" class="com.qcby.spring.service.impl.UserServiceImpl" ><property name="name" value="张三"/><property name="age" value="44"/> </bean>
-
静态工厂实例化方法:
/*** 静态工厂方式*/ public class StaticFactory {//静态工厂方式public static UserService creatUs(){System.out.println("静态工厂方式创建 UserServiceImpl对象");//业务逻辑 + 权限校验return new UserServiceImpl();} }//配置文件 <bean id="us" class="com.qcby.spring.factory.StaticFactory" factory-method="creatUs"></bean>
-
动态工厂实例化方法:
/*** 动态工厂实例化方式*/ public class Dfactory {public UserService craeatUs(){System.out.println("动态实例化工厂的方式");//业务逻辑 + 权限校验return new UserServiceImpl();} }//配置文件 <bean id="dfactory" class="com.qcby.spring.factory.Dfactory"></bean> <bean id="us" factory-bean="dfactory" factory-method="craeatUs"></bean>
- 默认无参数的构造方法(默认方法,基本使用)
DI:依赖注入
- IOC 和 DI 的概念:
- IOC:Inverse of Control,控制权反转,将对象创建权反转给 Spring
- DI:Dependency Injection,依赖注入,在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件中
- set 方法注入属性:
- <property name="" value = "" />
- 注意:给类、集合、列表和 map 集合,property 类型赋值的方式
- 实体类:
public class User {private String name;private Integer age;private Demo demo;private String[] strs;List<String> list;Map<String,String> map;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", demo=" + demo +", strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +'}';}//get set 方法
- 注入属性:
<!--IOC容器管理的bean--><!--id:唯一表示符--><!--class:类的全路径--><bean id="demo" class="com.spring.service.Demo"/><bean id="uesr" class="com.spring.service.User"><property name="name" value="张三"/><property name="age" value="18"/><!-- 给对象赋值 –> 用 ref 属性 首先要有这个对象--><property name="demo" ref="demo"/><!-- 给数组赋值 利用 <array></array>--><property name="strs"><array><value>熊大</value><value>熊二</value></array></property><!--给list列表赋值利用 <list></list>--><property name="list"><list><value>张胜男</value><value>理事长</value></list></property><!--给 map 赋值<map> <emtry key = "" value = "" /> </map>--><property name="map"><map><entry key="张三" value="河北"/><entry key="李思思" value="北京"/></map></property></bean> </beans>
- 利用构造器注入属性:
- <constructor-arg name = '' " value = " ">
- 实体类:
public class User {private String name;private Integer age;private Demo demo;private String[] strs;List<String> list;Map<String,String> map;public User(String name, Integer age, Demo demo, String[] strs, List<String> list, Map<String, String> map) {this.name = name;this.age = age;this.demo = demo;this.strs = strs;this.list = list;this.map = map;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", demo=" + demo +", strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +'}';}}
- 注入数据:
<!--IOC容器管理的bean--><!--id:唯一表示符--><!--class:类的全路径--><bean id="demo" class="com.spring.service.Demo"/><bean id="user" class="com.spring.service.User"><constructor-arg name="name" value="张胜男"/><constructor-arg name="age" value="18"/><!--给对象赋值 利用 ref --><constructor-arg name="demo" ref="demo"/><!--给数组赋值--><constructor-arg name="strs"><array><value>张思思</value><value>王菲</value><value>李思琪</value></array></constructor-arg><!--给 list 列表赋值--><constructor-arg name="list"><list><value>1111</value><value>aaaa</value></list></constructor-arg><!--给 map 集合赋值 利用 entry--><constructor-arg name="map"><map><entry key="111" value="sss"/><entry key="222" value="aaa"/></map></constructor-arg><!--给 property 类型赋值内部是 key value 形式--><constructor-arg name = "properties"><props><prop key = "username">root</prop><prop key = "age">18</prop></props></constructor-arg></bean> </beans>
注解创建对象:
- 配置扫描固定的包:
- 作用:把当前类使用 IOC 容器进行管理,如果没有指定名称,默认使用类名,首字母小写方式命名
//扫描固定包下的文件 <context:component-scan base-package="com.spring.service"/>
- 作用:把当前类使用 IOC 容器进行管理,如果没有指定名称,默认使用类名,首字母小写方式命名
- bean 管理类常用注解:
- @Component():普通的类
- @Controller():表现层
- @Service():业务层
- @Repository():持久层
@Component(value = "user") //@Controller() //@Service() //@Repository() public class user{@Value("zhang") //--->一般针对于包装类和基本数据类型private String name;@Value("男")private Integer age;@Value("男")private String sex;@Autowired() //----> 对对象类型直接注入private Demo demo; }
- 依赖注入常用的注解:
- @Value():用于注入基本类型数据
- @Autowired():用于注入引用类型
- @Qualifier():和 @Autowired 一起使用,强制使用名称注入
- @Resource():一般不用( jdk 提供),按名称注入对象
- @Scope:声明周期注解
- singleton(默认值):单实例
- prototype:多例
- 初始化方法和销毁方法注解:
- @PostConstrust 相当于 init-method
- @PreDestroy 相当于 destroy-method
- 不用配置文件,用注解赋值方式:
- 实体类配置:
@Configuration //标明当前类为配置类 @ComponentScan(value = "com.spring.service") //扫描固定的包 public class User {@Value("zhang") //--->一般针对于包装类和基本数据类型private String name;@Value("18")private Integer age;@Value("男")private String sex;@Autowired() //----> 对对象类型直接注入private Demo demo;}
- 测试类获取:
public class Test {public static void main(String[] args) {ApplicationContext ac = new AnnotationConfigApplicationContext(User.class);User user = (User) ac.getBean("user");System.out.println(user.toString());} }
- 实体类配置:
多配置文件形式:
- 在加载配置文件时,后多加自己需要的配置文件:
- 在一个配置文件中利用 <import resource = " " /> 引入另一个配置文件:
Spring 框架开发方式:
- 需求:编写 service 和 dao 的类
- 技术选择:持久层使用 JDBC 的程序,连接池是 Druild 连接池,创建 maven 工程,导入 jar 包
- 开发流程:
- 导入相关 jar 包:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency></dependencies>
- 创建数据库,创建表结构:
create database spring_db; use spring_db; create table account(id int primary key auto_increment,name varchar(40),money double )character set utf8 collate utf8_general_ci;insert into account(name,money) values('aaa',1000); insert into account(name,money) values('bbb',1000); insert into account(name,money) values('ccc',1000);
- 编写 JavaBean 类:
public class Account implements Serializable {public static final Long serialVersionUID = 7355810572012650248L;private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", nane='" + name + '\'' +", money=" + money +'}';} }
- 编写 AccountDao 接口实现类:
public class AuccountDaoImpl implements AccountDao {//注入连接池对象private DataSource dataSource;public void setDataSource(DataSource dataSource){this.dataSource = dataSource;}/*** 查询所有的数据* @return*/@Overridepublic List<Account> finAll() {List<Account> list = new ArrayList<>();Connection connection = null;PreparedStatement stmt = null;ResultSet rs = null;try{//获取链接connection = dataSource.getConnection();//编写 sqlString sql = "select * from account";//预编译stmt = connection.prepareStatement(sql);//查询数据rs = stmt.executeQuery();//遍历结构集while(rs.next()){Account account = new Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));}}catch (Exception e){e.printStackTrace();}finally {try{connection.close();stmt.close();rs.close();}catch (Exception e){e.printStackTrace();}}return list;} }
- 编写配置文件:
<!--配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///spring_db"/><property name="username" value="root"/><property name="password" value="root"/> </bean><!--管理Bean--> <bean id="accountService" class="com.spring.service.Impl.AccountServiceImpl"><property name="accountDao" ref="accountDao"/> </bean> <bean id="accountDao" class="com.spring.dao.Impl.AuccountDaoImpl"><property name="dataSource" ref="dataSource"/> </bean>
- 编写测试程序:
public class Test {@org.junit.Testpublic void run(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("aaplication.xml");AccountService accountService = (AccountService) applicationContext.getBean("accountService");List<Account> list = accountService.findAll();for (Account account : list){System.out.println(account);}} }
- 导入相关 jar 包:
IOC纯注解方式:
- 概述:
- 纯注解方式是微服务架构开发的主要方式
- 替换掉所有的配置文件,但是需要写配置类
- 常用的注解:
- @Configuration:声明该类为配置类
- @ComponentScan:扫描具体包结构
- @Import:用于导入其他配置类
//Spring 配置类,替换掉 applicationContext.xml //声明当前是配置类 @Configuration //扫描指定的包结构 @ComponentScan("com.qcby.spring") //导入其他配置类 @Import(value = SpringConfig2.class) public class SpringConfig {}@Component public class SpringConfig2 { }
- @Bean:只能写在方法上,表明使用此方法创建一个对象,对象创建完成保存到 IOC 容器中
@Bean(name="dataSource") public DataSource creatDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///community");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource; }
- 案例:
- 编写实体类:
@Component public class Order {@Value("北京")private String address;@Overridepublic String toString() {return "Order{" +"address='" + address + '\'' +'}';} }
- 编写配置类:
//Spring 配置类,替换掉 applicationContext.xml //声明当前是配置类 @Configuration//扫描指定的包结构 @ComponentScan("com.qcby.spring") public class SpringConfig {}
- 编写测试方法:
@Test public void run1(){//创建工厂,加载配置类ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);//获取对象Order order = (Order) ac.getBean("order");System.out.println(order); }
- 编写实体类:
Spring 框架整合 JUnit 单元测试:
- 导入依赖:
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version><scope>test</scope> </dependency>
- 配置文件形式:
- 编写类和方法,并把该类交给 IOC 容器进行管理:
public class User {public void sayHello(){System.out.println("Hello");} }
- 编写配置文件:
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.qcby.spring.pojo.User"></bean></beans>
- 编写测试方法
//Spring整合单测试 @RunWith(value = SpringJUnit4ClassRunner.class) @ContextConfiguration(value = "classpath:application_test.xml") public class Demo {//自动注入@Autowiredprivate User user;@Testpublic void run1(){user.sayHello();} }
- 编写类和方法,并把该类交给 IOC 容器进行管理:
- 纯注解方式整合单元测试:
- 编写类和方法:
@Component public class Customer {public void save(){System.out.println("保存客户");} }
- 编写配置方法:
//声明配置类 @Configuration //扫描包 @ComponentScan(value = "com.qcby.spring") public class SpringConfig3 {}
- 编写测试方法:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig3.class) public class Demo2 {//注入对象@Autowiredprivate Customer customer;//测试@Testpublic void run(){customer.save();} }
- 编写类和方法:
相关文章:

Spring IOC实战指南:从零到一的构建过程
Spring 优点: 方便解耦,简化开发。将所有对象创建和依赖关系维护交给 Spring 管理(IOC 的作用)AOP 切面编程的支持。方便的实现对程序进行权限的拦截、运行监控等功能(可扩展性)声明式事务的支持。只需通过配置就可以完成对事务的管理,无需手…...
3.langchain中的prompt模板 (few shot examples in chat models)
本教程将介绍如何使用LangChain库和智谱清言的 GLM-4-Plus 模型来理解和推理一个自定义的运算符(例如使用鹦鹉表情符号🦜)。我们将通过一系列示例来训练模型,使其能够理解和推断该运算符的含义。 环境准备 首先,确保…...
量子感知机
神经网络类似于人类大脑,是模拟生物神经网络进行信息处理的一种数学模型。它能解决分类、回归等问题,是机器学习的重要组成部分。量子神经网络是将量子理论与神经网络相结合而产生的一种新型计算模式。1995年美国路易斯安那州立大学KAK教授首次提出了量子…...

VM虚拟机装MAC后无法联网,如何解决?
✨在vm虚拟机上,给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上,打开 服务,找到VMware DHCP和VMware NAT,把这两个服务打开,专一般问题就…...

IDEA 基本设置
设置主题 设置字体 设置编码格式 改变字体大小 开启 按住 ctrl 滚轮 改变字体大小。 开启自动编译...

Chrome 浏览器 131 版本新特性
Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来,用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能,请访问网站,并点击聚焦时出现在地…...
使用php和Xunsearch提升音乐网站的歌曲搜索效果
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

计算机毕设-基于springboot的高校网上缴费综合务系统视频的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

STL关联式容器之map
map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。下面是<stl_pair.h>中pair的定义 tem…...

【HarmonyOS】鸿蒙应用唤起系统相机拍照
【HarmonyOS】鸿蒙应用唤起系统相机拍照 方案一: 官方推荐的方式,使用CameraPicker来调用安全相机进行拍照。 let pathDir getContext().filesDir;let fileName ${new Date().getTime()}let filePath pathDir /${fileName}.tmpfileIo.createRandomA…...

Linux系统使用valgrind分析C++程序内存资源使用情况
内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…...
Java基础夯实——2.7 线程上下文切换
线程上下文切换(Thread Context Switching)是操作系统在多线程环境中,切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。 1 上下文: 线程的上下文指线程在某一时刻的执行状态,如&am…...
死锁相关习题 10道 附详解
2022 设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量是19。在T0时刻系统的状态: 最大资源需求量已分配资源量A,B,CA,B,…...

VisionPro 机器视觉案例 之 彩色保险丝个数统计
第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计 文章目录 第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计1.案例要求2.实现思路2.1 方法一 颜色分离工具CogColorSegmenterTool将每一种颜色分离出来,得到对应的单独图像,使用斑点工具CogBlo…...

go-zero(七) RPC服务和ETCD
go-zero 实现 RPC 服务 在实际的开发中,我们是通过RPC来传递数据的,下面我将通过一个简单的示例,说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中,我们根据user.api文件࿰…...

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)
目录 前言 Generic Webhook Trigger 插件 下载插件 编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建,本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目; Generic Webhook Trigger 插件 实现代码推送后,触…...

043 商品详情
文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…...
【人工智能】Python与Scikit-learn的模型选择与调参:用GridSearchCV和RandomizedSearchCV提升模型性能
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习建模过程中,模型的表现往往取决于参数的选择与优化。Scikit-learn提供了便捷的工具GridSearchCV和RandomizedSearchCV,帮助我们在参数空间中搜索最佳组合以提升模型表现。本文将从理论和实践两个角度…...

深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动
背景介绍 现代爬虫技术中,模拟人类行为已成为绕过反爬虫系统的关键策略之一。无论是模拟用户点击、滚动,还是鼠标的轨迹移动,都可以为爬虫脚本带来更高的“伪装性”。在众多的自动化工具中,Puppeteer作为一个无头浏览器控制库&am…...

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools
原因 想用 apt-get download 存到本地 / NAS上,减少网络流浪。 看到 VMware 上的确实有 ubuntu,只是版本是16。 ubuntu 版本比较:LTS vs RR LTS: Long-Term Support 长周期支持, 一般每 2 年更新,会更可靠与更稳定…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...