自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(138)
  • 收藏
  • 关注

原创 cglib

在AOP框架中,如Spring AOP,默认情况下使用JDK动态代理,但若目标对象没有实现接口,则转而使用CGlib来创建代理对象,实现在方法前后插入自定义逻辑(如日志记录、事务管理等)。不同于ASM库直接操作字节码,CGlib采取了更高层次的抽象,使得开发者可以以面向对象的方式创建代理类或者子类,而无需了解底层字节码的细节。操控和分析框架,它允许开发者在运行时或者编译时期动态地生成、改变或者分析类。(仅能代理实现了接口的类)时,CGlib可以创建目标类的子类作为代理,因此适用于没有实现接口的类的增强。

2024-07-03 21:59:50 311

原创 AOP基本概念

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,以提高代码的模块化程度和可维护性。(顾问)是一个关键的概念,它代表了一个切面(Aspect)的配置信息,决定了切面应该在何时何地执行(即匹配的切入点Pointcut)以及如何执行(即通知Advice)):在连接点上执行的具体操作,如前置通知(Before)、后置通知(After)、环绕通知(Around)等,用于实现切面的具体逻辑。

2024-07-03 10:47:00 299

原创 java.util.Optional<T>

这个filter 跟 Stream的filter不一样。这个filter 返回的是 Optional对象实例。ofNullable : 如果value为空,则返回 带有空值的 实例。of : 如果 value 为空,则抛异常。通过两个静态方法来获取实例。

2024-07-02 15:55:31 182

原创 spring aop 初探

JDK动态代理的 InvocationHandler 的实现类为 JdkDynamicAopProxy,其增强功能由 advised 完成。获取 注解的value值,通常返回的是 标记有 @Pointcut 注解的 方法名。针对每个bean,找到所有 没有标记 @Pointcut 注解的方法。对每个方法查找对应的切面,标记 标记 @Around等注解的方法。第一部分,直接查找所有的 Advisor类型的bean。根据切面的类型,返回不同的Advice类型的对象。第二个参数,调用的代理的接口中的方法。

2024-06-28 16:45:25 1071

原创 AbstractApplicationContext#refresh

因为 spring boot 启动 servlet模式使用的是 org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext 继承自 org.springframework.web.context.support.GenericWebApplicationContext,因此 这里实际基本等于啥都没做。而 beanfactory 在实例化 时构造。

2024-06-26 18:47:17 999

原创 ConfigurationClassPostProcessor

这个类很复杂。

2024-06-26 15:30:32 393

原创 spring cache

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 完成了 缓存的 自动配置。最终会将缓存信息写到 org.springframework.cache.support.AbstractCacheManager#cacheMap。在使用时,需要加入 org.springframework.cache.annotation.EnableCaching 注解。缓存类型的枚举顺序,就是使用的优先级。用于生产缓存的key。

2024-06-25 14:19:17 294

原创 简单了解雪花算法

ID 由多个数据组合拼接成64位,分别是 时间戳 + 服务器节点ID + 序列号,每个数据项占的位数不固定,可以根据实际需求设置。所以,时间戳移位 的结果 和 服务器节点ID 移位的结果 进行 按位或运行。将时间戳,节点ID,序列号 三个 long 型的 数字 进行 移位 和 按位或 运算,就得到最终的UID。移位 和 按位或 操作 都是 二进制 位操作,操作的对象 是 一个 二进制位 0或者1。对于十进制的 long 型 数值,移位操作 是 先转为 二进制数 再进行移位操作。

2024-06-21 18:01:24 209

原创 Nacos配置中心不可用会有什么影响

基本上不会配置这个JM.XX.XX,所以 配置存储在磁盘中的目录就是 user.home 目录下。当服务中的配置中心使用的是Nacos时,如果Nacos不可用,那么微服务应用会报异常吗?1. 微服务应用在读取配置时,首先读取的是本地数据。本地数据是存储在 磁盘文件中的。2. 如果本地缓存文件不存在,则读取Nacos配置中心的配置。当读取到配置文件后,会把数据写到本地文件中。

2024-06-18 20:53:24 763

原创 spring boot接入nacos 配置中心

注意, nacos-config-spring-boot-starter 的版本内 引入了 nacos-client,需要注意引入的版本 是否与nacos服务端匹配。这里使用的 nacos 服务端 是 1.x版本,所有引入的包也是1.x的才可以。1. spring boot 版本 (spring boot 2.x )这种方式 只是简单的拉去配置中心的内容,需要自己解析 配置内容和监听更新。2. nacos 配置中心 服务端 版本 (1.1.4)1. 启动 nacos 服务端,这里不做解释。

2024-06-17 17:53:20 695

原创 Nacos启动报错

启动nacos,发现问题原因,就是下面这个方法报的空指针,Nacos 1.1.4引入的 mysql客户端版本是5.1.34。而我本地使用的 mysql 数据库版本是 8.0.26。mysql 客户端版本 和 服务器版本 不一致导致的。

2024-06-14 15:32:37 335

原创 开窗函数!

开窗函数(Window Function)是SQL中的一种高级功能,允许你在一组相关行(一个“窗口”)上执行聚合操作,而不像传统聚合函数(如SUM(), AVG(), COUNT())那样将所有匹配行合并成单个汇总行。分析函数:如LEAD(), LAG(), FIRST_VALUE(), LAST_VALUE(),用于访问同一窗口内的其他行数据。聚合函数:如SUM(), AVG(), COUNT(), MIN(), MAX(),但它们在每个窗口内计算,而不是整个结果集。

2024-06-03 14:11:42 274

原创 spring 源码解析

别点赞别收藏,你是机器人吧!!!

2024-06-02 08:46:00 100

原创 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 424

原创 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 422

原创 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 310

原创 spring boot常用的filter

由 HttpEncodingAutoConfiguration 注入。由 WebMvcAutoConfiguration 注入。由WebMvcAutoConfiguration注入。由 WsServerContainer 注入。

2024-05-13 21:08:59 315

原创 OuterClass.this cannot be referenced from a static context

这里 直接new 非静态内部类,而 并没有new 外部类,就相当于 外部类实例不存在,外部类实例不存在的情况下,他的成员怎么能存在呢?非静态内部类可以 访问 外部类的 所有 成员和方法,包括私有的。可以理解为,非静态内部类的实例中,存在一个 外部类的 this的引用。静态内部类,因为可以独立实例化,在静态内部类中 不存在 外部类的 this引用,所以 静态内部类只能访问外部类的 静态成员。如果是静态内部类,可以 直接独立的进行 new静态内部类。对于访问权限来说,非静态内部类的权限 大于 静态内部类。

2024-05-10 21:43:47 243 1

原创 几种反序列化方式的性能比较

【代码】几种反序列化方式的性能比较。

2024-04-28 22:37:15 125

原创 HttpURLConnection使用基本操作

http请求 一般包括 请求参数/header/cookie等参数的设置。

2024-04-26 17:12:21 270

原创 反序列化常用

【代码】反序列化常用。

2024-02-19 09:47:15 112

原创 对象转换工具mapstruct

通常进行对象互转的时候是用 的 BeanUtils工具类,有另外一种 mapstruct也可以。不得不感叹,各种轮子纷繁复杂啊。

2024-01-22 14:31:40 418

原创 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 157

原创 org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessor

然后,再找到所有的BeanDefinitionRegistryPostProcessor,依次处理 PriorityOrdered、Ordered、其他,进行排序后调用 postProcessBeanDefinitionRegistry,然后加入到registryProcessors 集合中。集合变量也挺多的,看着看着就晕了。这个集合,记录了 找到的所有的的BeanDefinitionRegistryPostProcessor,用来在后面调用BeanFactoryPostProcessor时进行过滤。

2023-10-08 11:21:42 181

原创 写时 复制

就是 更新数据的时候 先复制一份数据,然后再副本中进行更新,更新后再替换原数据。这样可以保证只有更新数据的时候对数据加锁,读数据依然读原数据而不用加锁,提高读数据的性能。写时复制策略应用很广泛,JDK 提供的 CopyOnWriteArrayList 就是写时复制的一种应用。在使用时,需要根据具体使用场景 来选择 是否 使用写时复制策略。写时复制,是一种空间换时间的策略。

2023-09-15 10:57:30 140

原创 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

原创 new HashMap{{put(“a“,“b“)}}

前面提到,这种写法是属于 定义了一个匿名内部类,继承了 父类,所以,这里直接使用一个 语句块 来调用 父类的方法。不光是HashMap,像list也可以。比如:下面这个就是 定义了一个 匿名的Test子类,旁边那个向下的箭头就是说明有子类。对于new HashMap{{}};上面这种写法大家不陌生吧,实际上 就是 定义了一个匿名内部类。为什么要搞一个语句块在哪里?别只知道静态语句块。

2023-09-06 16:52:23 235

原创 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 530

原创 关于类和接口

抛开具体的设计模式,在看不同框架的源码时,一般他们都是遵循了面向接口编程的,也就是依赖倒置。在变量类型、方法返回类型、入参类型都是接口或者抽象类,这样就实现了依赖倒置,也就是依赖接口。这样做的优点,就是可以有不同的实现类型,而不用改动高层次的逻辑。如果要实现里氏替换,那边必须是依赖倒置的,如果遵循了依赖倒置,那么也实现了里氏替换原则。驱动管理类,获取连接的方法,就是依赖倒置原则的实现,面向的接口编程,依赖抽象。关于设计模式,经常会说面向接口编程,而面向接口编程,对应的是哪一个原则呢?

2023-08-31 10:53:52 680

原创 JDBC使用了哪种设计模式

所以,可以将JDBC中定义的接口看成是 抽象部分,而mysql 、oracle看成是具体的实现,这种将抽象和实现分开,就是桥接模式的定义啊。所以,不能只关注 实际的接口类或者实现类之间的关系,应该从宏观上来看他们之间的关系,因此,JDBC就是使用了桥接模式。可以看到,不论是mysql 还是 oracle,都对 JDBC接口进行了实现。看一下策略模式类图(图解设计模式),好像是挺像的。将抽象部分与它的实现部分分离,使它们都可以独立地变化。不同的数据库厂商提供操作自己数据库的驱动包,立于使用它的客户而变化。

2023-08-30 15:20:11 742

原创 springboot日志文件名称为什么叫logback-spring.xml

如下代码完成 日志配置文件的定位,最终获取到 logback-spring.xml日志配置文件咯。如题,为什么springboot日志配置文件叫logback-spring.xml?在整个项目中搜索 logback-spring.xml 并没有搜索到。

2023-08-22 11:19:58 1167

原创 远程debug竟如此简单

idea选择 remote 模式,host 填上 远程服务的ip,port 填上 debug 端口,就行了。红框 框起来的是 idea自动生成的 jvm启动参数,需要 启动的时候 在服务器环境变量加上。一张图告诉你如何远程debug。

2023-08-17 14:34:06 64

原创 clone浅拷贝

2. 如果值 是 引用类型,那么就是 copy一份该引用,那么,此时,新对象和老对象 都持有 该引用,其中一方修改改引用对象的数据,另一方也是拿到最新修改的值。通过调用 clone() 方法,完成 对象拷贝。该方法是Object类中的方法,所有对象都继承该方法。我们经常用的 BeanUtils进行对象属性copy,也是浅拷贝。1. 如果值 是 基本类型,那么就是 copy 一份 该值。通过一个实例对象 生成另一个对象,称为 拷贝。3. clone 方法 不会调用 构造函数。该接口是一个 标记接口。

2023-06-27 17:10:39 188

原创 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

原创 Spring重试功能

【代码】Spring重试功能。

2023-06-19 19:52:28 68

原创 开发工具介绍

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

原创 virtual-machine shutdown hook 不执行

将应用打包后,上传至 linux 服务器,执行 java -jar xxx.jar 运行。因为 kill -9 ,是强制退出,这个时候jvm没办法执行hook了。如果用 kill -9 pid,hook 是不会执行的。添加一个 线程时,用于在结束应用时关闭资源。

2023-06-12 14:08:52 468

原创 spring boot MVC 流程简单梳理

实际上就是 遍历 List列表 ,而列表的初始化,是在 Servlet第一次加载的init中完成的。首先是 容器启动,把Handler 和 url 之间的映射 加载好。首先从容器中获取,容器中没有获取到时,再从配置文件中获取。这些准备工作做完之后,第一步的 查找 Handler 才能完成。而这些准备工作,也是在应用启动时完成的。找到handler后,再把handler的 所有 mapper方法找到,包装成。所以,在容器启动之后,容器中已经加载了 默认的。在查找handler这一步,是怎么做的呢?

2023-05-24 21:56:42 1011

原创 这是JWT 简单使用

使用和 生成 JWT 相同的 秘钥,因为 token中已经有 算法信息了,所以不用再设置算法。确定 使用的加密算法,jjwt 工具包已经 给我们提供好了各种加密算法的枚举。如果 token 失效 或者 加密 秘钥和解密秘钥 不同,都会解析失败。解析获取到 Claims 对象,可以获取 body 中的数据。另外,可以构建 JWT 的创建时间 和 失效时间。OK,Java工具包如下,使用 jjwt。构建Body部分,该部分 是一个 Map。头部,记录 使用的 加密算法的类型。Body,记录一些额外信息。

2023-05-24 18:02:59 768

原创 kafka配置

因此,需要用 delivery.timeout.ms (默认 2min) 来控制 发送的总时长,所以,当一条消息发送失败时,但是时间没有到 delivery.timeout.ms设置的时间时,就会继续重试,注意的是,需要大于 delivery.timeout.ms + linger.ms。buffer.memory (默认32M) 可以理解成 socket 缓冲大小,当 数据量 超过,则后来的数据 就要等待,等待的时间由 max.block.ms (默认 1min)设置。默认0 即表示有数据时就发送。

2023-05-23 11:19:00 606

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除