java

Reactor 多任务并发执行且结果按顺序返回第一个

2022-09-22
目录 1 场景 2 创建 service 2.1 创建基本接口和实体类 2.2 创建 service 实现 3 主体方法 4 实现异步 4.1 subcribeOn 实现异步 4.2 CompletableFuture 实现异步 1 场景 调用多个平级服务,按照服务优先级返回第一个有效数据. 具体case:一个页面可能有很多的弹窗,弹窗之间又有优先级.每次只需要返回第一个有数据的弹窗.但是又希望所有弹窗之间的数据获取是异步的.这种场景使用 Reactor 怎么实现呢? 2 创建 service

Java设计模式中的门面模式详解

2022-09-22
目录 门面模式 概述 应用场景 目的 优缺点 主要角色 门面模式的基本使用 创建子系统角色 创建外观角色 客户端调用 门面模式实现商城下单 库存系统 支付系统 物流系统 入口系统 客户端调用 门面模式 概述 门面模式(Facade Pattern)又叫外观模式,属于结构性模式. 它提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口.使得子系统更容易使用. 客户端不需要知道系统内部的复杂联系,只需定义系统的入口.即在客户端和复杂系统之间再加一层,这一层

从 PageHelper 到 MyBatis Plugin执行概要及实现原理

2022-09-22
目录 一.背景 二.MyBatis 执行概要图 三.MyBatis 核心对象介绍 四.Plugin 实现原理 1.定义 Plugin 2.注册拦截器 3.执行拦截器 4.Plugin 的动态代理 总结 一.背景 在很多业务场景下我们需要去拦截 SQL,达到不入侵原有代码业务处理一些东西,比如:历史记录.分页操作.数据权限过滤操作.SQL 执行时间性能监控等等,这里我们就可以用到 MyBatis 的插件 Plugin.下面我们来了解一下 Plugin 到底是如何工作的. 使用过 MyBatis 框

Java结构型设计模式中代理模式示例详解

2022-09-21
目录 代理模式 分类 主要角色 作用 静态代理与动态代理的区别 静态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 JDK动态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 小优化 CGLIB动态代理的基本使用 创建抽象主题 创建真实主题 创建代理主题 客户端调用 小优化 CGLIB与JDK动态代理区别 1.执行条件 2.实现机制 3.性能 代理模式 代理模式(Proxy Pattern)属于结构型模式. 它是指为其他对象提供一种代理以控制对这个对象的

java自旋锁和JVM对锁的优化详解

2022-09-21
目录 背景 好处 AtomicLong的实现 getAndIncrement方法 实验 缺点 适用场景 JVM对锁做了哪些优化? 自适应的自旋锁 锁消除 锁粗化 偏向锁/ 轻量级锁/ 重量级锁 锁升级 背景 先上图 由此可见,非自旋锁如果拿不到锁会把线程阻塞,直到被唤醒: 自旋锁拿不到锁会一直尝试 为什么要这样? 好处 阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大. 在很多场景下,可能我们的同步代码块的内容并不多,所以

Java实现批量导出导入数据及附件文件zip包

2022-09-21
目录 前言-应用场景 一.导出ZIP包 1. 列表数据导出到本地excel文件 2. 下载附件信息 3. 生成压缩文件(浏览器下载) 4. 删除临时目录 二.导入ZIP包 1. 上传zip包,解压到临时目录 2. 读取附件信息上传到文件服务器 3. 读取Excel文件存入数据库 4. 删除临时文件 前言-应用场景 某系统在不同单位使用时存在两套生产环境,他们的数据不是互通的,所以这些单位的上一级领导部门在统计数据的时候希望将A系统的数据和附件信息导出到一个压缩包里,然后把这个压缩包一键导入到B系

Reactor中的onErrorContinue 和 onErrorResume

2022-09-20
目录 前言 1 基础功能 2 只有 onErrorResume () 3 只有 onErrorContinue() 4 onErrorResume() 然后 onErrorContinue() 5 使用 onErrorResume() 模拟 onErrorContinue() 6 使用 onErrorResume() 和下游的 onErrorContinue() 模拟 onErrorContinue() 前言 这似乎是 Reactor 的热门搜索之一,至少当我在谷歌中输入 onErrorCont

Java结构型设计模式之享元模式示例详解

2022-09-20
目录 享元模式 概述 目的 应用场景 优缺点 主要角色 享元模式结构 内部状态和外部状态 享元模式的基本使用 创建抽象享元角色 创建具体享元角色 创建享元工厂 客户端调用 总结 享元模式实现数据库连接池 创建数据库连接池 使用数据库连接池 享元模式 概述 享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现.属于结构型模式. 类似于线程池,线程池可以避免不停的创建和销毁多个对象,消耗性能.享元模式提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用

使用Spring Boot进行单元测试详情

2022-09-19
目录 前言 使用 Spring Boot 进行测试系列文章 依赖项 不要在单元测试中使用Spring 创建一个可测试的类实例 属性注入是不好的 提供一个构造函数 减少模板代码 使用Mockito来模拟依赖项 使用普通Mockito来模拟依赖 通过Mockito的@Mock注解模拟对象 使用AssertJ创建可读断言 结论 前言 本文给你提供在Spring Boot 应用程序中编写好的单元测试的机制,并且深入技术细节. 我们将带你学习如何以可测试的方式创建Spring Bean实例,然后讨论如何使

Java 深入学习static关键字和静态属性及方法

2022-09-19
目录 static关键字 静态属性 静态方法 静态方法的使用 静态代码块 static关键字 在定义一个类时,只是描述某事物的特征和行为,并没有产生具体的数据,只有通过new关键字创建该类的实例对象时,才会开辟栈内存及内存,在堆内存中要保存对象的属性时,每个对象会有自己的属性. 如果希望某些属性被所有对象共享,就必须将其声明为static属性,如果属性使用了static关键字进行修饰,则该属性可以直接使用类名称进行调用,static关键字还可以修饰成员方法. 静态属性 如果在Java程序中使用s

minio安装部署及使用的详细过程

2022-09-19
目录 一.服务器安装minio 1.进行下载 2.新建minio安装目录,执行如下命令 二.进行访问,并设置桶 1.访问 三.springboot进行实现 1.引入依赖 2.在 application.yml 文件中加入 MinIO 服务器的相关信息 3.创建实体类 4.创建核心配置类 5.上传工具类 6.controller接口 测试 总结 一.服务器安装minio 1.进行下载 下载地址: GNU/Linux https://dl.min.io/server/minio/release/li

Springboot引入hibernate配置自动建表并进行增删改查操作

2022-09-19
目录 前言 一.引入依赖 二.配置yml 三.写代码 四.测试结果 前言 有些业务比较复杂,比如我们需要新建10张表,每张表有10个字段,如果用手工来操作,肯定非常浪费时间,而且随着代码中对实体类的修改,还要同时修改数据库表,有时候写着写着就忘了,代码改了,数据库没改,这种问题使用 hibernate 的自动建表就好啦. 一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac

RocketMQ Push 消费模型示例详解

2022-09-19
目录 使用 DefaultMQPushConsumer 消费消息 基于长轮询机制的伪 push 实现 客户端侧发起的长轮询请求 服务端阻塞请求 客户端回调处理 客户端发起请求的底层逻辑 PullCallback 回调 总结 Push 模式是指由 Server 端来控制消息的推送,即当有消息到 Server 之后,会将消息主动投递给 client(Consumer 端). 使用 DefaultMQPushConsumer 消费消息 下面是使用 DefaultMQPushConsumer 消费消息的

springboot-rabbitmq-reply 消息直接回复模式详情

2022-09-18
目录 一.使用场景 二.Reply实战 (1)依赖与YML配置 (2)RabbitMq bean配置 (3)消息生产端 (4)消息消费端 (1)方法一:sendTo注解+方法返回值 (2)方法二:读取生产端的消息使用模板发送 (3)方法三:方法返回值 (4)测试 一.使用场景 MQ的作用包括了解耦.异步等. 通常生产者只负责生产消息,而不关心消息谁去获取,或者消费结果如何:消费者只负责接收指定的消息进行业务处理而不关心消息从哪里来一级回复业务处理情况.但我们项目中有特殊的业务存在,我们作为消息生

Java利用哈夫曼编码实现字符串压缩

2022-09-18
赫夫曼编码基本介绍 1) 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法 2) 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一. 3) 赫夫曼编码广泛地用于数据文件压缩.其压缩率通常在 20%-90%之间 4) 赫夫曼码是可变字长编码(VLC)的一种.Huffman 于 1952 年提出一种编码方法,称之为最佳编码 在通信领域中几种信息处理方式的区别(以字符串" i like like like java do you li

JVM内存增强之逃逸分析

2022-09-18
目录 概念 逃逸分析参数设计 使用逃逸分析 FAQ 概念 逃逸分析一种数据分析算法,基于此算法可以有效减少 Java 对象在堆内存中的分配. Hotspot 虚拟机的编译器能够分析出一个新对象的引用范围,然后决定是否要将这个对象分配到堆上. 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸. 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸. //对象发生了逃逸,不会在栈上分配,有可能导致GC STW public StringBuffer append(Str

mybatis-plus实现自定义SQL、多表查询与多表分页查询语句实例

2022-09-17
目录 前言 1.自定义SQL 2.多表查询 3.多表分页查询 4.多表分页条件查询 总结 前言 本文介绍了在mybatis-plus中如何实现:自定义SQL语句,多表查询语句,多表分页查询语句 在说怎么实现之前我们要先明白一个概念,就是mybatis-plus是在mybatis的基础上进行增强,并不做改变,所以mybatis的操作在mybatis-plus中也是一样可以使用的,咱们直接上代码 1.自定义SQL 在mapper中自定义一个方法即可 @Repository public interf

SpringBoot实现发送QQ邮件的示例代码

2022-09-17
目录 配置发送邮件 1.引入SpringBoot的Mail依赖 2.配置邮箱发送的Bean 3.发送测试邮件 4.查看效果 应用启动&停止邮件通知 总结 在跑个人应用的时候,想引入一个通知机制,在应用启动和停止的时候通知下自己(因为应用部署在服务器上,不想每次都到服务器上看): 发送短信要申请模板,而且还收费... 发送手机通知又太多依赖: 钉钉.微信:至于钉钉和微信骚扰消息太多了,容易漏掉通知信息 剩下的就是发送邮箱.免费.而且没有那么多的通知干扰,邮箱App在收到邮件的时候会自动的发生一条P

Java获取上月份最后一天日期8位的示例代码

2022-09-17
先给大家介绍下Java获取上月份最后一天日期8位. 代码如下所示: /** * 获取上个月的最后一天23点59分59秒的时间 */ private String getBeforeLastMonthdate()throws Exception{ SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar=Calendar.getInstance(); int month=calen

Java实现单机版五子棋游戏的示例代码

2022-09-17
目录 前言 主要需求 主要设计 功能截图 代码实现 总结 前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一.主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋. 容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性. 用java语言实现