- 博客(137)
- 收藏
- 关注
原创 在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现:
在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现:
2024-08-07 19:26:01
459
原创 spring源码 循环依赖
实例化后存到三级缓存中,进行属性注入,B里面只有A类型的a这一个属性,依次查询一二三级缓存,然后在第三级缓存中查询到A,得到A的工厂,调用getObject()方法得到只进行了实例化的a,将a赋值给B,再进行初始化,此时B已经创建完成,将B赋值给A的b属性,A进行初始化,此时A也创建完成。A有属性b,B有属性a,创建A时对b属性赋值需要有b对象,如果没有b就创建,但是创建B又需要对属性a赋值,这样就构成了循环依赖。A中只有B类型的b这一个属性,和创建A时一样,还是。
2024-07-30 21:25:40
1233
2
原创 spring源码 bean的生命周期
初始化:先对自定义属性赋值(populateBean方法内用set方法进行赋值),再对容器对象属性赋值(检测aware相关接口并设置依赖),这里aware的作用是提供一个统一判断的标记:即没实现aware接口的对象就是属性都是自己定义的,实现了aware接口的属性值是容器对象,需要调用容器的getset方法来设置属性(invokeAwareMethods里面做统一判断)。如果不设计这样一个aware接口,就需要在每个属性被赋值时都判断一下 当前属性是否是容器对象。
2024-07-30 21:22:11
1059
原创 java集合
Map接口和Collection接口并列,Collection接口是单列,而Map接口是双列,用于保存具有映射关系的数据:Key - Value;Key 和 Value 可以是任何引用类型的数据Key不可以重复,Value可以重复Map 的 Key 可以为 null,value 也可以为 null,但 key 为 null 只能有一个;Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到对应的 Value但不能直接通过Value找到Key。
2024-04-03 17:26:22
879
原创 《高性能MYSQL》--高性能的索引策略,总结索引类型
在多列上独立地创建多个单列索引,这种做法不太好,触发你许多查询都是基于单个列进行的,否则在创建了多列索引的情况下进行以多个列作为条件的查询时,mysql会进行索引合并,查询能够同时使用两个单列索引进行扫 描,并将结果进行合并。有一种特殊情况,如果前面的列为常量的时候,ORDER BY子句中的列也可以不满足索引 的最左前缀的要求。在列储存的值长度过长,可以选择固定长度的前缀来作为前缀索引,这样能提高系统的性能,需要注意的是前缀索引的选择性要与原来的大致相等。7. 二级索引访问需要两次索引查找,而不是一次。
2024-03-05 10:26:21
1001
原创 《高性能MYSQL》——选择优化的数据结构
VARCHAR用于存长度可变的字符串(比固定长度的类型更加省空间),它除了存这个字符串以外还会使用1个字节或者2个字节去存这个字符串的长度(如果列的最大长度小于或等于 255字节,则只使用1字节表示,否则使用2字节),并且VARCHAR类型不会把数据后面跟的空格删除。更小的数据类型通常更快,因为它们占用的磁盘、内存和CPU缓存的空间更少,并且处理时需要的CPU周 期也更少。如果索引有多个列,就会按照列的顺序进行排序,对于2行数据,如果在索引中的第一个列这2行数据相对,就开始比较第二列,,,依次进行下去。
2024-03-03 16:41:06
1098
原创 《高性能MYSQL》-架构,锁,事务
之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即 MVCC ,可以认为 MVCC 是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;Read View是在进行快照读(即不加锁的select)时生成的,可以简单理解为含有3个用来判断应该读取该行数据的哪个版本的指标,根据这三个指标来判断应该使用哪个版本。第二层,包含了mysql大部分的核心功能,查询解析,分析,优化,以及所有的内置函数(例如,日期,时间函数),还有存储过程,触发器,视图等都是在这一次实现的。
2024-03-03 16:40:03
1329
原创 Redis原理篇(List底层结构与源码详解)
当redis客户端与服务端连接成功后,客户端就会被封装成一个client对象,里面包含了用户对redis的命令。比如说" LPUSH key k1 k2" 就是客户端的一个命令,redis会把 LPUSH ,key,k1,k2放在一个argv[]数组里面。argv[0] 是LPUSH,argv[1] 是key ,argv[2]是k1,argv[3]是k2返回的是robj (即RedisObject)再来看下面这串代码,表示前面的lookupkeyWrite()返回值是null,就是该key没有对应一个
2024-01-21 11:28:21
614
原创 Redis原理篇(String)
String 有三种编码方式 type是类型,表示该类型是String类型encoding是编码方式,表示当前是String的RAW编码方式ptr指针指向一个SDS(动态字符串)对象当要存的字符串长度小于44个字节时,String的编码方式会转变成EMBSTR编码此时RedisObject的头部分与SDS会是一段连续的内存空间因为当字符串长度小于44字节时,ReidsObject的大小小于64字节,而内存分片函数每次分片的内存空间都是2的n次方,64就刚刚好,不会产生内存碎片。当存储的字节是整数值,并且在最
2024-01-21 09:58:28
593
原创 Redis原理篇(SkipList)
本质是双端链表,只不过在正向遍历时可以不一个一个遍历,而是可以跳着遍历。怎么实现的呢,下面是SkipList源码意义:跳表zskiplist里面有头指针和尾指针,节点数量,最大索引层级意义:跳表的每个节点zskiplistNode 里面有ele(节点存储的值,sds是动态字符串类型)每个节点有个score权值,用来排序和查找,查找的时候将要查找的值先用与生成score一样的算法生成待查的score值,然后再根据每个节点的score值来查找该值指向前一个节点的指针,注意,在倒序遍历时不能跳表zskiplist
2024-01-20 22:23:03
592
原创 Redis原理篇(ZipList压缩列表)
ZipList是一种特殊的“双向链表”,但其实并不是链表,而是一段连续的内存空间,可以在任意一端进行压入/弹出操作。并且该操作的时间复杂度是O(1)结构如下图:现在对每一个部分进行解释:zlbytes:存该压缩列表的总字节数,byte即字节zltail:存最后一个节点到压缩列表的其实地址之间的字节数zllen:存的是总entry的个数entry:即节点zlend:压缩列表的结束标志,并且值是固定的:0xff这里补充一点进制基础:(1) 0x表示这是16进制数;
2024-01-20 16:33:03
1773
原创 Redis原理篇(Dict的收缩扩容机制和渐进式rehash)
Redis是一种键值型数据库,其中键与值的映射关系就是Dict实现的。Dict通过三部分组成:哈希表(DictHashTable),哈希节点(DictEntry),字典(Dict)其中哈希表的底层是数组(发生冲突时扩展成链表),用来存放哈希节点。下面是哈希表和哈希节点的源码dictEntry **table是哈希表的数组,每个元素都是一个指向dictEntry结构体的指针。这里使用双指针**的原因是为了实现动态数组。size是哈希表的大小。
2024-01-08 21:56:19
1318
原创 Java多线程详解
进程是程序的执行实例,而在进程的执行过程中,它需要操作和管理一系列的数据。这个数据集合通常包括和其他与程序执行相关的信息。这些数据共同构成了一个进程的。进程需要执行的指令集合,通常是可执行文件中的机器码。:用于指示当前正在执行的指令的位置。进程执行过程中使用的寄存器,用于存储临时数据和中间结果。用于存储函数调用和局部变量等临时数据。存储全局变量和静态变量等数据。包括进程的状态、优先级、打开的文件、网络连接等与执行相关的信息。注意:任意时刻,cpu总是只运行一个进程,其他进程处于非运行状态。
2024-01-03 20:27:43
485
原创 1211总结
当未到车次开车时间并且订单状态已支付,就显示退款按钮,点击向后台发退款请求,后台进行退库存退款相关操作。答辩发现了自己的一些问题,首先是业务功能比较少,大都是普通的curd。了解一下mysql与redis的同步策略,如延时双删和canel。post请求参数别用map,不然合作的时候别人不知道传的是什么。
2023-12-11 00:36:57
91
原创 11/19总结
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis 里面的zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。Redis的Set是string类型的无序集合。zset的成员是唯一的,但分数(score)却可以重复。Redis会自动的识别这3种值。
2023-11-20 10:42:28
137
原创 将普通类型数据赋值给ref响应式数据导致报错:searchAir.vue:129 Uncaught (in promise) TypeError: Cannot set properties of,
查chatgpt才恍然大悟,是因为router.currentRoute.value.query是普通类型,而我的数据searchData 本来是ref响应式数据,这样就把我的searchData 变成了普通类型;所以我给其属性赋值时会说尝试设置一个名为 'departTime' 的属性,但是这个属性的对象是。这行代码是我突发奇想写的,自以为能把里面的值都赋过来,却没想到连类型都被改了。尝试设置一个名为 'departTime' 的属性,但是这个属性的对象是。,因此无法设置它的值。要点上一个value,
2023-11-05 21:46:52
178
原创 Vue3中父组件与子组件的传值
作为数据传递给父组件或其他监听了该事件的组件。监听到了触发handleSendCity函数。直接监听sendCity事件,子组件:SelectCity。
2023-11-05 17:17:48
191
原创 Vue3-Pinia快速入门
4.在store里面创造一个airTicket.js,用来存放搜索机票相关数据或者函数。这样使用就比较方便,但是这样的话这2个结构出来的数据就不具备响应性了。3.在src目录下创建包:store,表示仓库。2.在main.js中导入并使用pinia。对仓库里面的数据操作不能直接解构,
2023-11-05 16:57:09
208
原创 runtime-core.esm-bundler.js:221 Uncaught TypeError:registerFormRef.value.validate is not a function
事实上,还有一个步骤,就是将registerFormRef绑定到表单上。在使用表单检验时出现了这个错误。
2023-10-29 10:40:19
552
原创 Mybatis-Plus 0基础光速入门代码
其中@TableName("book")这里的book是你的表的名字,与这个实体类一一对应。这个com/nsy/dao是复制第5步创建的接口的上一级的地址。-- MybatisPlus依赖-->先用自动注入注解@Autowired注入bookdao。名字随便取,泛型填你对应的实体类,我这里是book。其中:hmdp要换成你的数据库名称,其他的不用改。--数据库连接池druid -->然后就能使用里面提供的各种方法。
2023-10-22 20:39:51
186
原创 C语言基础-循环与数组
下标:即各元素的编号,编号从 0 开始5 个元素的标号依次是:0,1,2,3,4 最大下标是元素个数-1,即 5-1元素访问:数组名[下标]5 个元素依次是:a[0],a[1],a[2],a[3],a[4]相当于 5 个变量,即变量名字,跟 int c = 9;的 c 的用法一模一样。
2023-10-22 19:15:22
1166
原创 SpringBoot-黑马程序员-学习笔记(六)
这里的@DurationUnit(ChronoUnit.HOURS)注解表示崽yml文件中配置serverTimeOut的单位会自动设置为小时。而@DataSizeUnit(DataUnit.MEGABYTES)表示下面的dataSize在配置时,单位是MB。
2023-10-15 17:03:53
446
1
原创 SpringBoot-黑马程序员-学习笔记(五)
1.自定义一个bean2.在yml配置文件中中定义一组值3.在bean中进行属性绑定加上这个注解即可注解:这个注解用于告诉 Spring Boot 从配置文件中读取属性,以配置实例。prefix参数指定了在配置文件中要读取的属性的前缀。这意味着 Spring Boot 将查找配置文件中。即测试:在main中获取容器,再调用容器的getBean方法获取到serverConfig类,再输出这个类发现yml中配置的属性以及和bean绑定好了。
2023-10-14 21:42:48
302
原创 @Component 和 @Bean的区别
是一种方法级别的注解,用于定义方法返回的对象为Spring容器中的一个Bean。被标记为一个Spring组件,Spring会在应用程序启动时自动将其实例化并纳入Spring容器的管理。是Spring框架中用于管理和配置依赖注入的关键注解,用于定义和管理Spring应用程序中的组件。是一种泛用型的Spring注解,用于标识一个类为Spring组件。方法返回的对象会被Spring识别为一个Bean,并加入到Spring容器中,可以通过。注解的类,并将其实例化为Spring容器中的一个Bean(组件)。
2023-10-14 20:02:33
610
原创 SpringBoot-黑马程序员-学习笔记(四)
1.写业务层接口,泛型是对应的实体类2.写实现类,除了和之前一样的实现Service类外,还要继承ServiceImpl类,泛型有2个,第一个是对应的Dao层,第2个是对应的实体类这样就可以使用service里面的各种方法了。要是要接收一个实体类,参数前面就加注解@RequestBody要是接收路径上的参数,就加注解@PathVariable。
2023-10-12 22:31:16
363
原创 SpringBoot-黑马程序员-学习笔记(三)
Service@Autowired@Override@Override@Override@Override@Override@Override别忘记@Service注解。
2023-10-10 22:26:47
354
原创 SpringBoot-黑马程序员-学习笔记(二)
3个步骤:1.写yaml文件2.在控制类里面定义变量3.在变量上面用 " @Value注解 + ${} " 获取yaml文件的属性代码演示:yaml文件控制类:访问网址books后:读取到了对应了值。
2023-10-09 22:26:22
263
原创 SpringBoot-黑马程序员-学习笔记(一)
我们使用普通maven项目导入依赖时,通常需要在导入依赖的时候指定版本号,而springboot项目不需要指定版本号,会根据当前springboot的版本来下载对应的最稳定的依赖版本。点开pom文件会看到这个:继承了一个spring-boot-starter-parent模块,点开会看到这个:继承了一个spring-boot-dependencies再点开会看到:非常多的版本依赖,指定的许多依赖的最稳定版本继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突。
2023-10-08 22:21:20
620
原创 Spring Framework 黑马程序员-学习笔记
使用对象时(如在service类中调用Dao层的对象,以便使用Dao类中的方法),本来是依靠new一个Dao层的对象来实现,而实现了Ioc思想的Spring为了解耦,将此过程改为:将Dao层的对象存进IoC容器,使用时直接调用即可。Ioc容器负责对象的创建,初始化等一系列工作,呗创建或被管理的对象在IoC容器中统称为Bean。
2023-10-05 19:27:07
213
原创 Redis学习
set travel:user:2 '{"id":2,"name":"nsy","age":18}'层级结构如果发现不需要密码也能操作redis,就是没有指定 -p 为设置好的 6380,应该这样:redis-cli -p 6380使用Hash类型就是在Value里面再嵌套任意个键值对HSET存入对Hash里某个key对应的值进行修改再HSET一次即可也可以直接设置多个子键值对:HSET travel:user:5 name nsy age 18 height 1.8获取值:HGET(只能获取单个字段
2023-10-05 09:22:23
105
原创 Redis的java客户端-RedisTemplate光速入门
四.注解注入RedisTemplate。一.创建springboot项目。记得把文件后缀改为yml。三.写yml配置文件。五.然后就可以使用了。
2023-10-03 16:01:48
1041
原创 最快的包管理器--pnpm创建vue项目完整步骤
3.输入项目名字,选择Router,Pinia,ESLint,Prettier之后点确定。4.cd到创建好的项目 ,安装依赖。1.用npm全局安装pnpm。
2023-09-25 20:34:13
1430
3
原创 VUE学习笔记--黑马程序员
vue3中,直接导入组件就能用不再要求唯一根元素//createApp(App)是创建实例,.mount('#app')是在将实例往id为app的盒子上挂载//挂载就是让实例接管一片区域assets是存放图片或样式的目录。
2023-09-25 19:48:33
390
空空如也
关于输出100内的素数的细节问题
2022-10-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人