- 博客(185)
- 资源 (5)
- 收藏
- 关注
原创 设计模式简述(十五)观察者模式
观察者模式,顾名思义就是一个对象观察着其他对象,一旦被观察的对象发生变化时,观察者对象也要做出相应动作。通常包含2个抽象角色及其对应的实现。
2025-05-01 16:44:47
404
原创 设计模式简述(十四)组合模式
组合模式用于描述部分与整体的关系,将个体对象与组合对象的行为统一,便于维护整个数据集。可以在通用抽象中定义一个上级节点,然后在父节点添加子节点同时为子节点关联父节点。由于所有节点操作一致,在使用中无需强转。在有的场景中,需要支持向上查询。
2025-05-01 16:21:56
302
原创 设计模式简述(十三)适配器模式
适配器模式常用于系统已经上限稳定运行,但现有需求需要将两个不匹配的类放到一起工作时使用。这种模式,正应了那句软件领域的名言:没有什么是加一层解决不了的。那么不兼容类除了成员的方式关联外。适配器还可以继承不兼容的类。在得到不兼容对象后,先将其转为适配器对象,再将其传入原有接口。要实现适配器模式,原有系统类需存在抽象层,否则无从谈起。也就是说这是一个迭代阶段使用的模式。
2025-04-06 23:53:35
285
原创 设计模式简述(十二)策略模式
定义一组策略,并将其封装起来到一个策略上下文中。Java中的枚举就是一种自带表驱动属性的数据类型。由调用者决定应该使用哪种策略,并且可以动态替换。调用方选择一个策略,并创建策略上下文 发起调用。来规避具体策略对调用方的影响考虑。同样只需传入策略标识即可。基于以上传统策略中使用。
2025-04-06 23:15:08
462
原创 设计模式简述(十)责任链模式
通常,在一个业务场景下会对整个责任链进行初始化,确定这个链上有哪些Handler。可以考虑将这些处理器添加到一个链上,让请求逐个经过这些处理器进行处理。匹配的条件通常包含在请求参数中,用于与每个Handler内条件匹配。这里参数就简单定义一个类,不提抽象层了。然后将请求委托给责任链。如果一个请求要经过多个。在实际使用中,可以将。
2025-04-06 22:04:49
371
原创 设计模式简述(九)命令模式
命令对象封装了该命令需要的所有逻辑,不需要调用方关注内部细节。命令模式是一种体现高内聚的行为模式。,由这个命令对象完成所需业务调用。将整个请求封装成一个。
2025-04-06 19:27:18
388
原创 设计模式简述(八)中介者模式
其实就是字面意思,将和其他模块交互的部分交给中介完成(由中介去沟通各方。为了简化多个类间复杂的耦合关系,单独定义一个中介者。将边界交互的部分交给中介者,从而简化各个类内部逻辑。
2025-04-06 18:42:03
362
原创 设计模式简述(七)原型模式
基于已有对象,利用JDK的Cloneable接口,生成一个新的对象。当构建基础对象比较耗时时,采用Clone方式。常用于需要同时创建多个对象的场景。否则直接构建基础对象。
2025-04-06 01:19:02
291
原创 设计模式简述(六)代理模式
所谓动态代理,不必在编码阶段把代理类生成出来,而是代码运行时,动态创建的代理对象。说到代理模式,Spring AOP 就是一种基于动态代理的实现。基于JDK的动态代理,需要代理的类必须声明接口。基于原有方法进行功能增强的一种模式。
2025-04-06 01:06:59
301
原创 设计模式简述(五)建造者模式
与工厂方法类似,为了避免调用方与众多建造者子类直接交互。通常用于构建一系列复杂对象,这些对象有一定的共性。我们可以通过不同的建造者,组装不同的对象。建造者模式属于创造型设计模式。我们可以定义一个中间协调类。
2025-04-05 23:43:00
463
原创 设计模式简述(三)工厂模式
如果产品本身就有一些共通的地方,我们可以将产品划分到同一个工厂的不同产品线,这些产品的生产可以共用一些资源。由于每种产品定义了对应的工厂类,因此工厂方法不需要类型参数就非常明确需要创建的实例。多种类型产品初始化逻辑不一致时,可以采用不同工厂实例来初始化对应类型的产品。如果对象创建逻辑简单且一致,可以使用简单工厂。传入想要生成的实例类型。工厂模式用以封装复杂的实例初始化过程,供外部统一调用。以上工厂方法,一个产品就需要一个工厂类。
2025-04-05 22:17:10
444
原创 MySQL中Json字段
MySQL在5.7.8中提供了Json类型的支持。官网json字段支持:json数组(数组中可以是不同的类型)、json对象json。
2024-12-17 23:28:42
1220
1
原创 Java8到21新特性
使用var自动推断局部变量类型使用上更便捷简单,支持Http1.1、Http2。也支持异步请求。这里直接把JDK中的示例代码扒出来看看就行了。还有一些扩展的东西。像什么BodyHandler、BodySubscriber等等。感兴趣可以去看看异步示例改善Optionaljava8的Optional,仅仅是对一个可能为空的对象的封装。在Java9中,对其进行了进一步封装。在java11中增加了isEmpty方法,逻辑与isPresent相反。ifPresentOrElse直接提供两个函数
2024-12-17 00:12:03
1107
原创 Spring Boot项目使用虚拟线程
这里要说的是直接将Spring Boot项目的http请求处理的线程换成虚拟线程。虚拟线程正式发布是在JDK21,对于Spring Boot版本选择3以上。写一个简单的方法查看当前线程信息。关于虚拟线程本身的使用,
2024-12-15 18:11:24
591
原创 DSA 和 ECDSA 签名算法
DSA 是一种基于离散对数问题的数字签名算法。它使用私钥和公钥对来进行签名和验证操作。ECDSA 是基于椭圆曲线密码体制(ECC)的数字签名算法。它利用椭圆曲线上的点的运算来实现签名和验证功能。同样也是使用非对称密钥对进行签名、验签。它们底层都是基于hash进行一系列运算虽然这两算法在实际工作种还没用到,但是RSA的签名都用过。虽然在实现算法上天差地别,但对于开发者使用角度而言。到道理都类似,私钥签名、公钥验签。
2024-12-08 20:11:53
562
原创 Hmac签名算法
其全程大概是:Hash Message Authentication Code(前面的Hash是后面的定语,这是一种基于Hash计算的签名方式,那它就支持一系列的hash算法)因为通常的比较操作,会在从头比到尾,直到发现不一致或者到达末尾就返回结果;其构建密钥,也分为根据外部密钥串构建字节切片和生成指定长的随机密钥。到这里,关于常用的关于常用的加解密、签名、摘要计算的介绍就翻篇了。既然理论上有这个风险,那开发者可以选择使用更安全的方式去比较。从理想的环境中看,每次计算到特定位置的时间是一致的。
2024-12-07 01:46:08
1121
原创 Rsa加解密 + 签名验签
Rsa加解密概述聚合算法名称(用于创建加密器)基本概念填充方式分块加密基本使用生成密钥加解密创建加密器设置模式(加密)、公钥对明文加密,并对结果进行Base64编码对以上结果,进行解密 设置模式(解密)、私钥签名 + 验签创建签名器初始化签名器,加载签名明文生成签名初始化验签参数,加载签名明文验签关于初始化加密器和签名器的重载方法概述RSA 是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据,或者私钥用于签名,公钥用于验证签名。聚合算法名称(用于创建加密器)JDK官
2024-12-01 22:04:15
1401
原创 Aes加解密
长度不是16的倍数,那么则需要进行填充,这就引申出了填充模式。这种方式在加密一个块时,需要使用上一个块加密后的数据与。也就是说每一个块的加密都不一样。AES是一种对称加密算法。通过一系列计算将明文转换成一个密文。在Java中已经将其行为统一了。加密和解密的对象通常是字节数组(通常会将其转换为可见的字符串。加密后的数据,可能有很多是。AES中现在用得最多的就是。
2024-12-01 22:03:23
1170
原创 Base64编码概念
首先,要明确一点就是Base64的目的是将一个字节数组转换为上述字符表示。比较通用的是76个字符,这是早期为了方便查看定下来的。在一些需要查看编码后的内容的场景,可能还会对单行字符数进行限制。Base64通常用于以文本形式传输和存储二进制数据。然后在末尾补4个 0,凑齐12位(6位的倍数)。然后末尾补2个0,凑齐18位(6的倍数)特别是在一些相对较小的文件中使用。然后将其分为2个6位的二进制的组。然后将其分为3个6位二进制的组。常规的Base64编码结果由。最后查ASCII码表。最后查ASCII码表。
2024-12-01 22:02:47
212
原创 加解密系列之摘要算法
MD5(摘要长度16字节)SHA-1(第一代散列算法,摘要长度20字节)SHA-2(第二代散列算法,后面数字代表 摘要位数衍生具体的算法包括:SHA - 224SHA - 256SHA - 384SHA - 512SHA - 3(第三代散列算法,基于第二代改善而来,后面数字代表 摘要位数但是低版本JDK并不支持SHA3 - 224SHA3 - 256SHA 3- 384SHA3 - 512。
2024-12-01 22:01:55
401
原创 Spring扩展点(四)Spring地区语言扩展 & 创建Filter & 多语言配置
将其声明为Spring Bean,默认拦截所有请求,需要在 filter() 中根据实际情况拦截。:在java servlet 层面声明filter,并指定拦截的请求。
2024-09-01 18:08:07
441
原创 Spring Cloud Alibaba多实例定向路由
在实际开发和部署中,可能遇到想要定向路由到某个服务的多实例中的某一个实例。有点灰度部署的感觉。还有就是在开发环境,可能想要将请求路由到本地的实例进行Debug。此时,我们就需要根据不同的请求,路由到想要的实例。大致分析下来。给实例打标自定义查找实例的逻辑,匹配上面给实例分配的标记。
2024-08-08 23:28:48
385
原创 Spring扩展点(三)Spring常用内置工具类
Spring常用内置工具类Base64UtilsFileCopyUtilsFileSystemUtilsReflectionUtilsResourceUtilsStringUtilsAopUtilsMethodInvokingBean(简洁反射调用,指定类的指定方法,将其声明为Bean即可在 afterPropertiesSet 阶段触发反射方法调用)Base64UtilsFileCopyUtilsFileSystemUtilsReflectionUtilsResourceUtilsString
2024-05-04 22:54:35
366
1
原创 Spring扩展点(二)Spring事务生命周期
Spring对JDBC事务做了封装,使其易于使用。主要分为声明式事务和编程式事务。@TransactionalEventListener 可以在。方法注册自定义的事务周期函数。对应的事务生命周期会调用自定义。监听事务中发出的自定义事件。
2024-05-04 17:08:09
639
原创 DIV + CSS 布局:盒子内容超出宽度时,不换行,以滚动条形式水平滑动
【代码】DIV + CSS 布局:盒子内容超出宽度时,不换行,以滚动条形式水平滑动。
2024-03-24 03:21:27
1837
原创 浅浅聊下守护线程与用户线程的区别
根据以上的配置:得到一个核心线程和最大线程数都是1,永不销毁的线程池;那么这个线程会一直保持;:其他普通线程基本都可以归到用户线程下,包括主线程。可以看到:JVM几乎是在主线程运行结束的同时就退出了,而没有等线程池中的任务执行完毕。由于这里的线程是以线程池形式运行,因此线程的生命周期实际上由线程池控制,可以看看。核心线程数为:0,也就是说,实际的工作线程都是线程池启动后再创建的非核心线程。不会执行一次指定任务就结束,而是持续运行,直到用户线程全部退出后自动结束。创建的线程池,内部线程均为用户线程,JVM。
2024-02-01 15:48:22
1155
原创 Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 & Redis Lua脚本操作
通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。7.sentinel的notification-script和reconfig-script是用来配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
2023-10-13 15:50:01
1355
原创 解决方案(二)三方数据同步
当接入第三方系统时,可能涉及到同步第三方的数据;如果第三方有主动推送机制还好,可以直接接收推送消息。但是,有的系统并没有主动推送机制;还有即使有推送,可能也有各种异常情况导致的同步失败。此时,就需要我们主动查询。
2023-09-26 23:22:13
594
原创 JDK21新特性 有序集合
Java集合体系中,原来就有有序集合实现,但是没有规范支持有序操作的接口。,用于定义有序集合支持的操作。JDK21 新增了两个接口。
2023-09-26 22:59:32
1138
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人