自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot3.x版本将swagger2.0升级到swagger3.0,使用knife4j-openapi3-jakarta-spring-boot-starter依赖

# 为什么升级swagger3**Spring Boot 3 只支持OpenAPI3规范**注意事项; 1. JDK版本必须 >= 17,因为SpringBoot3.x版本也仅支持JDK17以上 2. 旧版的Knife4j包记得删除,会有依赖冲突导致项目启动失败 3. 使用 Spring Boot 3 请确保引入 springdoc-openapi 2.0+

2024-01-04 17:57:45 855

原创 ObjectMapper序列化和反序列化特性

【代码】ObjectMapper序列化和反序列化特性。

2023-12-14 10:11:00 587

原创 搭建新版security-oauth2协议,流程代码详解,源码分析

最近在学习搭建oauth2协议的开放平台,把搭建框架时的思路以及遇到的问题记录下来。

2023-07-05 16:32:47 830

原创 【shardingsphere 5.x版本使用】,精准分表自定义策略配置,单库分表

5.1.2版本增加一个参数props,将分片策略和全限定类名配置在这个下面。而且精准分片的接口StandardShardingAlgorithm实现类需要实现的方法也多了两个,getProps和} // 新增方法,暂不知用处 @Override public Properties getProps() {} // 新增方法 删除了原init();方法,多了个参数properties @Override public void init(Properties properties) {

2023-04-07 11:19:58 2603 1

原创 springboot项目——统一系统响应对象+「全局异常捕获」,保证系统响应数据结构一致性

无论是成功还是失败,需要先定好一个json的格式。@RestController是常用在controller类上的注解,用来保证接口的响应方法的返回值直接以指定的格式写入Http response body,也就是@Controller和@ResponseBody的复合注解。清楚了这个之后,我们需要的是将每个接口的响应对象都设置为同一个,这样就可以保证了成功请求后的响应参数一致。不过问题来了:接口类型很多种,有响应数组的、Integer类型、String类型、Boolean类型,如何做到一致性呢?

2023-03-28 17:10:38 1173

原创 搞不懂『三级缓存』?与生命周期冲突?为什么代理对象二级缓存不可用?进来看看,助你掌握概念思路

如果只有二级缓存,依旧拿ab举例初始化a放入二级缓存,创建b、注入二级缓存里的a、完成初始化、放入一级缓存,回到a的创建、一级缓存中取到b注入属性、完成实例化。循环依赖解决了对不对,完事!睡觉吧!如果没有代理对象的侵入,循环依赖是可以解决的。初始化a后,由于第一步只做了实例化,并没有生成代理,那么此时的a放在哪里?a是不是没地方去放(记好这里)注入属性发现需要b对象,实例化b、注入属性,当从缓存中找a代理时没有发现(因为二级缓存没有存a的半成品),并且没有缓存a的实例化(没有三级缓存)

2023-02-07 16:02:35 934 1

原创 RabbitMQ面试知识点总结

spring-boot-data-amqp 是自动ACK机制,就意味着 MQ 会在消息发送完毕后,自动帮我们去ACK,然后删除队列中的消息,这样会存在一些问题:如果消费者处理消息需要较长时间,或者在消费消息的时候出现异常,都会出现问题,手动Ack可以避免消息重复消费。一个生产者,一个交换机(directExchange),多个队列,多个消费者,但是通过指定路由key绑定到队列上,完成指定生产者消费者的通信。一个生产者,一个默认的交换机(direct),一个队列,一个消费者。

2023-02-01 13:50:06 305

原创 Redis自动续期迷惑点,默认时间与看门狗的触发机制

首先redisson的实现原理不在这里展开篇幅去讲解了,需要在熟悉原理的基础上进行讨论。在redisson原理的学习时,对看门狗的机制有些疑惑。

2023-02-01 13:36:25 1912

原创 抢红包算法

【代码】抢红包算法。

2022-12-27 15:04:06 113

原创 MySQL分组查询最新的一条记录

其实不然,这样做是为了将子查询的排序生效,这个时候添加order by语句,可以试试,是不是成功的在子查询里进行排序了?其实不然,这样做是为了将子查询的排序生效,这个时候添加order by语句,可以试试,是不是成功的在子查询里进行排序了?:首先分组排序功能在表中的体现一定是两个字段,分组字段(例如用户id,菜单code)和排序字段(创建时间,更新时间)。:首先分组排序功能在表中的体现一定是两个字段,分组字段(例如用户id,菜单code)和排序字段(创建时间,更新时间)。分组时字段谁先谁后无影响。

2022-12-13 10:25:03 2066

原创 Spring Security验证码配置化开发

今天介绍一种以配置器的方式处理验证码生成、校验,流程可以参考Security中的FormLoginConfigurer表单登录配置器,在前两篇中提到的定制化UsernamePasswordAuthenticationFilter过滤器,就是表单登录配置器中的认证实现环节,而FormLoginConfigurer表单登录配置器的作用是定义了登录功能的入口、实现流程(从上文中可以看出我们所做的定制化是对于方法体,于配置器而言,我们的定制化是模板方法模式下的一种实现)。这个是将缓存层拉出来做了通用设计,

2022-11-23 14:09:01 374

原创 分享http客户端框架Retrofit的使用,包含优化单例模式的client创建和Retrofit框架自带的Interceptor定制化

首先是对自定义client的创建,可以参考aliyunOSS的客户端,设计的需求是在任一系统中一次性创建client,并且项目开发者无需关注远程调用时出现的异常,发送短信/语音消息时,类似工具类的静态方法形式使用。client使用单例模式,使用AtomicReference类存储client对象,build方法里面AtomicReference的compareAndSet方法,如果预期值是null则创建client,不为null则返回client对象,就完成了优化版无需加锁的单例模式。

2022-11-21 17:29:52 897

原创 docker部署单机版elasticsearch+kibana可视化管理页面

拉取镜像,这里以7.6.2举例,7.x版本有中文汉化支持,汉化kibana。保存修改后重启容器即可。

2022-11-14 15:21:02 952

原创 SpringSecurity框架流程定制化的进一步优化方案,精简代码

之前讲解过一篇SpringSecurity定制化流程的方案,很多人说看起来比较复杂,这次对其中流程优化部分,顺便记录下最新的理解心得。与全定制化的区别:1. 上文提到自定义UsernamePasswordAuthenticationFilter过滤器,重写attemptAuthentication()方法,通常这里会在这里对验证码,请求方法类型等进行合法性校验由于是优化,肯定是基于之前的代码,因此有些地方不清楚的可以参考上篇文章:

2022-11-14 13:54:56 319

原创 大批量(十万级别)数据导出excel方法代码,分批次查询数据库和写入文件,防止IO溢出,接口异步导出到服务器后上传oss

场景:项目中业务需要导出大批量数据,大到4,50w的数据到excel中,将需求写成功能难点:- 大批量数据一次性查询出较为耗时,需要对表结构设计要求高方可提升查询速度。- 内存溢出,IO异常,一次性几十万的数据读取和写入很大,并发如果上来的场景下可能导致系统接口挂掉。- 接口设计响应速度考虑

2022-11-07 10:49:04 1821

原创 常用脱敏器工具更深层使用,简洁使用,扩展性强

前两天通过自定义序列化的形式实现了脱敏的需求,不过比较简单,扩展能力不够强。刚好公司需要写一个工具放到基建中去,这次就给脱敏器升级下。贴代码前先展示下使用效果,只需要一个注解即可完成脱敏配置。

2022-10-25 11:46:44 557

原创 springboot常用脱敏器实例,基于Jackson序列化实现

在开发中会遇到数据的展示需要做脱敏处理,两种方式:1. 让前端做脱敏处理,但是接口实际上返回了真实数据,所以该方案可行度比较低。2. 后端在序列化的时候做处理,这样既不会影响接口的逻辑,也避免了真实数据在网络中传输。

2022-10-18 14:33:59 676

原创 sql根据出生日期计算当前年龄 函数TIMESTAMPDIFF()

场景: 数据库中存储出生日期字段,列表展示需要年龄。方案:1. 查出list在代码中循环计算。2. 在sql中使用运算或者函数。

2022-09-29 11:03:53 1487

原创 自定义注解+自定义springAOP环绕增强实现与使用

通过一个模拟情景来进行讲解:项目打算增加一个日志审计功能,对所有的功能接口做一个事件记录,保存相关的请求地址、接口地址、用户账号信息、用户代理信息等。我们对该功能做一个大致的想法:通过自定义的注解作为aop的开启条件,在该注解修饰的方法/接口下切入,通过AOP的环绕通知特性,环绕前置获取到请求信息作为记录,环绕后置请求成功后将事件访问持久化保存下来。自定义注解用来作为事件的启用,具体的注释已经放在代码上了,仅仅是一个注解的声明,功能的实现大多还是在AOP中实现的。2. 自定义AOP切面类在通过指定的切点

2022-06-20 15:25:10 1235

原创 docker常用容器部署,附加指定挂载目录等命令

以5.7为例注意: -v 为指定挂载目录 冒号前面是指定目录,冒号后面是容器内部目录以6.2为例关于本地链接redis失败问题:有一个前提:在docker部署redis时指定了挂载目录(不指定挂载目录是可以直接通过127.0.0.1:6379连接的),和两个因素:目前我所知道的解决方法针对于某些版本:具体的原理原因,可以自行查阅redis配置的绑定IP地址,和关闭保护模式。注意: -v 为指定挂载目录 冒号前面是指定目录,冒号后面是容器内部目录以5.0为例部署Rocketmq部署namesrv

2022-06-14 14:59:04 1671

原创 依靠shardingsphere中间件实现服务的主从数据源,读写分离、分库分表,实战代码演示

项目中用到了分库分表对数据做了读写分离,分散了数据库服务的压力依靠的中间件是shardingsphere开源产品,先演示最简单的读写分离下面上代码:1、读写分离首先搭建测试所需要的环境:两个数据库,当然也可以一主多从,根据需要来进行配置多个从库(搭建数据库就不做演示了)引入依赖: <dependency> <groupId>org.apache.shardingsphere</groupId> &

2022-05-31 18:14:30 619

原创 local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427

记一次报错解决:local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596报错场景:代码合并后重启,发现接口报错产生原因:由于类文件信息已经序列化,更新后的类文件有改动,而缓存中存在的还是旧版本的序列化信息解决方法:删除缓存后重启服务。...

2022-05-26 14:54:58 4369

原创 No qualifying bean of type ‘java.lang.Long‘ available: expected at least 1 bean which qualifies as a

记一次bean报错;No qualifying bean of type ‘java.lang.Long’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}正常情况下应该会给出bean的具体名称和类型,然后提示没有匹配到。而这次只有这么一句错误。原因:有一个空的注解@Resource,idea这货在编译的时候居然不报错,所以代码还是要多检查检查,不然

2022-05-26 11:29:01 1029 5

原创 tinyint(1) 和 tinyint(4)的区别

对于该问题,通过几个问题来解决自己的疑问:### 1. tinyint类型的含义,实际作用解释

2022-04-01 10:37:40 1541

原创 redis中bitmap位图,底层结构剖析,清晰明了,布隆过滤器原理

bitmap的底层数据结构就是0/1bit 的二进制数值,最大长度512Mb = 512 * 1024 * 1024 * 8 = 2^32 。使用场景举例:用户登录活跃值记录打卡签到记录,key为用户唯一键,offset是由日期换算得出的数值,1为已打卡,0为未打卡热点活动记录,key为热点时间,offset是每个用户唯一键例如(id=12385123),如果该用户参与了此次活动,则在12385123的bit位设为1…1.位图常用命令SETBIT命令用来设置或者清除某一位上的值,其返

2022-03-25 09:41:05 3187 2

原创 SpringSecurity框架——认证流程介绍,实战代码

SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。因为是过滤器链的工作形式,所以Security的工作流程是环环相扣的。自定义UsernamePasswordAuthenticationFilter第一个过滤器继承AbstractAuthenticationProcessingFilter类,重写attemptAuthentication()方法,通常这里会在这里对验证码,请求方法类型等进行合法性校验,最后的返回值是Authenticati......

2022-03-17 18:02:12 678

原创 rocketMQ 工作原理 知识点扩充

首先列出mq产品各方面对比如下:选择rocketmq的原因:性能是首要考虑的要素。开发语言是java,主要是为了方便二次开发。对于高并发的业务场景是需要支持分布式架构的设计。功能全面,由于不同的业务场景,可能会用到顺序消息、事务消息等。工作流程:启动NameServer,NameServer启动后开始监听端口,等待broker,producer,consumer连接启动broker时,broker会和所有的NameServer建立并保持长链接,然后每隔30s向NameServer定时发

2022-03-17 13:53:51 3535

原创 sql优化常见问题

SQL优化方案:SQL优化:查询语句中不要使用*; 避免全表查询尽量减少子查询,使用关联查询(left join, right join, inner join)代替;子查询会生成临时表导致索引失效减少使用IN或者NOT IN,使用exists、not exists或者关联查询语句代替;对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差;合理的增加冗余的字段(减少表的关联查询);增加中间表进行优化(这个主要是在统计报表的场景,后台开定时任务将数

2022-03-15 14:53:27 457

原创 Java 快排算法代码解析

排序算法之快排解析算法解析:快排实际上就是每一轮循环会把一个基准元素放到准确的位置,然后以这个元素为分界点,再次递归给分开的两部分再次执行把一个基准元素放到准确的位置。另外一种解释:在一组数中,随便抽出一个数,大于该数的数量是一定的,小于该数的数量也是一定的,所以每取出一个数通过比较大小,就可以准确的找出该数在数组中的位置,每次循环后都会把该数放到准确的位置,且该数的右侧部分最小值一定大于左侧的最大值,因此再对这两个部分执行相同的方法,循环O(n2)即可获得排好序的数组...

2022-03-04 14:12:48 532

原创 pdf文件添加文字/图片,“签名”功能,方法工具类

业务中遇到在pdf文件上盖章,添加文字信息(签名)的需求:包含单图片,多图片,多参数方法老样子,直接上代码和注释,使用的方法类controller层代码:@PostMapping("/print") @ApiOperation(value = "打印结果") public ResponseMessage print(@RequestBody PrintResultRequest request) { OrganPrintSignature reviewer = null

2022-02-22 17:27:05 970

原创 MongoTemplate高级查询,过滤—>排序—>分组—>去重(按照时间倒序取最新一条数据)

在使用MongoDB时遇到的复杂查询,需要对表数据进行分组,然后取出最新一条数据先看代码://object是泛型,是定义的数据库映射类private List<Object> getArchiveDataList(Request request) { TypedAggregation<Object> tagg = TypedAggregation.newAggregation(Object.class, Arrays.asList

2022-02-14 14:01:16 4355 6

原创 mybatis拦截器--实现拦截update语句插入列值

修改sql的时机:在预编译SQL(prepare方法前加入修改的逻辑)。可以对sql处理也可以对映射类做处理准备的xml文件:mybatis-config.xml:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><c

2021-12-09 14:36:02 2550 2

原创 解决报错:Mapped Statements collection already contains value for...

这种情况通常情况下是由于Mapper映射xml文件中SQL标签的id属性重复导致的,仔细检查是否有相同的sql方法名称。解决方法:1.检查是否有重复id标签的sql;2.配置项mybatis: mapper-locations:重复,导致在程序加载时,多次编译xml文件,一个方法被加载两次,就会检测到重复;我遇到的是第二种情况,确定自己的xml确实不存在重复的sql方法名,检查到我这里的配置项重复:mybatis: mapper-locations: # - classpat

2021-12-03 11:29:31 4327 2

原创 sql报错 Out of range value for column ‘**‘ at row

sql语句报错:Out of range value,一般是超出了数值范围。我在数据库中定义的字段为: ADD COLUMN `score` tinyint(3) NOT NULL DEFAULT '0' COMMENT '得分'但是因为分数有时计算后的负值超出-128,所以就会报错。所以如果得分字段定义上直接使用int类型,存储长度默认就好了MODIFY COLUMN `score` int NOT NULL DEFAULT 0 COMMENT '得分' 这里对int类型进行一个详细说

2021-12-03 11:19:49 12606

原创 Java引入docker-api(三),进阶操作之xxl-job创建

准备:由于版本之间有差异,每个版本去官网下载一份properties文件模板存储到resource的xxljob/properties文件夹下。准备要操作的数据库连接参数ps: 一般来说,如果将xxljob服务化,那么创建一个xxljob都要给新建一个数据库单独使用,通过有权限的数据库账号创建好数据库,然后运行官方指定版本的sql文件,然后将数据库地址,数据库名称,账号,密码,作为参数传递到方法内即可。因为关联性不大,下面的演示没有创建数据库的代码,如果需要评论区告诉我,我把代码粘贴过来。还是直

2021-11-12 10:27:41 1421

原创 Java引入docker-api(二),进阶操作之redis创建

步骤如下:创建hostconfig对象获取dockerClient对象调用创建容器方法运行容器直接上代码,每段代码有详细注释//获取客户端在引入docker-api(一)中有相关代码,这里不多余做粘贴DockerClient client = dockerConfig.getClient();//容器名字String containerName = "redis-test";//宿主机挂载conf地址 String confPath = "/User/tomcat/redis.co

2021-11-10 14:07:24 2325

原创 关于xxl-job-admin使用中指定账号密码时的坑

在开发中运行定时任务xxl-job-admin时,想改变console控制台登录的账号密码,只能通过修改properties文件中绑定的数据库中xxl_user表中的数据。xxl-job在初始化数据的时候会自动插入默认admin,123456的账号。xxljob使用的登录校验是md5源码如下: public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response, String use

2021-11-09 17:26:01 8399

原创 brew安装nginx,配置文件维护

首先安装nginxbrew install nginx查看是否安装成功使用list命令查看是否安装成功brew list 查看安装目录,及配置文件目录brew info nginx 查看nginx的详情,目录。红线标记的是你nginx配置文件的目录,有的人是**/usr/local/etc/nginx/的文件夹可以优先查看该文件夹,如果在/usr/local/etc/nginx/**找不到,一定要看下info命令,不然就会像我一样找好久修改配置,维护配置文件下面就是进.

2021-09-24 10:23:42 1206

原创 使用docker部署nginx并指定挂载配置文件

先拉取镜像docker pull nginx运行一个nginx的demodocker run --name nginxdemo -d nginx 拷贝配置文件,将容器中的配置文件挂载到宿主机上docker cp nginx:/etc/nginx/ /Users/tomcat/nginx/命令说明:docker cp 容器名字:容器内部文件夹或文件地址 要拷贝的宿主机地址这里nginx默认的配置文件地址是:/etc/nginx/,复制完成后,在宿主机上查看是空文件夹,如果是.

2021-09-23 16:58:19 563

原创 Java引入docker-api(一),以代码形式对docker执行常用的操作

环境开发系统:mac步骤1.准备连接配置,多种方式配置相关信息,可以使用properties文件的形式:DOCKER_TLS_VERIFY=1 //使用TLS连接DOCKER_CERT_PATH=/Users/tomcat/.docker // docker所安装目录DOCKER_CONFIG=/home/user/.dockerapi.version=1.41 //使用docker命令可以查看版本registry.url=https://index.docker.io/v1/ regis

2021-09-22 17:24:16 983

空空如也

空空如也

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

TA关注的人

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