Java
文章平均质量分 67
Java
神农尝百码
编程改变命运,励志照亮人生
展开
-
黑马程序员 Java设计模式学习笔记(一)
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。原创 2024-01-14 19:23:05 · 1080 阅读 · 0 评论 -
【经典面试题】如何保证消息一定能发送到RabbitMQ
当我们作为一个消费发送方,如何保证我们给RabbitMQ发送的消息一定能发送成功,如何确保一定能收到这个消息呢?我们知道,RabbitMQ的消息最终是存储在Queue上的,而在Queue之前还要经过Exchange,那么这个过程中就有两个地方可能导致消息丢失。第一个是Producer(发送者)到Exchange(交换机)的过程,第二个是Exchange到Queue的过程。为了解决这个问题,有两种方案,一种是通过confirm机制,另一种是事务机制。原创 2024-06-27 13:25:10 · 406 阅读 · 0 评论 -
【经典面试题】RabbitMQ如何防止重复消费?
以上操作需要有一个前提,那就是第一步加锁和第二步判断的时候,需要有一个依据,这个就是幂等号了,通常需要和上游约定一个唯一 ID 作为幂等号。RabbitMQ的消息消费是有确认机制的,正常情况下,消费者在消费消息成功后,会发送一个确认消息,消息队列接收到之后,就会将该消息从消息队列中删除,下次也就不会再投递了。但是如果存在网络延迟的问题,导致确认消息没有发送到消息队列,导致消息重投了,是有肯呢个,所以当我们使用MQ的时候,消费者端自己也需要做好幂等控制来防止消息被重复消费。第二步,进行幂等性判断。原创 2024-06-27 12:41:44 · 698 阅读 · 0 评论 -
【RabbitMQ】一篇文章带你理解消息分发的六种模式
在路由模式中,一个生产者将消息发送到交换器中,并制定消息的路由键,交换器根据路由键将消息路由到与之匹配的队列中。用于实现一个任务在多个消费者之间的并发处理,在工作队列模式中,一个生产者将消息发到一个队列中,多个消费者从队列中获取并处理消息,每个消息只能被一个消费者处理。在主题模式中,一个生产者将消息发送到交换器中,并指定主题(Topic)作为路由键,交换器根据通配符匹配将消息路由到与之匹配的队列中。在简单模式中,一个生产者将消息发到一个队列中,一个消费者从队列中获取并消费消息。原创 2024-06-21 10:22:50 · 250 阅读 · 0 评论 -
【经典面试题】Java创建对象有几种方式?
这是一道超级经典的面试题。创建对象共有有六种方式。原创 2024-06-07 13:22:57 · 315 阅读 · 0 评论 -
一篇文章带你弄懂Java集合的泛型
Java泛型(generics) 是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。泛型的好处有两个:可以提高代码的复用性。以List接口为例,我们可以将String、Integer等类型放入List中,如不用泛型,存放String类型要写一个List接口,存放Integer要写另外一个List接口,泛型可以很好的解决这个问题。原创 2024-05-27 09:49:21 · 483 阅读 · 0 评论 -
String类为什么设计成不可变的?
其实这个问题我们可以通过缓存、安全性、线程安全和性能几个维度去解析。原创 2024-05-26 13:22:36 · 328 阅读 · 1 评论 -
Java根据x,y坐标为图片画红框,并返回新图片
【代码】Java根据x,y坐标为图片画红框,并返回新图片。原创 2024-04-25 17:37:08 · 237 阅读 · 0 评论 -
IDEA 一键启动多个微服务项目
有时候我们大型的微服务项目服务很多,每次一个个启动太麻烦,那么如何一键启动呢?先shift全选微服务,然后右键,选择组配置。然后右键组名,就可以一键启动啦!如果本来就有可以跳过这一步。左侧就有了所有的微服务名称。添加组名,任意名称均可。原创 2024-04-19 09:37:05 · 995 阅读 · 0 评论 -
一篇文章带你了解什么是云计算,SaaS PaaS IaaS的区别
在了解云计算之前,我们先要了解什么是“计算”,支撑计算我们需要硬件基础设施和软件环境。硬件包括服务器、存储、网络等... 软件环境包括数据库、中间件、操作系统等...云就是个地理概念,指的是计算在云端发生,如果一家企业买了阿里云服务来部署他的系统,那么这个系统的计算和处理就发生在阿里云数据中心的机房里。。原创 2024-04-14 20:41:30 · 562 阅读 · 0 评论 -
【尚硅谷最新】一篇文章带你搞懂Maven
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。当然也并不是说私服只能建立在局域网,也有很多公司会直接把私服部署到公网,具体还是得看公司业务的性质是否是保密的等等,因为局域网的话只能在公司用,部署到公网的话员工在家里也可以办公使用。建立了 Maven 私服后,当局域网内的用户需要某个构件时,会按照如下顺序进行请求和下载。请求本地仓库,若本地仓库不存在所需构件,则跳转到第 2 步;原创 2024-04-13 21:49:27 · 1073 阅读 · 0 评论 -
jdk17下载安装图文教程【超详细】
在【系统变量】中新建JAVA_HOME,值为刚才我们复制的jdk安装路径。右键点击我的电脑>属性>高级系统设置>环境变量。原创 2024-03-13 21:30:56 · 3852 阅读 · 0 评论 -
若依(RuoYi-Vue)+Flowable工作流前后端整合教程
此教程适合项目,其他项目可以在扩展列表中进行查找。近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这篇文章),然后我在官网看到了RuoYi-Vue-Flowable这个项目,按照文档提供的迁移方式对于我们这个老版本的项目来说无法正常运行,所以我联系了作者并更新了一下文档,打算在网上在发布一篇(毕竟有的人懒得看官方文档)。官方项目地址:https://gitee.com/tony2y/RuoYi-flowable。转载 2024-03-13 15:17:49 · 6823 阅读 · 2 评论 -
【尚硅谷】MybatisPlus 学习笔记(下)
*** 根据年龄查询用户列表,分页显示* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位* @param age 年龄* @return*/原创 2024-02-24 23:06:44 · 1279 阅读 · 0 评论 -
【尚硅谷】MybatisPlus 学习笔记(上)
创建UserMapper.xml文件/*** 根据id查询用户信息为map集合* @return*/@TestWrapper : 条件构造抽象类,最顶端父类AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件QueryWrapper : 查询条件封装UpdateWrapper : Update 条件封装AbstractLambdaWrapper : 使用Lambda 语法。原创 2024-02-24 21:21:01 · 1472 阅读 · 0 评论 -
如何复制IDEA中的提示?
在idea中,例如下面的提示我使用ctrl + c怎么都复制不了,其实是有窍门的。复制,提示框会自动关闭,这时就已经复制成功了!首先先把光标移动到提示框内,然后用。原创 2024-02-21 17:15:52 · 256 阅读 · 0 评论 -
Spring Bean的生命周期
由于Bean的生命周期是交由Spring管理的,所以我们无法像自己控制这些动作时那样任意地在Bean创建后或Bean销毁前增加某些操作。但Spring为我们提供了几种途径,共三种方式。方法,经过这三个步骤才算完成了Bean的初始化。我们已经知道现在SpringLifeCycle类对象已经初始化完成,可以使用了。我们再测试一下销毁方法,右键运行Application类中的main方法。发现也成功的在Bean销毁前调用了回调方法。操作,在正式销毁对象前,会先调用容器的。所需的依赖,最后调用。原创 2024-02-13 21:53:19 · 421 阅读 · 0 评论 -
Mysql与Redis如何保证数据一致性问题
耦合性太大,因为是同步,当请求redis没有缓存时,查询数据库数据存到redis中,那么在缓存到redis过程中,redis宕机了,那么必然会触发重试机制,导致影响接口的响应速度。原创 2024-01-07 17:08:24 · 2250 阅读 · 0 评论 -
Java分布式锁理论(redis、zookeeper) 详解
1、定时任务2、秒杀抢购,防止库存超卖的问题3、双写一致性协议比如我们为了高可用性搭建了服务集群,分别是8080和8081,我们在项目中设立定时任务,目的是每天晚上定时拉取用户数据,给每个人发送一些推荐短信。那么这会出现什么问题呢?8080和8081都有定时任务,到半夜2点同时查询数据库,同时调用阿里云接口发短信,那么肯定会重复,使用了分布式锁,8080抢到锁执行定时任务,那么8081就会阻塞不会执行。那么肯定会有人问,为什么不用synchronized锁呢?原创 2024-01-07 20:57:09 · 1311 阅读 · 0 评论 -
除了ConcurrentHashMap,还有哪些线程安全的Map?
首先我们都知道HashMap在线程环境下存在线程安全问题,那么有什么替代的方案呢?原创 2024-01-08 12:40:50 · 518 阅读 · 0 评论 -
分布式事务 详解
首先我们知道本地事务的脏读是:一个事务没有提交的数据被另外一个事务读到,而全局事务是多个本地事务的集合,如果在全局事务下,某个本地事务提交了,如果没有全局控制,那么这个提交的事务也有可能被其他事务读到,也是一种脏写。那么调用已完成,这时支付服务方报错了,那么通过undolog日志会进行逆向回滚,回滚到之前的状态,然后通知事务协调者,告诉积分服务也要回滚,那么积分服务的undolog日志也进行了逆向回滚,insert的逆向就是delete,这样两个服务就都回滚成功了。但Seata提交了事务,所以可以查到。原创 2024-01-11 23:05:39 · 1113 阅读 · 0 评论 -
Spring事务传播行为 详解
首先insertOrder()方法是A方法(外层方法),而insertMember()是B方法(内层方法),属于A调用B。因为有了@Transactional注解,所以第一句代码insert开启事务(外层事务),第二句代码调用了方法,insertMember()方法也有@Transactional注解,所以开启了内层事务。当第三句代码报错时,这时候我们要问自己一个问题:(1)当外层方法里有代码报错时,内层方法是否也进行回滚。(2)内层方法里代码报错时,外层事务是否也进行回滚。原创 2024-01-05 09:33:36 · 412 阅读 · 0 评论 -
Java8新特性 Stream流详解
Stream流思想类似于工厂车间的流水线,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。我们会发现这样又循环又创建新的集合再存进去,很麻烦Collections.addAll(nameList,"张无忌","周芷若","赵敏","说不得","张乐");//拿到所有姓张的放进zhangList中if(name.startsWith("张")){//遍历姓张的,拿出名字长度等于3的。原创 2024-01-03 10:53:00 · 1303 阅读 · 0 评论 -
StringUtils.isNotBlank与isEmpty()详解
判断参数是否不为空。原创 2024-01-02 22:20:36 · 1568 阅读 · 0 评论 -
为什么要用雪花算法?
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。其实就是用来解决分布式ID,随着业务的增长,你的某张表可能要占用很大的物理存储空间,为了解决该问题,后期使用数据库分片技术。将一个数据库进行拆分,通过数据库中间件连接。如果数据库中该表选用ID自增策略,则可能产生重复的ID,此时应该使用分布式ID生成策略来生成ID。原创 2023-12-18 09:37:07 · 208 阅读 · 0 评论 -
IDEA中,如何将maven项目变为SpringBoot项目?
这很简单不做过多赘述。原创 2023-12-17 16:28:39 · 829 阅读 · 0 评论 -
try...catch 应该放在 for 循环里面还是外面?
先说结论,没有好与不好之分,还是要看业务场景决定。原创 2023-12-14 14:24:14 · 337 阅读 · 0 评论 -
Spring 框架有哪些缺点?
Spring的依赖注入和AOP(面向切面编程)功能虽然提供了极大的灵活性和便利,但它们在运行时也可能引起性能开销。Spring框架的一些功能,如自动装配和AOP,被认为是"魔法",因为它们隐藏了很多底层细节。虽然Spring Boot尝试通过约定优于配置的理念来减少配置的复杂性,但在某些情况下,配置仍然可能变得难以管理。在这个例子中,服务类使用了Spring的特定功能,如自动注入,这可能导致与Spring的紧密耦合。依赖注入是Spring框架的核心功能之一,但如果滥用,可能导致代码难以理解和维护。原创 2023-12-13 15:07:52 · 433 阅读 · 0 评论 -
完爆MyBatis-Plus?来领略一下 MyBatis-Flex 的优雅魅力!
Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。原创 2023-12-13 10:34:47 · 280 阅读 · 0 评论 -
@Transient注解
今天我在写代码,突然发现JavaBean实体类的属性上有个@Transient注解,我简单的查了一下作用,其实意思就是你数据库不存在此字段,但你还想使用此字段才用这个注解。所以@Transient就是在不需要某个属性加到数据库中,并且只是作为一个临时变量的时候使用,比如一些多表查询等等,这样也不用多写一些实体类,非常方便。前三个字段我数据库都有,但是deptNames是数据库没有的,我是用了别名方式as deptNames来返回数据。原创 2023-11-06 14:02:50 · 321 阅读 · 0 评论 -
Postman实现上一个请求的返回值用作下一个请求的参数
这个环境变量就是我们一个公共的变量,上一个请求返回的值赋值给此环境变量,下个请求再把此环境变量引入当作参数。先请求你的上一个接口,也就是点击右侧的send按钮,再请求下一个接口,就可以实现这种效果了。原创 2023-06-05 12:29:13 · 2074 阅读 · 1 评论 -
idea创建maven项目
这篇博客的主要目的为使用idea来创建一个maven项目,遇到问题解决问题!一、首先,我们打开idea,点击菜单左上角的File,选择new一个project:二、然后我们看到如下界面,并选择左侧的maven,右侧Create from archetype一定要打上勾,方便选择:三、然后我们选择下面带有webapp的选项(注意:一共有两个webapp,看好再选)四、选好...原创 2018-11-24 17:31:24 · 357 阅读 · 0 评论 -
IDEA调出services窗口
第一步:点击下图选项 第二步:Templates添加Spring Boot,然后Apply即可调出services窗口原创 2023-05-27 21:29:06 · 3389 阅读 · 0 评论 -
idea如何一个项目启动两个tomcat服务(不同端口)
这样左下角Services就出现我们设置的两个服务了,依次运行。注意:一定要勾选springweb的场景启动器,我们用来测试。如果你的idea没有Services,参考我的另一篇文章。第二步:编写一个controller代码,用来接收请求。第四步:依次访问8080、8081两个服务进行测试。第三步:复制服务,端口设置为8081。原创 2023-06-04 20:04:11 · 2940 阅读 · 0 评论 -
SpringBoot实现当项目启动时执行某方法
实现InitializingBean接口,在项目启动时,当前类创建之后,并且成员变量都初始化以后再执行。原创 2023-06-04 20:20:53 · 73 阅读 · 0 评论 -
SpringCloud教程(上)
通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。原创 2023-08-14 19:21:39 · 533 阅读 · 0 评论 -
SpringCloud教程(中)
涉及到断路器的三个重要参数:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。原创 2023-08-15 16:22:52 · 347 阅读 · 0 评论 -
SpringCloud教程(下)
Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus。Hystrix需要我们程序员自己手工搭建监控平台。没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级。Sentinel单独一个组件,可以独立出来。直接界面化的细粒度统一配置。资源名:唯一名称,默认请求路径。针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。原创 2023-08-16 12:08:30 · 103 阅读 · 0 评论 -
Java BigDecimal详解
我们发现,计算出来的值和我们预期结果不一致。原因在于我们的计算机是二进制的。浮点数没有办法使用二进制进行精确表示。计算机的 CPU 表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运算的时候要特别小心。原创 2023-08-28 18:02:44 · 477 阅读 · 0 评论 -
Java 数组操作工具类Arrays用法
注意:判断的并不是地址值,而是从元素个数、元素位置、元素顺序上看是否真的相同。结果是一串我们看不懂的地址值。我们如何打印出数组的信息呢?原创 2023-08-30 10:48:39 · 118 阅读 · 0 评论