- 博客(49)
- 收藏
- 关注
原创 Java GUI + exe4j制作加解密桌面程序
1.创建Maven项目而非普通Java项目;方便引入依赖,后期打包时将其它依赖一并打入jar中;2.安装exe4j将jar文件转换成exe可执行文件;3.JDK1.8。
2024-04-18 17:20:14
818
原创 简单工厂模式&&抽象工厂模式
工厂模式的核心就是把对象的生产过程交给工厂来完成,当外部需要一个对象时,由工厂提供接口来获取对象,这样一来即使生产对象的过程变了,仍然不影响外部对对象的获取和使用。它把对象的创建过程封装起来,隐藏了对象创建的细节,根据外部传入的参数来决定返回哪一种对象,它的缺点就是如果要增加对象类型,或者修改某一个对象的创建方法时,就必须修改工厂类,这不符合对象编程设计原则之一的“开闭原则对扩展开放,对修改封闭。在实现新的需求的时候,最好能够只是扩展而不去修改已经写好的代码,这样能够把新需求带来的风险降到最低。
2024-04-16 11:11:56
1010
原创 BeanUtil.copyProperties(source,target)拷贝List注意事项
方法拷贝List属性时只是将source中List的引用拷贝给target中的List(source和target对象中的List本质上为同一个对象);已知上面对target对象中的List数据修改时会影响到source对象中的List数据;也清楚了出现这个问题的原因在于使用。
2024-01-31 23:13:24
1531
原创 ThreadLocal详解
比如在拦截器中获取用户信息并保存到ThreadLocal中,保存在ThreadLocal中的用户信息在本次请求的“任何方法”中都可以获取到这个用户信息。除了当前线程新开一个子线程去执行其它业务那么在这个子线程中是不能获取到上面存储的用户信息的,因为ThreadLocal是将当前线程作为Key去存取数据的,如果新开一个线程因为保存用户信息的线程和新开的线程不是同一个线程所以在新开的线程中是获取不到这个用户信息的,除非你将当前保存用户信息的线程也传递到子线程业务中使用保存用户信息的线程去获取用户信息;
2023-12-29 15:49:53
914
原创 线程池原理及使用
1.反复创建线程开销大;2.过多线程会占用太多内存(执行任务易出现“内存溢出”);3.加快程序响应速度;4.合理利用CPU和内存;5.统一管理线程;
2023-12-27 17:14:31
1094
原创 JVM内存结构&Java内存模型&Java对象模型
JMM是一组规范,需要各个JVM的实现来遵循JMM规范,以便开发者可以利用这些规范更方便的开发多线程程序;如果没有这样一个JMM内存模型来规范,那么很可能经过了不同JVM的不同规则的重排序后,导致不同虚拟机上运行的结果不一样;JMM不仅仅作为一组规范它同时还是“工具类”、“synchronized”、“Lock”等的原理;代码在JVM中的执行顺序和在Java代码中的顺序不一致;(代码指令执行顺序并不是严格按照语句顺序执行的,这就是重排序);指一个线程对共享变量的修改对于其它线程是可见的;
2023-12-25 09:47:45
1323
原创 线程活跃性问题(死锁、活锁、饥饿)
活锁表示执行任务的线程没有被阻塞,但由于某些条件没有被满足导致重复的去尝试执行任务(失败->尝试->失败),“活锁”与“死锁”的区别在于“死锁”线程一直处于等待状态而“活锁”执行线程在不断的执行;“饥饿”是指线程执行时无法获取到它所需要的资源比如(CPU),一种情况是“线程”优先级分配不合理导致部分线程一直无法被CPU调度执行;另一种情况是某线程持有某个操作的“锁”但其又处于无限循环而又不释放锁,此时其它等待获取此锁的线程获取不到就出现了饥饿问题;饥饿问题会导致服务器响应变差;详见本章序号1、7、8;
2023-12-22 14:16:36
1012
原创 volatile关键字
5.1.volatile适用于一个共享变量自始至终只被各个线程赋值,而没有其它操作(运算或取反等操作),那么就可以使用volatile代替synchronized或者“原子变量”,因为赋值本身是原子性的,而volatile又保证了可见性所以是线程安全的;或者也可以使用volatile作为触发器实现轻量数据同步;5.2.volatile属性的读写操作都是无锁的,它不能替代synchronized因为它没有提供原子性和互斥性因为无锁所以不需要花时间在获取锁和释放锁上所以它是轻量级。
2023-12-21 14:25:51
516
原创 单例模式的七种写法
如果不使用volatile修饰instance实例,则创建对象时被JVM重排序后的执行流程可能如下(“空指针问题”),若创建出来的对象为null,由于“可见性”问题,下次去获取实例时还是会创建多个对象;若不用双重检查也可以使用synchronized去修饰获取实例方法来保证线程安全(类似于懒汉式的同步方法);使用static定义的,所以枚举的本质就是一个静态编译的对象;使用volatile目的在于,禁止创建对象时的3个步骤发生重排序,防止创建出的对象空指针问题;使用枚举的方式实现单例最好;
2023-12-21 13:48:50
730
原创 线程三(线程属性 && 线程未捕获异常 && 线程安全问题)
true(守护线程)/false(非守护线程也称为:“用户线程”)设置守护线程方法:thread.setDaemon(true)
2023-12-18 14:22:17
366
原创 线程二(生命周期 && Object和Thread类方法详解)
1.线程的六种状态 NEW(创建) 线程已创建但还未执行start()方法; Runnable(可运行) 线程调用start()方法便会进入Runnable状态; 备注:线程运行中的状态也是Runnable Blocked(阻塞) 当一个线程进入到被synchronized修饰的代码块时,并且该锁已经被其它线程拿走时,
2023-12-18 09:50:35
797
原创 sleep()方法平替写法
在使用sleep()方法休眠时,一般需要传入休眠时间的毫秒值;如果休眠时间为(2小时53分10秒)这样需要对这个时间转换为毫秒值,对于这些时间的转换是很琐碎的,且sleep()方法如果休眠时间为“负数”时还会抛出异常;下面有一个平替sleep()方法解决了这些问题;
2023-12-15 13:55:30
437
原创 线程一(创建 && 启动 && 中断)
响应中断:即程序在执行下面这些方法时可以感知到中断信号,如果收到中断信号会响应中断。如sleep()方法当执行sleep方法时收到中断信号则线程会抛异常来响应中断java.nio.channels.InterruptibleChannel的相关方法java.nio.channels.Selector的相关方法。
2023-12-06 16:04:19
787
原创 JSR303 + 全局异常处理
*** 参数校验*//*** 封装校验方法、方便在Service中进行参数校验*/// 此处的data为前面验签后转JSONObject对象,非加密字符或JSON字符串if(set!= null &&!return r;
2023-11-26 22:24:50
473
原创 swagger暴露指定包下的实体作为Model
1.接口入参对象,被swagger扫描到自动生成Model;2.接口响应对象被swaggere扫描到自动生成Model;
2023-11-26 16:34:42
920
原创 Ubuntu18搭建FastDFS
跟踪服务器(Tracker Server):192.168.201.128存储服务器(Storage Server):192.168.201.128。
2023-11-13 11:05:54
137
原创 ElasticSearch(七)-面试题
倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。ES中的倒排索引其实就是 lucene 的倒排索引,区别于传统的正向索引(Mysql根据索引匹配内容), 倒排索引会在存储数据时将关键词(数据分词)和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数据即可;
2023-11-07 10:39:28
64
原创 ElasticSearch(六)-优化
Elasticsearch的基础是Lucene,所有的“索引”和“文档”数据都存储在磁盘中,配置数据存储在哪块磁盘可通过修改elasticsearch.yml文件;磁盘在现代服务器上通常都是瓶颈,Elasticsearch重度使用磁盘,磁盘处理的吞吐量越大,节点就越稳定,如下有一些优化磁盘I/O的技巧;1.1.使用SSD(固态硬盘)。它相比较机械硬盘性能好太多;1.2.使用RAID 0。
2023-11-06 11:14:03
210
原创 ElasticSearch(五)-SpringBoot集成
Data@Document(indexName = "product", shards = 3, replicas = 1) // indexName指定索引名称、shards指定索引分片数、replicas指定分片数@Id/* ID */@Field(type = FieldType.Text) /* text 分词 *//* 标题 */@Field(type = FieldType.Keyword) /* keyword 不分词 *//* 品牌 *//* 价格 */
2023-11-02 14:04:12
88
原创 ElasticSearch(四)-进阶之深入学习
分片是ElasticSearch中最小的工作单元,之所以会分片是因为当一个索引中数据量太大时会影 响ES的检索效率,所以把一个大的索引拆成几个部分每个部分就是一个分片,当所有分片组合在一块时就是一个完整的索引数据。当在创建索引时不仅可以指定索引的分片数,还可以指定每个分片的副本数,副本不仅可以起到备份数据提高系统可靠性的作用还可以参与检索,计算数据,从而提高整体的检索效率;1.默认情况下创建一个索引默认一个分片,一个副本;2.创建索引时指定分片数及副本数(创建后分片数不能修改,副本数可以动态修改);
2023-10-31 16:32:15
172
转载 ElasticSearch(三)-基于Mysql热更新IK词典
眼前有景道不得,崔颢题诗在上头;在IK分词器中添加扩展词典或远程扩展词典,每次词典更新后都需要重启ES服务器,这在生产环境中是绝对不被允许的;如果我们把扩展词典数据存放在三方组件中如Redis、Mysql中ElasticSearch每隔一分钟去Redis或Mysql中同步最新的词典数据来更新词库,这样每次更新词库时不用重启ElasticSeach服务器就可以达到IK词典数据热更新;热更新是全量更新还是增量更新?
2023-10-31 15:46:34
678
原创 ElasticSearch(二)-入门之集群搭建
1.三台Linux虚拟机IP分别为2.准备elasticsearch-8.1.0-linux-x86_64.tar.gz压缩包3.关闭三台服务器防火墙(service firewalld stop)4.虚拟机做端口映射方便外部主机访问到虚拟机ES应用1. elasticsearch版本为8.1.0,不同ES版本在配置elasticsearch.yml上语法有差异;初次搭建建议使用8.1.0版本,如下相关配置均在8.1.0版本上测试过;
2023-10-26 15:00:52
229
原创 ElasticSearch(一)-入门之基础语法
映射关系(即创建索引时为“字段”指定是否分词,是否支持检索)单条件查询&取指定字段&排序&分页(单条件使用match)多条件查询&范围查询(多条件使用bool)创建索引(创建索引相当于创建数据库)创建文档(即为索引写入一条记录)在ES中每条记录就是一个Document对象。全文检索&完全匹配&高亮查询。根据索引名称 获取索引信息。根据索引名称 删除索引。查询索引下面的所有记录。根据主键查询文档记录。
2023-10-23 14:45:40
53
原创 Nginx一个server中配置多个前端项目
以前使用Nginx配置前端一般是这样(配置多少个前端就开启多少个端口定义多少个server)一个server中配置多个前端项目要使用alias,不要使用root;现在要求在一个server中配置类似二级域名的形式配置多个前端。
2023-10-13 17:01:25
1923
原创 Java接口提供方与调用方数据交互加密规则
在生产活动中接口数据安全性是一个非常重要的模块。假如发起一个支付请求A向B转账100元,在支付请求传输过程中请求被劫持,将转账金额由100元修改为10000元。这种情况是不被允许的为了防止接口传输数据被篡改,我们就必须要对接口提供方调用方数据进行加签/验签操作用来验证数据的真实性;
2023-09-18 11:08:06
305
原创 IDEA打工具类jar包(包含将Maven下的依赖打入工具类Jar中)
前段时间需要给接口对接方提供一个Jar包,其内容包含接口调用方参数加签,服务提供方响应验签,以及为调用方组装服务提供方需要的入参格式。打工具类Jar实现的目标:1.工具类项目使用Maven管理方便在项目中引入其它需要的依赖;2.工具类项目打好Jar后,此Jar可直接在其它地方导入使用(类似于JDBC驱动Jar);3.打好的工具类Jar中,包含工具类项目使用到的Maven依赖对应的源码包;4.使用IDEA自带的打包方式,不使用Maven打包插件进行打包;
2023-09-14 14:35:21
533
原创 如何定位慢SQL
优化SQL的前提是你已经发现了那些执行起来有问题或耗时很长的SQL。总有面试官会问你在平时生产/开发过程中你们是如何定位慢SQL的。
2023-05-30 10:43:21
1615
原创 Sharding-JDBC实现读写分离
前面已经实现了Mysql数据库的主从复制功能,光有数据库主从复制还不够,还需要实现对数据库的读写分离操作。Mysql主从复制Sharding-JDBC官方文档每次强制路由到主节点都需要写上面的代码这是很繁琐的,通过AOP + 注解我们可以轻松实现强制路由到主节点功能。6.2.1:定义注解/*** 定义注解*/6.2.2:定义AOP切面@Component@Aspect/** 作用范围 */// 获取执行方法参数// 获取执行方法。
2023-05-12 16:03:07
1883
转载 Mysql主从复制
1.2:Mysql下载地址1.3:实现效果从节点(slave)指定需同步的主节点(master)数据库,slave从master中同步数据,即主节点表数据发生变化时从节点自动同步变化的数据。
2023-05-05 16:54:12
459
原创 微信小程序获取用户手机号
对于ACCESS_TOKEN的刷新没有采用轮询程序定时去更新的方式刷新ACCESS_TOKEN,通过Redis的SET NX命令实现分布式锁 + 为Key设置过期时间 让用户调用获取手机号码接口时自动刷新ACCESS_TOKEN。ACCESS_TOKEN的有效期通过返回的 ACCESS_TOKEN来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。1.4:后端接收到前端传输的code,使用code及ACCESS_TOKEN获取到微信用户的手机号。获取手机号 | 微信开放文档。
2023-04-13 17:03:16
536
原创 使用内部类定义入参实体
在开发过程中,对于参数的接收当参数数量多时,一般定义一个实体用于封装接收这些参数。如果参数数量少时一般使用Map去动态接收。如果你不想使用Map去接收参数,但又不想定义多个实体去接收参数,可以考虑使用内部类的方式去接收参数。这样对于工程来讲只有一个文件,该文件下面有多个实体类。@Data/** 内部类对象 *//** 内部类 - 用户类 */@Data/** 内部类 - 登录类 */@Data。
2023-04-13 13:36:09
258
原创 若依SpringSecurity + JWT
内网项目使用RBAC权限管理模式,一个角色上挂载了多个菜单信息,用户登录时根据用户账号查询用户所拥有的菜单,将菜单信息响应给前端进行渲染。此种方式对权限控制的粒度是最粗的,用户有这个菜单即认为用户可以访问这个菜单上的所有资源,并且用户访问菜单上的接口时没有对接口进行权限验证(即此接口用户是否有权限访问)。
2022-11-01 17:02:17
2732
原创 Java前后端分离验证码处理思路
用户注册时:复杂的验证码一定程度上可以防止“恶意注册”,用户在注册时,先校验其验证码是否正确,若验证码错误,则注册失败;免密登录时:复杂的验证码一定程度上可以有效防止用户无限点击发送短信验证码接口进行免密登录,造成无用的短信扣费;
2022-10-12 17:22:08
2250
1
原创 Java File 与进制 与MultipartFile的一些操作
存储文件的方式很多,可将上传文件存储在服务器,数据库记录存储文件索引地址等文件信息,也可将文件转换为输入流直接写入数据库的Blob类型中保存,当然你也可以根据需求不同将文件转为16进制字符串进行传输或保存(注意:上传文件的大小一般小于转为16进制字符串后大小);3:MultipartFile转File类型。1:File转16进制字符串。2:16进制字符串转输入流。
2022-09-21 16:08:14
1394
(十三)SpringCloudAlibaba-Seata(分布式事务使用)附本章代码及Seata压缩包
2024-08-13
(十一)SpringCloud-Nacos Config(服务配置中心&动态更新配置&共享配置)本章代码
2024-08-04
(九)SpringCloud-Gateway(Gateway+Sentinel实现网关限流)本章代码
2024-08-03
(八)SpringCloud-Gateway(网关配置&路由断言工厂&自定义路由断言工厂)本章代码
2024-08-01
(七)SpringCloudAlibaba-Sentinel(Feign整合Sentinel实现容错) + 本章代码
2024-07-30
Sentinel(规则配置&自定义异常返回&@SentinelResource注解&持久化)本章代码 + Jmeter
2024-07-30
(五)SpringCloudAlibaba-Sentinel(本章代码&sentinel控制台jar)
2024-07-27
(五)SpringCloudAlibaba-Sentinel(本章代码&&Sentinel控制台jar)
2024-07-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人