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

Spring

Spring

Spring 是什么?

Spring 是于 2003 年兴起的一个轻量级的,IOC 和 AOP 的 Java 开发框架,它 是为了简化企业级应用开发而生的。

Spring有几大特点如下

轻量级的

Spring 框架使用的 jar 都比较小,一般在 1M 以下或者几百 kb。Spring 核 心功能的所需的 jar 总共在 3M 左右。 Spring 框架运行占用的资源少,运行 效率高。

IOC

控制反转,即 Inversion of Control,缩写为 IOC,就是由 Spring IoC 容器管理对象,而 非传统实现中由程序代码直接操控.

AOP

直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP) 的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将 程序抽象成各个切面.

一站式框架

Spring 本身也提供了数据访问功能和 web 功能,以及可以很好的管理其他框架.

提供核心功能,主要是IOC,创建管理对象.
      提供面向切面编程,增强程序扩展
      对数据访问层进行了封装(重点在于事务管理)
      对web层进行封装,使得请求更加便捷

Spring 体系结构

Core Container(核心容器):

        Beans: 管理 Beans

        Core: Spring 核心

        Context: 配置文件

        ExpressionLanguage: SpEL 表达式 

AOP(切面编程)

AOP 框架: Aspects

Data Access(数据库整合):   JDBC, ORM, OXM, JMS, Transaction

Web(MVC Web 开发):    Web, Servlet, Portlet, Struts

Test(Junit 整合)

官网地址: https://spring.io/

Spring  搭建

Maven 导入 spring 核心基础 jar

<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

编写 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="user" class="com.ff.spring.bean.User"> </bean>
</beans>

编写一个 User 实体类

测试 spring

IOC(控制反转)

读作“反转控制”(Inverse of Control)更好理解,不是什么技术,而是一种 设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来 管理。

IOC 容器是具有依赖注入功能的容器,负责对象的实例化、对象的初始化,对 象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作,对象 的整个生命周期都是由容器来控制。我们需要使用的对象都由 ioc 容器进行管 理,不需要我们再去手动通过 new 的方式去创建对象,由 ioc 容器直接帮我 们组装好,当我们需要使用的时候直接从 ioc 容器中直接获取就可以了。

正控:若要使用某个对象,需要自己去负责对象的创建。

反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象, 不关心对象的创建过程,也就是把创建对象的控制权反转给了 Spring 框架。

底层实现方式: 解析 xml/扫描注解标签 + 工厂模式 + 反射机制

Spring Bean 管理

基于 xml 配置方式

bean 配置需要 spring 管理的类

id 生成的对象名

class 全类名

name 对象别名,可以为多个

scope:

      singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.

      prototype:原型 getBean()的时候都会 new Bean()

      request:每次 http 请求都会创建一个 bean, 仅用于 WebApplicationContext 环境

session:同一个 http session 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上

Xml 配置方式依赖注入 

指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通 过配置设置给该对象。

实现 IOC 需要 DI 做支持

注入的方式:

       set 方法注入

       构造方法注入

注解方式实现

注解开发准备工作

注解需要的 jar 包

注解功能封装在 AOP 包中,导入 Spring aop jar 包即可

开启注解扫描

<context:component-scan base-package="包名"> </context:component-scan>

注解创建对象

@Component(value=“user”)等于

<bean id=“user” class=“”></bean>

@Service

@Repository

以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层 使用不同的注解标记

@Scope(value=“prototype”) 原型

@Scope(value=“ singleton ”) 单例

注解方式注入属性

@Autowired

@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在 字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在, 如果允许 null 值,可以设置它的 required 属性为 false。

byType 自动注入

该注解默认使用按类型自动装配 Bean 的方式。

byName 自动注入

如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起 使用

需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。

JDK 注解@Resource 自动注入

Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名 称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入

byName 注入引用类型属性

@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配 的 Bean 的 id。

注解与 XML 的对比

注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。

注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。

xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重 启服务器即可将新的配置加载。

xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。

Spring JDBC

Spring 是个一站式框架:Spring 自身也提供了控制层的 SpringMVC 和 持久 层的 Spring JdbcTemplate。

开发步骤

下载 Spring JdbcTemplate 的 jar 包

<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>

导入属性文件

<context:property-placeholder location="config.properties"/>

管理数据源对象

spring 管理与数据库链接 (数据源)

<bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource">
<propertyname="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${pwd}"></property>
<property name="initialSize" value="10"></property>
<property name="minIdle" value="5"></property>
<property name="maxActive" value="20"></property>
</bean>

在配置文件中创建 JdbcTemplate

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

在类中获得 JdbcTemplate 对象,就可以直接使用。

JdbcTemplate 中常用的方法 

execute:无返回值,可执行 ddl,增删改语句

update:执行新增、修改、删除语句;

queryForXXX:执行查询相关语句;

不使用 AOP 的开发方式

先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要 再写两个非业务方法。非业务方法也称为交叉业务逻辑:

➢ doTransaction():用于事务处理

➢ doLog():用于日志处理

然后,再使接口方法调用它们。接口方法也称为主业务逻辑.

AOP 概述

AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过 预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

AOP 是 OOP 的延续,是软件开发中的一个热点,是 java 开发中的一个重要内 容。利用 AOP 可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的 耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP、OOP 在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP (面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获 得更加清晰高效的逻辑单元划分。

而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的 某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设 计思想在目标上有着本质的差异。

面向切面编程的好处就是: 减少重复,专注业务;

注意:面向切面编程只是面向对象编程的一种补充。

核心原理:

使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑

使用案例:

事务处理:开启事务,关闭事务,出现异常后回滚事务

权限判断:在执行方法前,判断是否具有权限

日志:在执行前进行日志处理

AOP 的基本概念

连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点

切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)

通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.

切面(Aspect):把通知添加到切入点的整个过程称为切面.

目标(Target): 代理的目标对象(连接点,切入点所在类)

代理(Proxy): 向目标对象应用通知时创建的代理对象

springAOP 实现

对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可 以完成面向切面编程。

AspectJ 是一个基于 Java 语言的 AOP 框架,它提供了强大的 AOP 功能,且其实 现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又 将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。

下载 AOP 相关 jar

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

基于 aspectj 的 xml 配置方式实现

<bean id="aopdemo" class="com.ff.spring.aop.AopDemo"></bean>
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(*
com.ff.spring.service.UserService.adduser(..))" id="adduser"/>
<aop:pointcut expression="execution(*
com.ff.spring.service.UserService.*(..))" id="allmethod"/>
<!-- 配置通知和切入点 -->
<aop:aspect ref="aopdemo">
<aop:before method="savelog" pointcut-ref="adduser"/>
<aop:after method="savelog" pointcut-ref="adduser"/>
<aop:around method="aroundAdvice" pointcut-ref="adduser"/>
<aop:after-throwing method="exceptionAdvice" pointcut-ref="allmethod"
throwing="e" />
</aop:aspect>
</aop:config>

AspectJ 中常用的通知有五种类型:

前置通知 before   业务方法执行前调用
后置通知 after-returning   业务方法执行后执行,当方法出现异常不执行
异常通知 after-throwing    业务方法出现异常时调用
最终通知 after    业务方法执行后调用 当方法出现异常也会执行
环绕通知 around

 

基于注解方式的实现

启动 AspectJ 支持:

<aop:aspectj-autoproxy />
@Component
@Aspect
public class AOPDemo {
@Before("execution(* com.ff.spring.demo1.dao.UserDao.*(..))")
public void before(){
System.out.println("before");
}
@After("execution(* com.ff.spring.demo1.dao.UserDao.*(..))")
public void after(){
System.out.println("after");
}
@Around("execution(* com.ff.spring.demo1.dao.UserDao.*(..))")
public void around(ProceedingJoinPoint point) throws Throwable {
System.out.println("start");
point.proceed();
System.out.println("end");
}
@AfterThrowing(value = "execution(* com.ff.spring.demo1.dao.UserDao.*(..))",throwing = "e")
public void afterthrow(Throwable){
System.out.println("afterthrow");
}
@AfterReturning("execution(* com.ff.spring.demo1.dao.UserDao.*(..))")
public void afterreturn(){
System.out.println("afterreturn");
}
}

Spring 事物管理

事物可以看做是由对数据库若干操作组成的一个单元。

我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作 的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常, 异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操 作数据的并不可靠,需要在这种情况下进行回退。

事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都 必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成,要么都取消,从而保证数据满足一致性的要求

Spring 中的事务管理分为两种形式,一种是编程式事务,一种是声明式事务。

编 程 式 事 务 在 项 目 中 很 少 使 用 , 这 种 方 式 需 要 注 入 一 个 事 务 管 理 对 象 TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代 码实现。

声 明 式 事 务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式 事务是方法级别的。

Spring 声明式事物管理方式有两种:    基于 xml 配置          基于注解实现

Spring 针对不同的 dao 框架,提供了不同的实现类,Jdbc,mybatis 事物管理实 现类是 DataSourceTransactionManager

配置事物管理器

<!-- 配置 spring 事务管理类, 并注入数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

注解方式

<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

在 service 中控制事务     @Service(value="userservice")       @Transactiona

声明式事务不生效的场景

@Transactional 应用在非 public 修饰的方法上 异常被 catch 捕获导致失效 出现编译期异常

@Transactional 事务传播行为设置错误 数据库引擎不支持事务 同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误

Spring 事务传播行为

什么叫事务传播行为?

即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。 事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事 务方法调用时,这个事务方法应该如何进行。事务传播行为是 Spring 框架独有 的事务增强特性,他不属于的事务实际提供方数据库行为.

例如:methodA 事务方法调用 methodB 事务方法时,methodB 是继续在调 用者 methodA 的事务中运行呢,还是为自己开启一个新事务运行,这就是由 methodB 的事务传播行为决定的。

Spring 定义了七种传播行为:

 

Spring 集成 Mybatis

Spring 集成 Mybatis 其核心是将 SqlSessionFactory 交由 Spring 管理,并由 Spring 管理对 dao 接口的代理实现。

导入 mybatis jar 包

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>

配置 sqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="mybatis-config.xml"></property>
<property name="mapperLocations" value="com/ff/*Mapper.xml">
</property>
</bean>

指定生成接口代理

<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ff.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</property>
</bean>

在 service 中注入 Dao 代理接口,此接口有 Spring 代理实现

 

相关文章:

Spring

Spring Spring 是什么? Spring 是于 2003 年兴起的一个轻量级的,IOC 和 AOP 的 Java 开发框架&#xff0c;它 是为了简化企业级应用开发而生的。 Spring有几大特点如下 轻量级的 Spring 框架使用的 jar 都比较小&#xff0c;一般在 1M 以下或者几百 kb。Spring 核 心功能…...

vue2版本《后台管理模式》(中)

文章目录前言一、创建一个文件夹 utils 里面新增一个 setToken.js 文件(设置token验证&#xff09;二 、创建一个api文件夹 新增 service.js &#xff08;axios拦截器&#xff09;三、在api文件夹里 新增一个 api.js 来接收数据&#xff08;把api封装哪里需要某项数据直接引入就…...

网络游戏开发-服务器篇

1.网络 网络分为弱联网和强联网。 1.弱联网 弱联网是客户端连接到服务端发送一个请求,然后由服务端回应一个内容,这是单向传输的方式,服务端是无法主动给客户端发送消息的,服务端相应请求之后会自动关闭连接。 缺点:传输采用明文,通过抓包可以看到明文信息,安全性不太…...

智慧校园源码:电子班牌,支持手机移动端以及web端对班牌设备的管控

▶ 智慧校园系统有源码&#xff0c;有演示&#xff01; (电子班牌&#xff09;设备管理&#xff1a; 1、 管理员查看全校电子班牌设备信息&#xff1a;含有&#xff08;班级信息、软件版本、设备型号、开关机信息、班牌截屏信息、教室编号、设备ID、设备描述、在线状态、离线状…...

研报精选230216

目录 【行业230216东吴证券】环保行业月报&#xff1a;2023M1环卫新能源渗透率大增至11.91%&#xff0c;上海地区渗透率高达77%【行业230216国元证券】国元新食饮&#xff1a;一图君&#xff1a;22年白酒产量&#xff1a;同降6.2%【行业230216浙商证券】农林牧渔点评报告&#…...

在华为MateBook Ego的arm windows 11上安装hyper-V虚拟机

入手一台华为matebook Ego的笔记本&#xff0c;由于想要测试一些arm的驱动功能&#xff0c;经常会把系统搞蓝屏&#xff0c;于是想安装一个虚拟机&#xff0c;于是试了vmware ,visual-box&#xff0c;由于本机是arm架构上面两个软件都无法进行正常安装&#xff0c;可能是由于有…...

OpenCV Canny边缘检测

本文是OpenCV图像视觉入门之路的第13篇文章&#xff0c;本文详细的介绍了Canny边缘检测算子的各种操作&#xff0c;例如&#xff1a;Canny算子进行边缘检测等操作。 Canny函数是OpenCV中用于执行边缘检测的函数之一&#xff0c;其参数包括&#xff1a; threshold1&#xff1a;…...

C#.Net正则表达式学习笔记

C#.Net正则表达式学习笔记 在处理字符串时&#xff0c;你会经常有查找符合特定条件的字符串的需求&#xff0c;比如判断一串电话号码是否符合格式、一个邮箱是否符合格式、一个密码是否包含了字母大小写等等。 正则表达式(Regular expressions)用于匹配文本&#xff0c;使用一…...

矩阵理论复习(十二)

已知方阵A的不变因子&#xff1a; 求谱半径求矩阵级数判断矩阵幂级数的收敛性 若矩阵B的某个算子范数小于1&#xff0c;则I-B可逆。 矩阵分析 任何相容矩阵范数都存在与之相容的向量范数。 盖尔圆盘定理一的证明 椭圆范数的证明 若||.||是Cm上的向量范数&#xff0c;A为…...

大数据框架之Hadoop:HDFS(七)HDFS 2.X新特性

7.1集群间数据拷贝 scp实现两个远程主机之间的文件复制 ​ scp -r hello.txt roothadoop103:/root/hello.txt // 推 push ​ scp -r roothadoop103:/root/hello.txt hello.txt // 拉 pull ​ scp -r roothadoop103:/root/hello.txt roothadoop104:/root //是通过本地主机中…...

Fluent工作目录

1 工作目录定义工作目录&#xff08;working directory&#xff09;是一种文件存储路径设置方式。基于工作目录的方法&#xff0c;写文件时只需要指定文件名&#xff0c;而不需要指定完全的文件路径&#xff0c;从而简化程序编写&#xff0c;对不同操作系统环境有更好的适应性。…...

Learning C++ No.10【STL No.2】

引言&#xff1a; 北京时间&#xff1a;2023/2/14/23:18&#xff0c;放假两个月&#xff0c;没有锻炼&#xff0c;今天去跑了几圈&#xff0c;一个字&#xff0c;累&#xff0c;感觉人都要原地升天了&#xff0c;所以各位小伙伴&#xff0c;准确的说是各位卷王&#xff0c;一定…...

【java 高并发编程之JUC】2w字带你JUC从入门到精通

点击查看脑图目录地址,实时更新 1 什么是 JUC 1.1 JUC 简介 在 Java 中&#xff0c;线程部分是一个重点&#xff0c;本篇文章说的 JUC 也是关于线程的。JUC 就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包&#xff0c;JDK 1.5 开始出现的。 1.2 进程与…...

QCon演讲实录(下):多云管理关键能力实现与解析-AppManager

在上篇中&#xff0c;我们已经基本了解了多云管理。现在&#xff0c;我们将深入探讨多云管理关键能力实现&#xff1a;AppManager。 什么是AppManager&#xff1f; 上面我们讲了理论、我们自己使用的交付流程和整体架构&#xff0c;下面我们进入关键能力实现与解析的环节&…...

刚刚退出了一个群,关于在要麒麟OS上运行Labview

年龄过了45&#xff0c;看问题&#xff0c;与以前不太一样了。 觉得浪费时间的事&#xff0c;宁可发呆&#xff0c;也不会参和。 竟然一个群里在讨论如何满足客户的需求&#xff1a;麒麟OS上运行Labview。 然后直接退了群。 这种问题&#xff0c;我觉得可能 发在csdn上&…...

el-uploader 文件上传后,又被修改,无法提交到后端 ERR_UPLOAD_FILE_CHANGED

problem 文件上传后&#xff0c;又被修改&#xff0c;无法提交到后端 具体步骤&#xff1a; 文件上传本地文件打开并修改保存提交ajax 这个问题不仅仅局限于el-uploader&#xff0c;是一个普遍性的问题 导致的问题 问题1&#xff1a;提交请求时&#xff0c;控制台报错 net…...

利用Eigen实现点云体素滤波

目录 前言 一、算法原理 二、代码实现 1.头文件 2.源文件 三、效果展示 前言 体素滤波原理简单,是常用的...

linux高级命令之多进程的使用

多进程的使用学习目标能够使用多进程完成多任务1 导入进程包#导入进程包import multiprocessing2. Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group&#xff1a;指定进程组&#xff0c;目前只能使用Nonetarget&#xff1a;执行的目标任务名…...

CSS 圆角边框 盒子阴影 文字阴影

目录 1.圆角边框&#xff08;重点&#xff09; 2.盒子阴影&#xff08;box-shadow&#xff09; 3.文字阴影&#xff08;text-shadow&#xff09; 1.圆角边框&#xff08;重点&#xff09; border-radius 属性用于设置元素的外边框圆角。 语法&#xff1a; border-radius: l…...

python简单解析打印onnx模型信息

当我们加载了一个ONNX之后&#xff0c;我们获得的就是一个ModelProto&#xff0c;它包含了一些版本信息&#xff0c;生产者信息和一个GraphProto。在GraphProto里面又包含了四个repeated数组&#xff0c;它们分别是node(NodeProto类型)&#xff0c;input(ValueInfoProto类型)&a…...

UE4 编写着色器以及各种宏的理解

参考链接&#xff1a;如何为 UE4 添加全局着色器&#xff08;Global Shaders&#xff09; - Unreal Enginehttps://docs.unrealengine.com/5.1/zh-CN/adding-global-shaders-to-unreal-engine/如何为 UE4 添加全局着色器&#xff08;Global Shaders&#xff09; - Unreal Engin…...

小笔记:Python 使用字符串调用函数

小笔记&#xff1a;Python中如何使用字符串调用函数/方法&#xff1f;jcLee95&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/111874476 邮箱 &#xff1a;291148484163.co…...

红黑树的原理+实现

文章目录红黑树定义性质红黑树的插入动态效果演示代码测试红黑树红黑树 定义 红黑树是一个近似平衡的搜索树&#xff0c;关于近似平衡主要体现在最长路径小于最短路径的两倍&#xff08;我认为这是红黑树核心原则&#xff09;&#xff0c;为了达到这个原则&#xff0c;红黑树所…...

用于非线性时间序列预测的稀疏局部线性和邻域嵌入(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

使用 Vue3 重构 Vue2 项目

目录前言&#xff1a;一、项目整体效果展示二、项目下载使用方法三、为什么要重构项目四、重构的流程五、步骤中的 bug 以及解决方式六、未解决的问题总结&#xff1a;前言&#xff1a; 2020年9月18日&#xff0c;vue3正式版发布了&#xff0c;前几天学习完成后&#xff0c;我决…...

Hive学习——单机版Hive的安装

目录 一、基本概念 (一)什么是Hive (二)优势和特点 (三)Hive元数据管理 二、Hive环境搭建 1.自动安装脚本 2./opt/soft/hive312/conf目录下创建hive配置文件hive-site.xml 3.拷贝一个jar包到hive下面的lib目录下 4.删除hive的guava&#xff0c;拷贝hadoop下的guava 5…...

uprobe 实战

观测数据源 目前按照我的理解&#xff0c;和trace相关的常用数据源–探针 大致分为四类。 内核 Trace point kprobe 用户程序 USDT uprobe 在用户程序中&#xff0c;USDT是所谓的静态Tracepoint。和内核代码中的Trace point类似。实现方式是在代码开发时&#xff0c;使用USDT…...

华为OD机试 - 求最大数字(Python)| 真题+思路+考点+代码+岗位

求最大数字 题目 给定一个由纯数字组成以字符串表示的数值,现要求字符串中的每个数字最多只能出现2次,超过的需要进行删除;删除某个重复的数字后,其它数字相对位置保持不变。 如34533,数字3重复超过2次,需要删除其中一个3,删除第一个3后获得最大数值4533 请返回经过删…...

雨水情测报与大坝安全监测系统

压电式雨量传感器产品概述传感器由上盖、外壳和下盖组成&#xff0c;壳体内部有压电片和电路板&#xff0c;可以固定在外径50mm立柱上和气象站横杆上。传感器采用冲击测量原理对单个雨滴重量进行测算&#xff0c;进而计算降雨量。雨滴在降落过程中受到雨滴重量和空气阻力的作用…...

抖音广告投放形式有哪些?新品牌进入抖音怎么建立口碑

坐拥5亿用户的抖音平台&#xff0c;已经成为各大品牌的兵家必争之地。想要在这块宣传的“高地”&#xff0c;做出声量&#xff0c;就必须了解抖音广告投放形式有哪些。这里整理的这份抖音广告投放指南&#xff0c;你一定不能错过。一、抖音为何如此牛想要弄清楚抖音广告的投放形…...

赶集招聘网/seo搜索引擎优化技术

冒泡排序对于时间复杂度来说是很大的&#xff0c;“桶排序”对于空间复杂度来说是很大的。 问题引入 我们现在要对6 1 2 7 9 3 4 5 10 8进行排序。首先&#xff0c;我们找到一个参考数&#xff0c;比如第一个位置的6吧&#xff01;我们接下来就是把大于参考数的元素放到参考数的…...

不用开源程序怎么做网站/域名站长工具

一&#xff1a;select模型 二&#xff1a;WSAAsyncSelect模型 三&#xff1a;WSAEventSelect模型 四&#xff1a;Overlapped I/O 事件通知模型 五&#xff1a;Overlapped I/O 完成例程模型 六&#xff1a;IOCP模型 本文简单介绍了当前Windows支持的各种Socket I/O模型&#x…...

做直播网站/聚合搜索引擎入口

1、Annotation 注解版 1.1、应用场景&#xff08;Student-Teacher&#xff09;&#xff1a;当学生知道有哪些老师教&#xff0c;老师也知道自己教哪些学生时&#xff0c;可用双向关联 1.2、创建Teacher类和Student类 1 package com.shore.model;2 3 import java.util.HashSet…...

门户网站营销特点/杭州seo公司服务

http://www.jianshu.com/p/25e678fa43d3 转载于:https://www.cnblogs.com/mafeng/p/7146306.html...

公司网站建设怎么规划比较好/百度搜索网址

目录 0 引言 1 为什么参加&#xff1f; 2 收获了什么&#xff1f; 3 结果怎么样&#xff1f; 0 引言 2020年博客之星2月4日发榜了&#xff0c;这是第一次参加CSDN博客之星大赛&#xff0c;这里做了简要的小回顾吧&#xff0c;现在变得比较怀旧了&#xff0c;多年以后再回首…...

网站建设的规划方案/永久免费自助建站系统

菱形 程序…………………… #include<stdio.h> int main() {int i,j,k; printf("\n\n");for(i1;i<4;i) //从第一行到第四行 {for(j1;j<16-i;j) //第一行15个空格 printf(" ");for(k1;k<2*i-1;k)printf("*"); //也可将 * …...