![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 88
一枚务实的码农
IT码农一枚,分享一些自用的学习资料。
展开
-
Spring6的新特性,正式“抛弃”feign了
上文中创建工程的时候,引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。只是,我们的一些思维还未转变过来,对 feign 的底层实现也缺乏一定的了解。除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVC 的 Controller 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。原创 2023-03-13 20:17:57 · 1300 阅读 · 0 评论 -
SpringBoot+WebSocket实时监控异常
最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。前端略微复杂,需要在一张位置分布图上进行鼠标描点定位各个设备和根据不同屏幕大小渲染,本文不做介绍,只是简单地用页面样式进行效果呈现。预期效果,未接收到请求前----->id为3的提交了异常,id为3的王五变成了红色。我们可以看到,id为3的王五状态已经变成异常的了,实时通讯成功。2、因为是模拟数据,所以全部显示正常,没有异常提交时的页面呈现。绿色代表正常,红色代表异常。原创 2023-03-10 23:37:47 · 3657 阅读 · 1 评论 -
订单30分钟未支付自动取消怎么实现?
目录了解需求方案 1:数据库轮询方案 2:JDK 的延迟队列方案 3:时间轮算法方案 4:redis 缓存方案 5:使用消息队列。原创 2023-03-08 23:13:20 · 5396 阅读 · 2 评论 -
SpringBoot 如何保证接口安全?
因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间比较,是否超过了60s,如果超过了则认为是非法请求。这种方案nonce和timestamp参数都作为签名的一部分传到后端,基于timestamp方案可以让黑客只能在60s内进行重放攻击,加上nonce随机数以后可以保证接口只能被调用一次,可以很好的解决重放攻击问题。步骤2:服务端接收到客户端的请求,然后使用约定好的秘钥对请求的参数再次进行签名,得到签名值sign2。原创 2023-03-07 22:25:02 · 1869 阅读 · 0 评论 -
45 个 Git 经典操作场景,专治不会合代码
但假定你就是想要这么做,这里你可以创建一个临时的commit来保存你已暂存的内容,然后暂存你的未暂存的内容并进行stash。这会产生一次交互式的rebase(interactive rebase), 只会列出没有推(push)的提交(commit), 在这个列表时进行reorder/fix/squash 都是安全的。你把事情搞砸了:你 重置(reset) 了一些东西, 或者你合并了错误的分支, 亦或你强推了后找不到你自己的提交(commit)了。有些时候, 你一直都做得很好, 但你想回到以前的某个状态。原创 2023-03-06 17:59:40 · 486 阅读 · 2 评论 -
推荐一款基于 SpringBoot + Vue 的前后端分离实战项目!技术主流,文档很全!
如果你不知道如何搭建 Node 开发环境的话,Windows 用户可以看 Microsoft 的**《直接在 Windows 上设置 Node.js 开发环境》**[2]这篇文章,介绍的非常详细。项目的前端基于 Vue 全家桶+Element(桌面组件库)+Avue(采用 Element 框架低代码前端框架,它使用 JSON 配置来生成页面,可以减少页面开发工作量,极大提升效率)。不过,这一步需要你的本地有 Node 开发环境。当然了,如果你想本地搭建环境来学习或者体验这个项目的话,也是比较简单的。原创 2023-03-02 18:01:57 · 1161 阅读 · 0 评论 -
SpringBoot 整合 MongoDB 实现数据的增删改查!
在实际的业务场景中,可能还需要用到聚合函数等高级查询,大家如果有这种需求,可以访问如下地址获取更加详细的 api 文档介绍:MongoDB 文档查询 api 介绍。索引在所有的数据库中,暂居的位置非常重要,例如当你检索一张上百万的数据表的时候,如果没走索引,查询效率会极其缓慢,对于 MongoDB 来说,同样如此。: 文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档、数组和文档数组。原创 2023-03-01 17:58:08 · 2317 阅读 · 1 评论 -
Spring中最常用的11个扩展点
其实,我们经常使用的注解,比如:@Autowired、@Value、@Resource、@PostConstruct等,是通过AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor实现的。假如:接口中接收参数的实体对象中,有个字段的类型是Date,但是实际传参的是字符串类型:2021-01-03 10:20:15,要如何处理呢?比如,我们想在同一个线程中从spring容器获取到的bean都是同一个对象,该怎么办?原创 2023-02-28 16:36:12 · 2364 阅读 · 0 评论 -
spring容器,@Bean 与 @Component 用在同一个类上,会怎么样?
验证方式有很多,可以 debug 跟源码,看看 Spring 容器中到底有几个 UserManager 对象,也可以直接从 UserManager 构造方法下手,看看哪几个构造方法被调用,等等。没有显示的指定值,那么默认值就是 false ,之后在 Spring Boot 启动过程中,会用此值覆盖掉 Spring 中的。覆盖的,变的是 Spring Boot , Spring Boot 2.1.0 之前没有覆盖 Spring 的。创建的 userName 不为 null 的 UserManager 对象。原创 2023-02-28 16:27:02 · 241 阅读 · 0 评论 -
SpringBoot + MDC 实现全链路调用日志跟踪
重新返回的是包装后的 Runnable,在该任务执行之前 runnable.run() 先将主线程的 Map 设置到当前线程中(即 MDC.setContextMap(context)),这样子线程和主线程 MDC 对应的 Map 就是一样的了。设置 MDC 中的 traceId 值,不存在则新生成,针对不是子线程的情况,如果是子线程,MDC 中 traceId 不为 null;如果调用线程中含有 traceId,则需要将获取到的 traceId 通过 request 中的 header 向下透传下去。原创 2023-02-24 16:21:00 · 828 阅读 · 0 评论 -
IDEA 30 个好用天花板技巧,敲代码直接接爽到飞。
虽然有点重,但依旧瑕不掩瑜,内置了非常多的功能,大大提高了日常的开发效率,下面汇总了常用的30个使用小技巧,学会之后,让你的撸码效率直接起飞...这其实是本文第13点的上位替代方案,idea自带的快捷键查看代码调用,只是以菜单形式展示,不太直观,如果是自己写的代码或比较规范的代码,那用自带的也就无所谓,如果是比较复杂的源码或不规范的代码,那使用 SequenceDiagram 会直观特别多。idea默认是选择显示单行的,我们把这个去掉,就可以显示多行tab了,在打开tab过多时的场景非常方便!原创 2023-02-23 16:34:17 · 7412 阅读 · 1 评论 -
如何设计一个通用的权限管理系统
当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。CAS的单点登录的认证过程,所用应用服务器受到应用请求后,检查ST和TGT,如果没有或不对,转到CAS认证服务器登录页面,通过安全认证后得到ST和TGT,再重新定向到相关应用服务器,在回话生命周期之内如果再定向到别的应用,将出示ST和TGT进行认证,注意,取得TGT的过程是通过SSL安全协议的。2:PGT是ST签发的。原创 2023-02-23 16:32:33 · 474 阅读 · 0 评论 -
Spring 用到了哪些设计模式
这里我们声明一个了一个工厂方法getPrizeSender(),其入参就是SendPrizeRequest,而返回值是某个实现了PrizeSender接口的实例,可以看到,通过这种方式,我们将具体的选择方式下移到了具体的子类中的,因为当前实现了PrizeSender的bean是否支持当前request的处理,是由具体的子类实现的。可以看到,工厂方法将具体实例的选择进行了封装,而客户端,也就是我们的调用方只需要调用工厂的具体方法获取到具体的事例即可,而不需要管具体的实例实现是什么。原创 2023-02-22 16:35:28 · 470 阅读 · 0 评论 -
Spring Boot整合RabbitMQ教程
虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回.由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。zeroMq不支持,activeMq和rabbitMq都支持。(2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。原创 2023-02-22 16:30:08 · 541 阅读 · 0 评论 -
MyBatis-Plus详细讲解(整合spring Boot)
Piwigo相册,可以分享生活、记录漫漫人生路中的美好时光和感动,希望这个可以陪伴你的美好回忆。强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库。原创 2023-02-20 15:33:51 · 2447 阅读 · 0 评论 -
Spring Boot + Redis 实现分布式锁
例如,线程 A 先获取锁,proceed 方法耗时,超过了锁超时时间,到期释放了锁,这时另一个线程 B 成功获取 Redis 锁,两个线程同时对同一批数据进行操作,导致数据不准确。使用 Redis 作为分布式锁,将锁的状态放到 Redis 统一维护,解决集群中单机 JVM 信息不互通的问题,规定操作顺序,保护用户的数据正确。有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。所以记得多打点 Log,分析问题时可以更快一点。原创 2023-02-19 10:46:30 · 1172 阅读 · 0 评论 -
基于easyexcel的MySQL百万级别数据的excel导出功能
重写了POI对07版Excel的解析,之前一个3M的excel用POI sax解析,需要100M左右内存,如果改用easyexcel可以降低到几M,并且再大的Excel也不会出现内存溢出;需要注意的是:如果用job的话,要避免重复执行的情况。用户拿到这个百万级别的excel文件,到底有什么用途,在他们的电脑上能否打开该excel文件,电脑是否会出现太大的卡顿了,导致文件使用不了。,增加更多的查询条件,用户通过修改查询条件,多次导数据,可以实现将所有数据都导出的功能,这样可能更合理一些。原创 2023-02-17 18:05:16 · 1164 阅读 · 1 评论 -
毕业设计项目:基于 Android 的天气 APP
多知天气,主要是给大家学习一下。有些东西也是借鉴别人的主要借鉴的是别人的UI。仅供参考,不得用于商业项目,如果觉得对你有帮助,给个Star吧亲~在写项目的时候写了好多细节,都忘了很多了,还是很用心去处理一些问题的~还有引导页设计的不是很好,是直接扣网络上的图片,到第三个界面的时候点击一下就可以进去了~原创 2023-02-15 19:15:23 · 857 阅读 · 1 评论 -
spring中@Autowire和@Resource的区别在哪里?
基于字段的依赖注入方式,你在程序启动的时候无法拿到这个类,只有在真正的业务使用的时候才会拿到,一般情况下,这个注入的都是非null的,万一要是null怎么办,在业务处理的时候错误才爆出来,时间有点晚了,如果在启动的时候就暴露出来,那么bug就可以很快得到修复(当然你可以加注解校验).Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式。原创 2023-02-14 17:15:59 · 1925 阅读 · 2 评论 -
基于java的一款实时聊天系统,包含服务端 + 客户端 + web端
最终效果为什么先看最终效果?因为此刻代码已经撸完了。更重要的是我们带着感官的目标去进行后续的分析,可以更好地理解。标题中提到了,整个工程包含三个部分:1、聊天服务器聊天服务器的职责一句话解释:负责接收所有用户发送的消息,并将消息转发给目标用户。从效果图我们看到了一些内容:收到心跳包、收到消息,转发消息,这些内容后面会详细讲解。2、聊天客户端聊天客户端的职责一句话解释:登陆,给别人发聊天内容,收其它人发给自己的聊天内容。下面为方便演示,我会打开两个客户端,用两个不同用户登陆,然后发消息。原创 2023-02-14 17:07:21 · 7767 阅读 · 2 评论 -
一款基于java的超级棒的开源支付系统(用来毕设也不错),国内首款开源的互联网支付系统
最近年初刚开始了,小编想着应该会有很多公司开始冲一波今年的业绩,既然是冲业绩,就离不开我们的支付系统,所以小编就去网上给大家找到了一款超级棒的开源支付系统!它是国内首款开源的互联网支付系统,拥有独立的账户体系、用户体系、支付接入体系、支付交易体系、对账清结算体系。拥有支付系统通用的支付通道接入、用户管理、资金账户管理、对账清算管理、支付订单管理等功能;已接通支付宝支付和微信支付的多种支付方式,满足大部分企业业务系统的支付需求;配套完善的系统使用文档、部署文档、视频教程,学习使用更轻松;原创 2023-02-13 18:29:40 · 1141 阅读 · 0 评论 -
Spring项目中用了这种解耦模式,老大对我刮目相看
不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断,比如类型等于JSON,我就用JSON解析器,那如果新加一个类型的解析器,是不是调用的客户端还要修改呢?这显然太耦合了,本文就介绍一种方法,服务定位模式Service Locator Pattern来解决,它帮助我们消除紧耦合实现及其依赖性,并提出将服务与其具体类解耦。原创 2023-02-12 20:07:52 · 478 阅读 · 0 评论 -
多次代码迭代,应用责任链设计模式
责任链模式是一种理解上比较简单的行为设计模式,它允许开发者通过处理者链进行顺序发送,每个链节点在收到请求后,具备两种能力:对其进行处理(消费)将其传递给链上的下个处理者当你想要让一个以上的对象有机会能处理某个请求时,就可以使用责任链模式。通过责任链模式,为某个请求创建一个对象链,每个对象链依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。责任链到底解决了什么问题?前置检查,减少不必要的后置代码逻辑。原创 2023-02-09 17:59:45 · 149 阅读 · 0 评论 -
springboot 3 下连接 mysql 数据库以及整合 mybatis-plus
springboot 3版本整合 mybatis 3.0.5版本控制台报错 Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required,NestedIOException 这个类在 Spring 6 版本中直接删除了。对的,直接删除了。而 MyBatis 老版本还没有同步更新,所以直接就报红了。而整合 mybatis 的 mybatis-plus 自然也会报红。原创 2023-02-08 18:03:00 · 3028 阅读 · 2 评论 -
到底什么样的 REST 才是最佳 REST?
说起 REST API,小伙伴们多多少少都有听说过,但是如果让你详细介绍一下什么是 REST,估计会有很多人讲不出来,或者只讲出来其中一部分。今天松哥就来和大家一起来聊一聊到底什么是 REST,顺便再来看下 Spring HATEOAS 的用法。原创 2023-02-07 20:29:24 · 66 阅读 · 0 评论 -
SpringBoot 如何保证接口安全?老鸟们都是这么玩的!
因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间比较,是否超过了60s,如果超过了则认为是非法请求。这种方案nonce和timestamp参数都作为签名的一部分传到后端,基于timestamp方案可以让黑客只能在60s内进行重放攻击,加上nonce随机数以后可以保证接口只能被调用一次,可以很好的解决重放攻击问题。步骤2:服务端接收到客户端的请求,然后使用约定好的秘钥对请求的参数再次进行签名,得到签名值sign2。原创 2023-02-07 20:26:15 · 534 阅读 · 0 评论 -
Java两大工具库:Commons和Guava
运行main方法,可以看到,尽管没有显式声明观察者接口,但通过一个@Subscribe注解,就完成了方法回调。除了操作集合、限流和缓存,Guava还有另一个隐秘的功能:事件总线EventBus机制——是发布-订阅模式的实现,不需要显式地注册回调——比观察者模式更灵活。2、支付抽象类实现这两个子接口,具体支付类阿里支付、微信支付和余额支付,也都分别实现这两个子接口;3、在账户类中加入观察者接口列表,并增加注册、删除和调用观察者接口的方法;5、在交易完成后,就可以调用账户的调用观察者接口的方法,实现回调。原创 2023-02-06 23:25:33 · 169 阅读 · 0 评论 -
说一下 Spring 中 Bean 的生命周期?
Bean 的生命周期指的是 Bean 在 Spring(IoC)中从创建到销毁的整个过程。Bean 的生命周期主要包含以下 5 个流程:1.实例化:为 Bean 分配内存空间;2.设置属性:将当前类依赖的 Bean 属性,进行注入和装配;3.初始化:执行各种通知;执行初始化的前置方法;执行初始化方法;执行初始化的后置方法。4.使用 Bean:在程序中使用 Bean 对象;5.销毁 Bean:将 Bean 对象进行销毁操作。原创 2023-02-01 15:51:20 · 79 阅读 · 0 评论 -
Spring 解决循环依赖必须要三级缓存吗?
我们都知道 Spring 是通过三级缓存来解决循环依赖的,但是解决循环依赖真的需要使用到三级缓冲吗?只使用两级缓存是否可以呢?本篇文章就 Spring 是如何使用三级缓存解决循环依赖作为引子,验证两级缓存是否可以解决循环依赖。原创 2023-02-01 15:40:15 · 376 阅读 · 1 评论 -
高性能的本地缓存方案选型,看这篇就够了!
随着不断的发展,这一架构也产生了改进,在一些场景下可能单纯使用Redis类的远程缓存已经不够了,还需要进一步配合本地缓存使用,例如Guava cache或Caffeine,从而再次提升程序的响应速度与服务性能。缓存的本质就是存储在内存中的KV数据结构,对应的就是jdk中线程安全的ConcurrentHashMap,但是要实现缓存,还需要考虑淘汰、最大限制、缓存过期时间淘汰等等功能;本地缓存基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度。原创 2023-01-30 17:08:33 · 399 阅读 · 0 评论 -
Mysql B+树索引的推演
● 为了充分利用聚簇索引的聚簇特性,所以InnoDB表的主键列尽量选用有序的顺序ID,而不建议用无序的id,比如UUID、字符串等列作为主键无法保证数据的顺序增长。● 聚簇索引的叶子节点存储的就是我们的数据记录,非聚簇索引的叶子节点存储的是数据位置。聚簇索引并不是一种单独的索引类型,而是一种存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引及数据,数据即索引。页(假如页b),这时插入的记录根据键值的大小就会被分配到页a或者页b中,而根节点变升级为存储目录项记录的页。原创 2023-01-22 23:12:13 · 69 阅读 · 0 评论 -
Spring+Boot核心笔记(二):Web开发所需掌握知识点
出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);(1)SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;原创 2023-01-18 18:12:53 · 254 阅读 · 0 评论 -
Spring+Boot核心笔记(一):环境准备、配置文件详解、日志模块
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfifiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效。SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;原创 2023-01-18 16:00:58 · 292 阅读 · 0 评论 -
自学java入门以及系统性的知识架构
先了解一下招聘java岗需要的一些技术:大家看了上面三家的招聘要求是否发现,目前作为初级Java工程师的要求都是差不多的,主要框架就是SpringMVCMybatisSpringBoot为主。而数据库是MySQL和Oracle,一般中小型公司是用MySQL,而稍微规模稍微大一点的公司则是Oracle为主,以及Web相关的基础内容和一些如gitMavenSVN工具的使用。所以我们必须先了解目前市场都是需要学习什么技术,你所学的知识要有用武之地才行,紧贴时代的前沿。原创 2023-01-16 17:47:50 · 182 阅读 · 1 评论 -
java并发编程中Future、CompleteFuture、ForkJoin的应用
Future一、应用场景● 在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。● Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。原创 2023-01-14 11:01:22 · 3255 阅读 · 1 评论 -
jvm中的不同垃圾收集器特点以及区别
jvm中的不同垃圾收集器特点以及区别原创 2023-01-13 18:02:26 · 309 阅读 · 0 评论