![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 51
LSZXZNJ
这个作者很懒,什么都没留下…
展开
-
cglib
在AOP框架中,如Spring AOP,默认情况下使用JDK动态代理,但若目标对象没有实现接口,则转而使用CGlib来创建代理对象,实现在方法前后插入自定义逻辑(如日志记录、事务管理等)。不同于ASM库直接操作字节码,CGlib采取了更高层次的抽象,使得开发者可以以面向对象的方式创建代理类或者子类,而无需了解底层字节码的细节。操控和分析框架,它允许开发者在运行时或者编译时期动态地生成、改变或者分析类。(仅能代理实现了接口的类)时,CGlib可以创建目标类的子类作为代理,因此适用于没有实现接口的类的增强。原创 2024-07-03 21:59:50 · 313 阅读 · 0 评论 -
简单了解雪花算法
ID 由多个数据组合拼接成64位,分别是 时间戳 + 服务器节点ID + 序列号,每个数据项占的位数不固定,可以根据实际需求设置。所以,时间戳移位 的结果 和 服务器节点ID 移位的结果 进行 按位或运行。将时间戳,节点ID,序列号 三个 long 型的 数字 进行 移位 和 按位或 运算,就得到最终的UID。移位 和 按位或 操作 都是 二进制 位操作,操作的对象 是 一个 二进制位 0或者1。对于十进制的 long 型 数值,移位操作 是 先转为 二进制数 再进行移位操作。原创 2024-06-21 18:01:24 · 209 阅读 · 0 评论 -
vs code 搭建 vue 开发环境
vue-cli : 输入 npm install -g @vue/cli。nodejs:官网下载安装后 输入 node -v 验证是否安装成功。以管理员身份打开 vs code ,导入 vue 项目。-project-name ,创建vue 项目。安装后,vue --versoin 验证。终端执行 npm run serve。vs code 环境准备好。进入目标文件夹,输入。现在开发越来越简单了。原创 2024-06-01 19:26:06 · 439 阅读 · 0 评论 -
org.apache.kafka.clients.consumer.CommitFailedException
如果消费者A 处理数据 超时,kafka 会将 A 消费者消费的数据分区 重新分配给另一个消费者B 并且 消费者B 会 重新消费 A 没有 提交的数据。调整 max.poll.interval.ms 或者 max.poll.records 能够解决,但是依然避免不了这种问题。3. 解决方案 是 增加 max.poll.interval.ms 设置的时间 或者 减少 max.poll.records 设置的数量。上面两种情况,数据都不会丢,但有可能被重复处理。当然,数据也不会丢,会被其他消费者消费。原创 2024-05-31 17:47:49 · 431 阅读 · 0 评论 -
vscode 编程工具配置Java开发环境
File -> open Folder, 选择项目文件,打开后,再启动类上会有 按钮,直接点就可以运行了。,进入setting, 3:配置 maven安装目录,4:配置maven setting.xml 目录。1. 安装JDK/安装maven/安装vs code。,进入setting, 3: 配置 JDK安装目录。首先安装好vs code 之后,vs code 开发环境配置。原创 2024-05-30 20:55:46 · 325 阅读 · 0 评论 -
HttpURLConnection使用基本操作
http请求 一般包括 请求参数/header/cookie等参数的设置。原创 2024-04-26 17:12:21 · 305 阅读 · 0 评论 -
Integer i1 = 128;Integer i2 = 128;boolean b = i1 == i2; 是ture 还是 false
可以看到,缓存的数组 默认 最大值是127,所以 128 是会重新new新的integer对象。用 == 比较 自然是不相等的。自动装箱,是把一个 基础类型 比如 int 包装成一个 对象类型Integer,先不讨论这是怎么实现的。看一下 Integer 类,内置了一个 Integer类型的数组。所以,默认情况下,-128 -- 127 之间的数值,用 == 比较是相等的,超出范围就不相等了。当一个int 变量值 在数组中存在,则直接取出来用,否则就new 一个 ingeter对象了。原创 2023-10-08 15:45:38 · 158 阅读 · 0 评论 -
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessor
然后,再找到所有的BeanDefinitionRegistryPostProcessor,依次处理 PriorityOrdered、Ordered、其他,进行排序后调用 postProcessBeanDefinitionRegistry,然后加入到registryProcessors 集合中。集合变量也挺多的,看着看着就晕了。这个集合,记录了 找到的所有的的BeanDefinitionRegistryPostProcessor,用来在后面调用BeanFactoryPostProcessor时进行过滤。原创 2023-10-08 11:21:42 · 181 阅读 · 0 评论 -
写时 复制
就是 更新数据的时候 先复制一份数据,然后再副本中进行更新,更新后再替换原数据。这样可以保证只有更新数据的时候对数据加锁,读数据依然读原数据而不用加锁,提高读数据的性能。写时复制策略应用很广泛,JDK 提供的 CopyOnWriteArrayList 就是写时复制的一种应用。在使用时,需要根据具体使用场景 来选择 是否 使用写时复制策略。写时复制,是一种空间换时间的策略。原创 2023-09-15 10:57:30 · 142 阅读 · 0 评论 -
mysql 插入更新数据
需要根据具体的业务场景来选择,一般都是 先 select,如果存在,则通过 upate 来更新指定字段,很少 利用 replace into 或者 insert into on duplicate key update 来操作,如果是唯一索引字段已存在,那么这两种都是会删除原来的行 再插入新的行,如果表的主键id 是增的话,岂不是 就变了。1)主键或唯一索引 已存在,则删除已存在的记录,插入新的记录,Affected rows: 2。2)如果主键或者唯一索引不存在,则直接插入行,影响行数:1。原创 2023-09-08 10:47:15 · 879 阅读 · 0 评论 -
new HashMap{{put(“a“,“b“)}}
前面提到,这种写法是属于 定义了一个匿名内部类,继承了 父类,所以,这里直接使用一个 语句块 来调用 父类的方法。不光是HashMap,像list也可以。比如:下面这个就是 定义了一个 匿名的Test子类,旁边那个向下的箭头就是说明有子类。对于new HashMap{{}};上面这种写法大家不陌生吧,实际上 就是 定义了一个匿名内部类。为什么要搞一个语句块在哪里?别只知道静态语句块。原创 2023-09-06 16:52:23 · 236 阅读 · 0 评论 -
mysql group by 字段 与 select 字段
一顿操作,复现了 select 字段 和 group by 字段 不一致 导致sql报错的问题。所以,问题是 sql_mode 的设置。sql2 和 sql1 的区别是 分组少了 sex字段,那么 返回的结果 就是只有 name分组结果 并且 返回分组后的第一条记录。ONLY_FULL_GROUP_BY,限制了 group by 字段 和 select 字段一致的要求。sql 1 根据 name,sex 两个字段分组,查询 所有字段,返回结果。sql 2 根据 name 字段分组,查询所有字段,返回结果。原创 2023-09-01 10:54:52 · 531 阅读 · 0 评论 -
关于类和接口
抛开具体的设计模式,在看不同框架的源码时,一般他们都是遵循了面向接口编程的,也就是依赖倒置。在变量类型、方法返回类型、入参类型都是接口或者抽象类,这样就实现了依赖倒置,也就是依赖接口。这样做的优点,就是可以有不同的实现类型,而不用改动高层次的逻辑。如果要实现里氏替换,那边必须是依赖倒置的,如果遵循了依赖倒置,那么也实现了里氏替换原则。驱动管理类,获取连接的方法,就是依赖倒置原则的实现,面向的接口编程,依赖抽象。关于设计模式,经常会说面向接口编程,而面向接口编程,对应的是哪一个原则呢?原创 2023-08-31 10:53:52 · 680 阅读 · 0 评论 -
JDBC使用了哪种设计模式
所以,可以将JDBC中定义的接口看成是 抽象部分,而mysql 、oracle看成是具体的实现,这种将抽象和实现分开,就是桥接模式的定义啊。所以,不能只关注 实际的接口类或者实现类之间的关系,应该从宏观上来看他们之间的关系,因此,JDBC就是使用了桥接模式。可以看到,不论是mysql 还是 oracle,都对 JDBC接口进行了实现。看一下策略模式类图(图解设计模式),好像是挺像的。将抽象部分与它的实现部分分离,使它们都可以独立地变化。不同的数据库厂商提供操作自己数据库的驱动包,立于使用它的客户而变化。原创 2023-08-30 15:20:11 · 746 阅读 · 0 评论 -
springboot日志文件名称为什么叫logback-spring.xml
如下代码完成 日志配置文件的定位,最终获取到 logback-spring.xml日志配置文件咯。如题,为什么springboot日志配置文件叫logback-spring.xml?在整个项目中搜索 logback-spring.xml 并没有搜索到。原创 2023-08-22 11:19:58 · 1167 阅读 · 0 评论 -
远程debug竟如此简单
idea选择 remote 模式,host 填上 远程服务的ip,port 填上 debug 端口,就行了。红框 框起来的是 idea自动生成的 jvm启动参数,需要 启动的时候 在服务器环境变量加上。一张图告诉你如何远程debug。原创 2023-08-17 14:34:06 · 64 阅读 · 0 评论 -
clone浅拷贝
2. 如果值 是 引用类型,那么就是 copy一份该引用,那么,此时,新对象和老对象 都持有 该引用,其中一方修改改引用对象的数据,另一方也是拿到最新修改的值。通过调用 clone() 方法,完成 对象拷贝。该方法是Object类中的方法,所有对象都继承该方法。我们经常用的 BeanUtils进行对象属性copy,也是浅拷贝。1. 如果值 是 基本类型,那么就是 copy 一份 该值。通过一个实例对象 生成另一个对象,称为 拷贝。3. clone 方法 不会调用 构造函数。该接口是一个 标记接口。原创 2023-06-27 17:10:39 · 189 阅读 · 0 评论 -
JVM-GC日志
通过GC日志,可以看出来,每次GC 后面括号里都有原因,像 Allocation Failure。这就是 GC的触发原因,当分配空间失败,也就是 当前内存不足了,就会触发GC。第二行:因为 Metadata GC Threshold 引发的 Full GC,年轻代、老年代、元空间 都进行GC。第一行:因为 Metadata GC Threshold 引发的GC,年轻代 空间进行了GC。没有Full GC了,原来是因为 元空间太小,触发了 Full GC。每个空间用 [] 扩起来,不同空间用 ,分割。原创 2023-06-21 16:33:41 · 783 阅读 · 0 评论 -
开发工具介绍
Visual Studio :适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE。完整打包了一系列丰富的工具和功能,可提升和增强软件开发的每个阶段。Visual Studio for Mac :面向 .NET 开发人员的 macOS 原生的综合 IDE。Visual Studio 是 IDE,是一套集成开发工具,Visual Studio Code是编辑器。以上介绍的 基本都可以使用 主流的编程语言,c/c++/java等等。对于c/c++还有其他的开发工具,比如 Dev-C ++原创 2023-06-15 15:23:03 · 539 阅读 · 0 评论 -
virtual-machine shutdown hook 不执行
将应用打包后,上传至 linux 服务器,执行 java -jar xxx.jar 运行。因为 kill -9 ,是强制退出,这个时候jvm没办法执行hook了。如果用 kill -9 pid,hook 是不会执行的。添加一个 线程时,用于在结束应用时关闭资源。原创 2023-06-12 14:08:52 · 469 阅读 · 0 评论 -
spring boot MVC 流程简单梳理
实际上就是 遍历 List列表 ,而列表的初始化,是在 Servlet第一次加载的init中完成的。首先是 容器启动,把Handler 和 url 之间的映射 加载好。首先从容器中获取,容器中没有获取到时,再从配置文件中获取。这些准备工作做完之后,第一步的 查找 Handler 才能完成。而这些准备工作,也是在应用启动时完成的。找到handler后,再把handler的 所有 mapper方法找到,包装成。所以,在容器启动之后,容器中已经加载了 默认的。在查找handler这一步,是怎么做的呢?原创 2023-05-24 21:56:42 · 1011 阅读 · 0 评论 -
这是JWT 简单使用
使用和 生成 JWT 相同的 秘钥,因为 token中已经有 算法信息了,所以不用再设置算法。确定 使用的加密算法,jjwt 工具包已经 给我们提供好了各种加密算法的枚举。如果 token 失效 或者 加密 秘钥和解密秘钥 不同,都会解析失败。解析获取到 Claims 对象,可以获取 body 中的数据。另外,可以构建 JWT 的创建时间 和 失效时间。OK,Java工具包如下,使用 jjwt。构建Body部分,该部分 是一个 Map。头部,记录 使用的 加密算法的类型。Body,记录一些额外信息。原创 2023-05-24 18:02:59 · 768 阅读 · 0 评论 -
MySql连接数
mysql连接数相关的命令,针对数据库服务器的,不是数据库实例。几个小命令,作用很大。2. 查看当前连接命令,该命令返回所有正在连接的连接。返回的行数就是 当前连接数。3. 修改数据库支持的最大连接数。1. 查看最大连接数命令。原创 2023-05-17 10:35:45 · 137 阅读 · 0 评论 -
从数据库连接到Mybatis到spring到springboot梳理
不论mybatis,还是spring,还是spring boot,其实,都是 在一层一层的包装,使操作越来越简单。JDK提供的驱动接口,指定了获取连接的标准接口,任何数据库厂家,都需要提供一个Java版本的驱动包并实现驱动接口,来完成改数据库的连接操作。对于数据库操作,很多都是重复的工作,Mybatis包装了这些重复的工作,开发人员只需要编写SQL语句,就可以完成数据库的操作了。经过一系列的包装,调用,最终代码会走到上面提到的,获取连接、获取statement、执行SQL、结果处理等。原创 2023-05-12 17:57:06 · 730 阅读 · 0 评论 -
Maven打包项目
可以看到,标签,是把 console 模块的 jar包,也就是 spring boot 项目的jar包,copy到了定制化打包的 target目录下。一般我们 编写了 spring boot 项目后, 直接打包,会得的一个 jar,然后运行 java -jar xxx.jar 来 运行这个spring boot 项目。这是 nacos的文件目录,进入bin目录,执行 startup.sh 或者 startup.cmd 命令,就可以运行 nacos服务了。那么,这是怎么做到的呢?原创 2023-02-13 17:52:52 · 836 阅读 · 0 评论 -
maven 打包报错
报错的版本 是用了 3.0.2的 plugin, 指定版本 为 2.1.x ,重新执行就OK 了。一开始不知道是啥情况,定睛一看,可能跟 java 编译版本有关系。原因是 没有指定 plugin版本,默认使用最新的版本。原创 2023-02-13 16:48:46 · 219 阅读 · 0 评论 -
elasticsearch小白入门
elasticsearch解压后,运行 bin目录下的 elasticsearch-7.10.2\bin>elasticsearch.bat。解压后修改配置 kibana-7.10.2-windows-x86_64\config\kibana.yml。一般再项目中都会用到 搜索,如果直接查询数据库,性能会存在瓶颈。执行 kibana-7.10.2-windows-x86_64\bin>kibana.bat。以上是 windows安装elasticsearch,kibana,用来开发环境测试用。原创 2022-12-23 17:30:03 · 580 阅读 · 0 评论 -
揭秘Mysql到Java字段类型转换
把字段A的类型修改成bit类型,再读取时,获取的Java类型就是Boolean类型,这是怎么做到的呢?数据库驱动 从 数据库服务 获取到 数据流之后,也就是字节数组,会根据 字段的实际类型,从字节数组中 读取 指定的 字节数,将字节转换成对应的Java对象类型。读取某个字段的值时,首先会获取 对应字段的 Field 对象,该对象中定义了 当前字段的类型,根据不同的类型,使用不用的方式来读取数据。如果读取的字段想转成自己指定的类型,那么可以在获取字段数据时指定具体的期望转换的类型就可以了。原创 2022-10-20 14:17:48 · 1166 阅读 · 0 评论 -
Fegin使用客户端负载均衡器Ribbon
在微服务之间调用,spring cloud 使用 ribbon 来进行负载均衡。如果说 负载均衡 算法,有很多种,那么 ribbon 是怎么拿到 服务列表的呢?那么是怎么从注册中心拿的?FeignClientFactoryBean 实例化时,通过 FeignClientFactoryBean#getObject 来获取代理对象,handler: feign.ReflectiveFeign.FeignInvocationHandler。4. 接口请求时,走负责均衡器,从注册中心获取服务列表。原创 2022-10-13 16:01:27 · 127 阅读 · 0 评论 -
IDEA 多线程断点调试
怎么 才能 debug A 线程时,B线程是暂停执行的;需要切换到B线性debug时,A线程暂停执行?在断点的地方,鼠标右键的弹框, 选择 Thread 就可以了。有时候需要测试一下 多线程并发的场景。原创 2022-09-23 20:09:02 · 384 阅读 · 0 评论 -
MySql分区简单说明
数据库分区,是数据库管理系统 提供的 一个 比较好的功能。当数据量大时,除了 分表,还可以对一个表进行分区。注意的是,表分区,一定是在 创建表的时候 进行分区,后面才可以增加分区、删除分区。也就是说,分区操作的前提是 表 是一个 分区表。这种情况,如果 必须创建分区的话,那只能新建一个 分区表,然后再 把原表数据中 同步到新表中。要去掉,不然 后面的分区语句就是单独的命令了。常见的分区有 range、hash,一般情况下,range分区比较普遍。可以在查询语句中加上分区号,则只在 指定 分区中 扫描。原创 2022-09-14 15:27:04 · 1050 阅读 · 0 评论 -
IO泛泛而谈
一般来说,网卡数据读取到内存、内存数据写入到网卡,在传统的IO操作中,需要多次的系统调用、内核态的切换、数据在内核态和用户态内存中的Copy等,这些操作 无疑 降低了网络IO的性能。众所周知,硬盘的读写速度是很慢的,当然,这里是指机械硬盘,在读取或写入数据时,由于寻道、盘片旋转等机械运动,导致耗时是比较长的。有一种情况,磁盘的性能比内存要高,那就是 顺序写。同时,操作系统 利用 页缓存 来 缓存预读的磁盘数据,并且对磁盘数据的操作也是在页缓存中直接操作的,再某个时机下,再将页缓存中的数据写入磁盘。原创 2022-09-05 20:04:46 · 147 阅读 · 0 评论 -
Job Scheduling简介
在编写代码时,稍微复杂一下,需要实现Job接口,创建JobDetail、Trigger、Scheduler等来协助完成调度你的任务。1.xxl-job有一个控制台,需要部署之后,用来注册Job。2.具体的Job方法写完之后,springboot项目使用。需要用到zookeeper来协助完成。如果一个任务执行阻塞,可能会影响其他任务执行。二.Spring提供的定时任务。这个用起来非常便捷。注解标识这个方法,就OK了,也不复杂。五、Elastic-Job。三.xxl-job。...原创 2022-07-27 16:05:21 · 245 阅读 · 0 评论 -
函数式编程
在日常的开发过程中,当我们调用某个方法时,方法的入参 是一个接口,那么可以通过 匿名内部类的方式来实现。比如 线程类,入参是一个 Runnable 接口,入参只能是一个实现了Runnable接口的 类对象:一般的写法:这种写法,看起来没什么问题,但是,如果 代码中有类似大量的代码,就会觉得不是很好看了。于是,使用函数式编程写法:这样看起来,是不是特别简洁。针对第一种写法和第二种写法,实际上都是 JDK的一种语法,作为使用者,只能按照别人的规则来使用就好了。他们表达的意思都是一样的,就是 入原创 2022-07-03 18:21:59 · 549 阅读 · 0 评论 -
Redis专题
String 1. 设置有一个特点,可以设置过期时间2. 可以追加或者截取某个字符串返回3. 可以原子增加4. SET if Not eXistsHash对于增加,有三类情况:1. 单个增加k-v 或者 批量增加 k-v2. 原子性的修改 v 3. putIfAbsent删除只提供了一个方法单个删除k 或者批量删除k查询的几种情况:1. 查询单个k2. 批量查询多个 k3. 一次查询所有的 k-v4. 查询所有的 k5. 查询所有的 v6. 判断某个k是否存在Lis原创 2022-07-02 19:06:01 · 207 阅读 · 0 评论 -
简述Java序列化的几种方式
使用 protobuf,首先需要创建 .proto 文件, 该文件 定义了 将 序列化的 结构 数据。需要根据 规范 来创建 定义 .proto 文件,这个是首先需要 掌握的。可以封装到公共的包来使用步骤:1. 创建 .proto 文件2. protoc 生成 代码 或者 maven 插件生成代码3. 使用,比如 使用 proto文件 生成了一个RequestWxj,就可以来完成 数据的序列化反序列化// 序列化RequestWxj.newBuilder().build().toByteArray原创 2022-06-09 15:33:29 · 2085 阅读 · 0 评论 -
Mysql连接数据库服务概述
如何连接数据库?数据库服务启动后,如果用客户端工具,如 Navicat连接的话,需要提供 数据库服务的ip、端口、数据库用户名和密码这些信息就能连接上。可以看到 当前数据库实例上的所有数据库。使用Java语言怎么连接的呢?常用的数据库连接池如 Hikari、Druid等等连接数据库有什么不一样吗?Java提供的统一接口、数据库厂商对接口进行实现、第三方数据库连接池工具包对代码的封存关系图如下:因此,可以得知,连接数据库的原理,就是 数据库厂商实...原创 2022-05-19 15:36:57 · 657 阅读 · 0 评论 -
实际包存在,编译时报包不存在
问题: 运行程序报错:程序包不存在实际是存在的,idea也不报错,只是编译是会报错。解决过程:maven配置、重新导入包、包的scope、JDK版本、重启IDEA等等都试了,还是不行。解决问题:执行 命令mvn idea:idea 再此编译OK:...原创 2022-05-15 12:56:20 · 6236 阅读 · 4 评论 -
日志组件简单使用
目录关系图实现slf4j + logbacklog4jJCL + log4jJCL+logbackslf4j + log4j简单梳理日志使用方式,包括日志关系图、不同日志的依赖、日志配置文件、日志使用,便于学习和使用。 日志组件包括: 接口层+适配层+实现层,典型的面向接口编程,依赖倒置原则,抽象与实现分离。这也是不断的完善 慢慢发展的结果。可以把日志看成是三个人实现的,每个人的具体实现不一样,为了统一规范,有两个人自己提供了接口层。在使...原创 2022-05-14 18:52:21 · 659 阅读 · 0 评论 -
mybatis简单示例及常用方法
mybatis的前身 是 ibatis看下 ibatis落幕介绍:ibatis 2002年创建,2010年退役。https://ibatis.apache.org/mybatis中文网:https://mybatis.net.cn/index.htmlmybatis 使用一 JAVA+MyBatis这种使用 mybatis的方式,是最原始的,简单的,不需要 spring体系。 在 java 代码中使用 mybatis就能够完成数据库的操作。java 即使不用mybatis原创 2022-05-04 19:04:55 · 1881 阅读 · 0 评论