- 博客(48)
- 收藏
- 关注
原创 Spring Boot顶层接口实现类注入项目的方法
在项目中,我们通常会具有同一特性的业务类定义一个顶层接口,让业务类实现这个接口,通过接口规范来管理这些类。我们将这些实现接口的业务类交托给Spring容器接口后,有时候需要根据业务类型来选择动态选择对应的业务类阿里处理业务。这个时候就获取到这些业务类并进行管理,在需要时取出对应的业务类处理业务。如何管理就是本期要介绍的内容。以下是我定义的一个简单的顶层接口,它有两个方法,一个是提供类型的getType()方法,一个是处理业务的hanlde()方法。
2024-06-16 18:10:03
595
1
原创 服务器时区与数据库时区不一致导致时间bug记录
(1)临界点时间(跨天、跨月、跨年)极易受时区影响导致极大误差,出现时间问题时可第一时间查看时区问题(2)机器时区与进程时区并不总是一致,需要摆脱这个惯性思维,用其他方式(如日志)确定进程时区。
2024-06-12 22:01:27
1303
原创 Spring boot注解学习
spring boot 核心注解,加在Spring boot 主类之上,是@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。(1)@Configuration:允许以@Bean注解将对象托管给spring容器,即支持将@Bean注解的方法返回的对象控制反转。
2024-06-09 17:12:24
1198
1
原创 JAVA基础
(2)打印结果开始初始化静态变量…开始执行静态代码块…开始初始化成员变量…开始执行构造方法…(3)结论静态变量->静态代码块->成员变量->构造方法。
2024-06-01 16:11:31
215
原创 Spring boot使用集群方式、支持ssl连接redis的方法
项目需要提供一个管理界面给内部人员操作用户信息,需要在修改用户信息后删除用户的redis缓存。用户所在的区域不同,其redis服务地址也不相同,因此需要管理多个redis连接,且redis要求以集群方式并支持ssl进行连接。
2024-05-26 00:05:07
1113
原创 idea遴选代码发生commit <hashId> is a merge but no -m option was given. cherry-pick failed解决
push代码时与远程分支其他人的分支起了冲突,并进行了合并,此时该提交在idea git 提交界面显示灰色,这是因为合并冲突后提交,导致了两个父提交,需要提供 -m 选项来选择遴选的父提交。(2)使用 git cherry-pick -m (1)使用 git show 查看所有父提交。
2024-03-26 18:14:37
2838
1
原创 SpringBoot接入Google Guava异步事件库方法
Service@Slf4j@Override@Service@Slf4j/**@Subscribe:订阅事件发布,当发布事件为Event类型及其子类时,该方法会被执行Event:自定义类,可放入业务数据@AllowConcurrentEvents:该方法可异步执行*/@Subscribe// 消费事件log.info("接收到消息,data:{}", event.getData());...// 注入事件发布总线@Autowired。
2024-02-21 17:18:09
690
原创 Java开发笔记
注意:如果你的项目已经引入了spring-boot-starter依赖,那么就不需要重复引入,spring-boot-starter已自带jackson。(1)业务场景:接收前端传输过来的json串,需要将其写入数据库,写入之前需要校验其是否能够转换成对应实体类,以便后续从数据库读取。中的反序列化工具,当字符串不符合json格式或出现实体类中不存在的字段时,会报错。json3格式正确且User类均包含该json所有字段,校验通过。json1多出了一个age字段,校验不通过。json2格式错误,校验不通过。
2024-01-15 22:09:21
622
原创 Java socket编程学习笔记
4、解决方法:需要关闭流的同时,不关闭socket,可使用Socket::shutdownOutput()方法和Socket::shutdownInput()方法实现。5、原因:分析代码,未对socket进行关闭,但是客户端在通信完成前提前关闭了out流,服务端提前关闭了in流,查询资料得知关闭流会导致socket关闭。但是在socket中,只有当对方将输出流关闭后才会以-1作为结束标志,故而陷入死循环,推断正确。3、原因:分析代码,服务端没有打印出客户端发送消息,猜测是以下代码陷入死循环。
2024-01-07 16:57:11
547
原创 Spring boot接收zip包并获取其中excel文件的方法
【2】ZipInputStream实例调用该方法后,将会指向获取到的条目,这是使用ZipInputStream实例操作的就是获取到的ZipEntry对象。工作中遇到一个需求,接收一个zip包,读取其中的excel文件并处理,减少用户多次选择目录和文件的痛点,该zip包包含多级目录。二者是在内存中处理字节的IO流,相较于在磁盘中处理数据的IO流更快,在内存中处理数据也符合业务需求。【1】该方法可获取到zip包内的各级目录及各级目录下的文件,并不需要进行递归处理。
2023-09-27 00:14:33
1172
1
原创 Java操作符学习笔记
和 &&、|| 和 | 其实是两种操作符。这让我一直将单个 & 和 | 当成时逻辑操作符的一种,而事实上这两是按位操作符,是将两个布尔类型值的二进制表示进行按位运算,只不过将布尔类型按位运算后的结果与逻辑操作符一致,而按位运算自然不会有短路作用。之前理解出现错误,特此记录。因此,对于上述3个类型和int类型进行位运算时,想要 i >> a (或 i << a)中,右侧a的值精确生效,则需要控制在[0,31]之间(int类型最多32位),超过这个区间,则取a的二进制表示中的最低5位作为有效值进行位移。
2023-09-03 23:05:22
542
原创 给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?
今天在工作中接到这样一个需求,接收前端的图片文件并上传到远程,将原有图片覆盖并返回一个http链接以供前端展示。用户使用后反馈没有修改成功,上了远程拉图片发现已经修改了,但是用户浏览器还是老的图片。排查原因是浏览器存在缓存,虽然资源已经改变但是浏览器对同一个http链接还是使用了缓存里的老数据。解决方法也很简单,只需要在不改变访问地址的前提下改变http链接的内容,这样就是一个新的http链接,但是地址是正确的。
2023-08-31 00:10:57
436
原创 linux日志信息查询技巧(日常记录)
grep ‘关键字’ 日志文件路径 如:grep ‘key’ /data/logs/info.log。关键字是支持正则表达式的,如果想进行模糊匹配。如果知道一个关键字,想获取这个关键字的上下文信息的时候,就可以使用。时,就可以采用管道的方式,在关键字1的筛选结果上继续筛选关键字2。把所有包含关键字key的行输出到1.txt这个文件中。在key1筛选结果中筛选key2并只显示key2。当我们筛选日志文件中含有某个关键字的。如果想再进一步筛选另一个关键字,即。多显示筛选到行前面1行和后面一行。
2023-04-09 01:29:36
2722
原创 MySQL刷页的时机
在上一篇文章《MySQL的日志系统》中,介绍了redo log的作用。由于内存中的数据不稳定,为了数据安全,必须保证每次修改都能持久化到硬盘中,但是对于硬盘中的记录进行修改需要随机IO,效率非常低。为了解决这个问题,InnoDB引入了redo log,记录每次修改的页及具体修改的数据,对redo log的写是顺序写,比起随机IO要快上许多。InnoDB会在合适的时机再将这些修改后的数据真正持久化到硬盘中的数据库表中,这个合适的时机就是本文要探讨的问题了1. 合适的时机redo log写不下了。由于
2022-05-04 22:03:08
805
原创 唯一索引和普通索引应该怎么选?
1、查询对比假设有一个表T,有索引字段idx,执行下面的语句:select * from T where idx = 5;对于唯一索引,首先会根据B+Tree根节点进行搜索,定位到idx = 5这一条记录所在页并读入内存,由于字段值唯一,因此不需要对下一条记录进行判断,直接返回即可;对于普通索引,在拿到第一条idx = 5的记录后,还需要对后续记录进行判断,直到idx != 5对比两者的消耗,虽然普通索引需要对后续的记录进行判断,但由于读入的是一整个数据页,大部分情况下后续需要判断的记录也
2022-05-01 23:07:29
535
原创 synchronized锁升级的过程
1、synchronized实现的基础(1)synchronized是基于Java引用类型的对象实现的,使用时需要指定一个引用类型对象作为锁。(2)当synchronized修饰在方法上时则可以不显式指定对象,修饰静态方法时默认使用的是该类的class对象,修饰在实例方法上时则默认使用当前对象。(3)synchronized的锁升级是基于锁对象头中的Mark World部分。Mark World的设计十分精妙:在非加锁状态时用于存储对象的哈希码和分代年龄以及锁状态;在加锁状态时原先存储哈希码和分
2022-05-01 19:34:09
1581
原创 快照在MVCC里是怎么工作的?
1、可重复读是怎么实现的?这是一道高频面试题,大多数人接触这个问题时都会被告知是在事务开始时,基于当前数据创建了一个临时视图,后面的读操作都是在这个视图上进行的。但这只是个笼统的说法或者说一个形象的比喻,没有涉及到视图的存在方式和实现原理,是应付不了面试官的。想要回答这个问题,就必须了解MVCC的工作机制2、MVCC维护快照视图的方法MVCC又叫多版本控制机制,顾名思义,它是用来控制多个版本的数据的。在MVCC的模型中,每一行数据都是有不同的版本的,事务根据数据的版本号可以确定哪个版本对当前事务是可
2022-04-29 19:03:16
431
原创 MySQL日志系统作用及同步问题
1、MySQL的日志分类MySQL的结构大体可以分成Server层和存储引擎层,Server层负责语法分析和逻辑处理,而存储引擎则负责数据的读取与写入。而日志也相对可以分两种,其中Server层的日志是固定的,而存储引擎有多种,有的存储引擎不具备日志,本次探讨的是使用Innodb存储引擎时的日志使用情况。binlog:又名归档日志,它是Server层的日志,用于记录逻辑修改,具体是记录修改了那一条记录的哪些字段;一共有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记
2022-04-26 18:50:26
1060
原创 数字在计算机中的表示
1、计算机中表示数字的方式在计算机中,数字是采用二进制表示的,在大部分开发语言中,通常使用8位、32位、64位二进制来表达数字(1) 可以表示的数字数量一个二进制位可以有1和0两种取值,我们令用来表示数字的二进制数字为n,那么可以表示的数字数量就是2^n个,如使用8位二进制来表示数字,那么可以表示的数字数量为:2^8 = 256个(2)如何区分正负数字有正负之分,通常采用最高位来表示一个二进制串所表示的数字正负,最高位为1时数字是负数,最高位为0时,数字是正数或0(3)具体的表示例子以八位二进
2022-04-20 21:54:56
3910
原创 jdk动态代理学习心得
1、什么是动态代理动态代理是一种在运行期生成字节码文件,来对被代理对象执行的方法进行增强的一种机制。比如说有一个我们有一个需求要调用对象A的method方法,使用动态代理增强的步骤如下:1、调用动态代理类提供的方法,将A作为参数传入,获得代理对象B2、使用B调用method方法,此时代码的执行结果就是代理类增强后的结果了2、jdk动态代理的实现步骤1、jdk动态代理的核心:接口InvocationHandler和类Proxy2、定义一个类MyHandler实现InvocationHand
2022-03-30 17:31:01
551
原创 为win10配置多个jdk的方法
1.下载jdk选择你所需要的jdk下载并安装下载地址:https://www.java.com/zh-CN/2. 打开环境变量窗口右键此电脑,打开属性点击高级系统设置点击环境变量接下来的设置都在系统变量这里配置3. 配置jdk的环境变量首先需要为两个jdk指定安装目录,博主的两个jdk版本分别是8和17,因此配置两个变量,指向jdk安装目录,用数字区分他们点击创建,输入变量名和变量值然后再用同样的方法配置JAVA17_HOME接着就是正式
2022-02-21 14:30:40
2415
原创 力扣构建二叉树的算法
1、背景力扣相信大家都很熟悉,练习算法时大部分人都会选择该网站刷题。但是力扣的调试功能需要开通会员,为了方便调试,我写了一个算法用于构建二叉树,经多次测试,与力扣构建树的方法一致,如下:public class TreeNode { public TreeNode left; public TreeNode right; public Integer val; public TreeNode() { } public...
2022-01-23 17:06:02
1080
原创 minio实现STS签名服务
1、背景 在上一篇中:Docker部署Minio并与Springboot的集成_木星mx的博客-优快云博客我们介绍了如何部署minio和与springboot的集成方法,但是在上传文件时,采用的是从浏览器获取参数读取本地文件上传,当项目部署到线上时,用户和项目服务处于不同机器上,这种方式就不适用了,因此需要进行升级。 升级后的效果是:项目服务只提供签名服务,用户通过访问项目提供的接口获取签名,然后用户使用签名上传文件,实现了用户到oss端对端的文件传...
2022-01-11 17:12:23
4262
3
原创 刷题日记:正则表达式的匹配
1、题目请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:输入:s = "aa"p = "a...
2022-01-09 11:05:21
487
原创 Docker部署Minio并与Springboot的集成
1、简介开发项目时需要用到对象存储功能,而minio是github上一款开源的提供对象存储服务的项目,使用go语言开发,如果不想花钱购买主流大厂的对象存储服务(虽然不贵),可以参考本文的配置,在docker部署minio并将其集成到springboot项目中2、docker部署minio 关于minio的部署与使用可参照官方文档:MinIO | The MinIO Quickstart Guide,虽然minio有中文文档,但是很多都不准确,建议直接啃英文文档,也可参照博主的操作...
2022-01-08 16:35:10
1853
原创 解决没有配置本地nacos但是一直发生localhost:8848连接异常的问题
简介事情是这样的,为一个项目配置了注册中心nacos,一开始配置的是本机的nacos服务,后面将nacos地址改为虚拟机后,项目虽然启动成功,但是报nacos异常,如下:一共有两个配置文件:分别配置了:可以看到根本没有关于localhost:8848的配置,但是还是报了localhost:8848的异常,打开虚拟机的nacos可视化界面,发现服务已经注册到虚拟机的nacos中了出现问题的版本为:<!-- 注册中心-nacos--><...
2022-01-04 21:50:26
14978
2
原创 开发日记:spring cloud gateway网关服务和解决跨域
1、背景在前后端分离的微服务项目中,前端给后端发送请求都是从一个配置好的默认路径发送给对应服务的如renren-fast-vue,在项目的staic/config/index.js文件中,我们可以观察到默认路径如下:;(function () { window.SITE_CONFIG = {}; // api接口请求地址(默认路径) window.SITE_CONFIG['baseUrl'] = 'http://localhost:8080/renren-fast';...
2022-01-04 10:59:16
1167
原创 开发日记:stream入门,树形菜单功能的实现及bug修复
1、需求:有一个菜单表,字段catId用于唯一标识每一条记录,每一条记录代表一个菜单项;另有parentCid用于记录该记录的父级菜单,现需为每个菜单绑定他们的子菜单,表结构如下CREATE TABLE `pms_category` ( `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `name` char(50) DEFAULT NULL COMMENT '分类名称', `parent_cid` bigint(2...
2022-01-03 16:03:34
576
原创 JAVA解决约瑟夫环编程题
1、题目给定一个包含n个数的序列[0, n - 1],每次删除第m个数,直到只剩下一个数,求最后剩下的数2、分析 1、设求解规模为n的问题函数为f(n, m),由于f(1, m)的结果固定为0,考虑从f(1)开始递推后续结果,首先需要找出f(n, m)与f(n - 1, m)之间的对应关系 2、对f(n, m)问题求解时,先删去第一个数字,得到以k = m % n为起点,数量为n - 1的数字环,令这个数字环的求解结果为f '(n -...
2022-01-02 18:30:58
254
原创 1月2日刷题日记:消除游戏,等差数列模拟
题目:链接:力扣列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。给你整数 n ,返回 arr 最后剩下的数字。举例:n = 9起始:1 2 3 4 5 6 7 8 9第一轮:2 4 6
2022-01-02 09:46:50
1619
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人