自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

FirstMrRight的博客

追求优雅代码的程序员

  • 博客(254)
  • 收藏
  • 关注

原创 从源码分析常见集合的区别之List接口

List接口实现自接口,是Java的集合框架中的一员,List接口下又有和线程安全的,今天就简单分析一下和的异同以及各自的优势。

2023-08-14 15:14:47 404

原创 MySQL不走索引的情况分析

innodb表的统计信息并不是实时统计更新,如果统计信息和实际的索引信息差异很大,就会导致优化器计算各个索引成本后,做出非预期的选择。出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。查询频繁是数据表字段增加合适的索引。

2023-08-11 22:42:22 927

原创 SpringBoot MDC全局链路解决方案

Filter是Java Servlet 规范定义的一种过滤器接口,它的主要作用是在 Servlet 容器中对请求和响应进行拦截和处理,实现对请求和响应的预处理、后处理和转换等功能。通过实现 Filter 接口,开发人员可以自定义一些过滤器来实现各种功能,如身份验证、日志记录、字符编码转换、防止 XSS 攻击、防止 CSRF 攻击等。那么这里我们使用它对请求做MDC赋值处理。

2023-08-08 22:12:52 826

原创 百万数据分页查询优化方案

分页列表查询是项目中的热点需求,这种需求的特点是:字段多、数据量大、访问频繁、使用率高的特点,这个功能是给用户最直观的展示系统的信息,针对于多、大、频、热这几个特点,会引申出一个问题:列表展示的数据可能是来自于不同的数据维度、需要关联N张表查询得到,那么,如何让用户更快、更准的获取到需要的数据,便成了程序员在编码时需要考虑到并且需要解决的问题,因为随时间推移,线上系统不乏几百万数据的表。实际的业务场景下,可能会关联N张表,而且线上服务器的压力会比单机开发环境更重,因此实际接口响应时间会更长。

2023-07-26 08:38:56 371

原创 Git最佳实践-Git flow

提高团队协作效率,人人有责。

2023-02-02 11:55:43 345

原创 MySQL-MVCC多版本控制及事务的隔离性

MySQL的InnoDB引擎具有不同的事务隔离级别,不同事务隔离级别通过视图创建时机的不同来实现。MVCC:Multiversion concurrency control,即多版本控制,在并发访问数据库时,通过对数据做多版本管理,也就是为每条记录保存多份历史数据供读事务访问,新的写入只需要添加新的版本即可,无需等待。避免因为写数据时要加写锁而阻塞读取数据的请求,实现读取数据不用加锁,读取数据同时修改。修改数据同时可读取。多版本指的是数据表中同一个行数据可能会有多个版本(row),每次事务更新数据的时候,都

2022-12-03 21:59:01 482

原创 从Mapper到JavaBean源码层面解析ResultMap是怎么映射的

起点:源码下载:本文以3.3.x分支版本源码为例。在源码工程的test中以NestedQueryCacheTest测试类下的testThatNestedQueryItemsAreRetrievedFromCache为例:该方法中调的Mapper为:<resultMap id="selectAuthor" type="org.apache.ibatis.domain.blog.Author"> <id column="id" property="id" /> <

2022-05-29 21:23:08 354

原创 Netty协议-Rocket MQ之NettyRemotingClient/Server

RocketMQ性能强劲依赖于Netty通讯协议和特定的通讯协议。通信流程NettyRemotingAbstract类的内部有一个NettyServerHandler内部类,该类中封装了客户端与服务端交互的基础代码。processMessageReceived根据cmd类型处理msg信息 @ChannelHandler.Sharable class NettyServerHandler extends SimpleChannelInboundHandler<RemotingCo

2022-03-23 17:29:21 3658

原创 pageHelper-v4.2源码阅读-分页是怎么实现运行的?

pageHelper的分页是怎么实现运行的?下载pageHelper源码,使用pageHelper的官方demo进行Debug试验。源码地址:本文使用分支: 4.2PageHelper.startPage(2, 10, "id desc");点进第一个断点PageHelper.startPage<E> :Element,常表示List<E>,使用泛型的方式是得代码得到复用,达到允许放入不同List的功能。SqlUtil.getLocalPage:SqlUt

2022-02-08 10:10:42 427

原创 线上问题排查一接口拒绝连接排查思路

在使用feign或者HTTP形式调用接口时,有可能会出现目标接口无法调通,目标服务器拒绝连接的情况。出现该问题的原因有:目标服务器防火墙配置更改,已关闭目标端口。生产者(接口提供方)服务挂掉。排查思路:检查目标服务器防火墙配置,开启目标端口,重启防火墙检查目标服务器服务状态解决过程:查看服务器调用者日志,当出现接口拒绝连接时,可参考以下方案:使用ping IP命令查看目标服务器是否宕机。如果可以Ping通,则可以进行下一步。如果不通需要确认目标服务器是否禁用ping命令或者联系相

2021-12-29 21:32:16 2398

原创 @Value读取properties中文乱码解决方案

当我们在项目中需要读取配置文件的变量时,往往会遇到读取中文乱码的问题:英文字符则不会出现该问题。出现该问题的原因是:SpringBoot在加载配置文件时,使用的默认编码是:ISO_8859_1。详细原因请参考:https://eericzeng.github.io/2019/06/29/SpringBoot%E4%BD%BF%E7%94%A8@Value%E8%AF%BB%E5%8F%96.properties%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E5%

2021-12-16 22:07:08 6616

原创 HashMap不完全解读

HashMap的几个重要知识点HashMap是无序且不安全的数据结构。存储结构是数组 + 链表 + 红黑树 (阈值为8 如果链表长度<=8则会把链表变成红黑树 ),数组中存储元素Entry,存储元素的位置被称为桶,每个bucket有且仅有一个元素并指定索引,以实现快速访问。HashMap 是以key–value对的形式存储的,key值是唯一的(可以为null),一个key只能对应着一个value,但是value是可以重复的。HashMap 如果再次添加相同的key值,它会覆盖key值所对应的

2021-02-18 21:52:54 223 4

原创 设计模式之外观(门面)模式

外观(门面)模式外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。类似的实际例子有消息中间件,把一个数据丢到消息中间件,谁需要,谁去消息后中间件去拿。这种设计模式可以用于解耦。我们举个栗子,你要去政府办一件事,你需要先从门口去一楼,再从门口去二楼、最后从门口去五楼,这样整个流程会特别繁琐,外观模式就提供一个门面接口(Facade),门面内把原来的

2020-12-26 20:34:45 1150 1

原创 客官留步,您真的会使用@Component+@Bean注解(配置类)吗?

由此及彼我在写如何在Spring中优雅的使用单例模式?一文的时候有使用到@Component(“xxx”)注解,总所周知,该注解可以将普通的Java类实例化到Spring容器中,可以替代Spring 4.0 版本之前xml配置,xxx就等同于xml中的bean标签的id(所以需要保证唯一),不知道大家有没有了解过Spring配置类的Full模式和Lite模式?如果您第一次听到这个概念,您不妨花费几分钟往下读一读,或许可以让您少掉几根秀发。详细介绍Full模式、Lite模式是针对于Spring的配置“类

2020-12-05 23:18:53 3255 5

原创 BeanUtils.copyProperties知多少?

事出有因近期在读《阿里巴巴开发手册》的时候发现:阿里强制避免使用BeanUtils进行属性的拷贝,但是不得不承认的是,在我自己的项目中确实使用过Apache的Beanutils进行属性拷贝,在读了开发手册后,感觉项目中的代码可以优化一下,基于不同包下的BeanUtils性能和特性有所不同,当然用法也不尽相同,所以,可以你可能会跳入因为导错包导致对象拷贝为null的坑。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBUkz72I-1606834874223)(C:\Use

2020-12-01 23:03:18 1845 3

原创 基于SpringBoot的策略模式demo

策略模式策略模式是Java 23种设计模式之一,在https://refactoring.guru/design-patterns/网站中这样对策略模式进行了解释:Strategy is a behavioral design pattern that turns a set of behaviors into objects and makes them interchangeable inside original context object.白话翻译一下就是:策略模式可以根据上下文对象的不同

2020-11-29 02:07:30 877

原创 图解JDK 8 HashMap

HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前HashMap由 数组+链表 组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。

2024-04-14 16:30:51 207

原创 利用Spring Boot实现MySQL 8.0和MyBatis-Plus的JSON查询

在现代的Web开发中,处理JSON数据已经变得无处不在,而在关系型数据库中高效地查询JSON结构变得愈发重要。MySQL 8.0结合MyBatis-Plus和Spring Boot,为管理和查询JSON数据提供了强大的工具。在本文中,我们将探讨两种使用MySQL 8.0和MyBatis-Plus在Spring Boot应用中查询JSON数据的方法。

2024-03-04 20:31:34 1021

原创 基于Java和Spring:实现图片压缩、WebP格式转换与水印添加

WebP官网WebP是一种由Google开发的现代图像格式,旨在提供更高的压缩率和更好的图像质量,相比于传统的JPEG、PNG等格式,能够显著减少图像文件的大小。WebP图像通常具有更小的文件大小,因此可以加快网页加载速度,节省带宽和用户的流量消耗。WebP图像支持有损压缩和无损压缩两种模式。在有损压缩模式下,WebP图像通常能够实现较高的压缩比,而在无损压缩模式下,WebP图像则可以保留原始图像的质量而实现较小的文件体积。

2024-02-24 14:02:26 1053

原创 优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化

作为一名程序员,我们的代码首先要保证功能可用,在功能可用的前提下,要保证代码质量可读性、安全、性能等。吾日三省吾身,多思考一下代码如何能写的更好,这要求我们需要不断探索代码的最佳实践。保持持续学习的态度,每天优化一点点,一点点改进,从而写出更加优雅、高效和安全的代码。

2024-02-19 11:52:06 445

原创 深入分析 Spring 中 Bean 名称的加载机制

深入分析-Spring BeanDefinition构造元信息》XML配置文件、注解、Java配置类,从Spring Framework 3.0(2019年12月发布)版本开始推荐使用注解来定义Bean,而不是XML配置文件,因此,本文的重点是放在探索Spring Framework如何从使用注解定义的Bean元数据中获取到Bean的名称。在Spring Framework中用于生成基于注解的Bean名称,其主要作用是根据指定的注解信息,生成符合规范的Bean名称。

2024-01-13 22:39:29 927

原创 深入分析-Spring BeanDefinition构造元信息

/value = “HelloService” 即为Bean:HelloService的元数据,在构造方法中的依赖关系同样属于元数据。@Component(value = “balanceRedisProcessor”) 是Bean:BalanceRedisProcessorService的元数据,在构造方法中的依赖关系同样属于元数据。return id;// 2. 通过 AbstractBeanDefinition 以及派生类。

2024-01-07 14:49:18 987 1

原创 探秘Spring中的BeanDefinition:每个Bean都是一个独特的“小镇居民”

在Spring框架中,核心思想之一就是将应用程序中的各种组件,例如对象、服务、数据源等,都抽象为Spring Bean,并将它们注册到Spring容器中。这种注册的方式提供了一种基于IoC(Inversion of Control,控制反转)的管理方式,即不再由应用程序主动去创建和管理对象,而是由Spring容器负责管理和注入这些对象。而BeanDefinition是用来描述和定义Bean的元数据对象。BeanDefinition包含了关于Bean的各种信息,如类名、属性值、构造函数参数等。

2024-01-04 09:08:29 912

原创 MapStruct @Mapping注解:优雅处理映射中的Null值

Mapping注解是MapStruct中用于定制字段映射关系的重要工具。通过@Mapping注解,我们可以指定源对象和目标对象之间的字段映射关系,包括字段名、转换方法等信息。在处理Null值时,@Mapping注解提供了一些强大的选项,使得映射过程更加灵活和可控。除了使用默认值和设置目标对象字段为默认值之外,MapStruct还支持自定义Null值处理策略。通过在@Mapper注解中配置nullValueCheckStrategy属性,我们可以指定一个自定义的策略类,来决定在映射过程中如何处理Null值。

2023-12-27 21:19:06 1319

原创 Spring Framework中BeanFactory与ApplicationContext的关系与区别

首先来看来自官方文档的描述:我们来翻译一下:beans和context是Spring Framework的IoC容器的基础。BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。IoC(Inversion of Control)是Spring Framework的核心设计思想:它将对象的创建、组装、管理交给容器(container),BeanFactory提供了访问IoC的接口,使得开发者可以更方便的使用Spring框架来实现控制和依赖注入。

2023-12-23 17:55:40 850

原创 深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践

在深入讨论的内存泄漏问题之前,我们先来了解一下的基本概念。是Java中的一个工具类,提供了一种线程级别的数据隔离机制。通过,我们可以在每个线程中存储自己的数据副本,互不影响,从而简化了多线程编程中的共享数据问题。是一个强大的工具,能够在多线程环境中解决共享数据的问题。然而,开发者在使用时应当小心,特别是在长时间存在的线程和线程池等场景下,要注意及时清理,以避免内存泄漏的发生。通过正确的使用习惯和最佳实践,可以更好地发挥的优势,确保多线程环境下的数据安全和性能。

2023-12-12 15:37:12 942

原创 2023年终总结-轻舟已过万重山

白,陇西布衣,流落楚、汉。-与韩荆州书我来自孔孟故里山东济宁,也许是小学时的某一天,我第一次接触到了电脑,从此对它产生了强烈的兴趣,高中我有一个愿望:成为一名计算机从业者。18岁的我踏入北上的列车,进入我的大学生活。可录取通知书上并非我期待的那样:被计算机学院录取从此踏上编码的快车道。也许是高中比较喜欢当时化学老师的课,在我能填报的六个志愿中,我无一例外的把计算机、软件类专业放在了第一个,把化工、化学相关的专业放在了第二个。

2023-12-09 21:31:36 983

原创 SUM函数在SQL中的值处理原则

的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。函数时,对于字段中的NULL值,需要特别注意其处理原则,以确保计算结果的准确性。🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。如果SUM函数作用的字段在所有匹配的记录中存在任意一条数据不为。函数是用于计算指定字段的总和的聚合函数。值替换为特定的默认值,从而更好地控制计算的行为。函数作用的字段在所有匹配的记录中均为。在实际应用中,确保对字段的。

2023-12-07 08:45:00 527

原创 深入解析ThreadPoolTaskExecutor的阻塞队列技术选型

是Spring框架中强大的线程池实现,通过合理选择阻塞队列类型,我们可以更好地满足应用程序的需求,提高性能和稳定性。在实际应用中,根据具体场景调整线程池配置,选择适当的阻塞队列,将有助于构建出更为健壮和高效的多线程应用。希望本文对您理解的阻塞队列提供了一些有价值的信息。如果您有任何问题或建议,请随时在评论中分享。

2023-12-06 09:54:18 600

原创 你离高级开发只差这些IntelliJ IDEA Debug使用技巧

IntelliJ IDEA,由JetBrains(捷克共和国)开发的一款强大的Java集成开发环境(IDE),因其丰富的功能、智能的代码辅助以及用户友好的界面设计,在全球范围内广受Java开发者的喜爱,在国内,笔者遇到过不使用IDEA的Java程序员不超过三个。它使开发者能够逐行执行代码,检查运行时的状态,包括变量值、内存占用、线程状态等,从而帮助开发者理解代码的实际行为,定位并修复错误。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。

2023-12-04 16:21:27 1007

原创 MySQL find_in_set函数的深入解析与应用

是MySQL中的一个字符串函数,用于搜索一个字符串在另一个逗号分隔的字符串列表中的位置。如果找到匹配,它返回一个大于0的整数表示位置,否则返回0。其中,str是要查找的字符串,strlist是逗号分隔的字符串列表。

2023-12-04 12:04:36 1005

原创 订单场景-基于Redisson实现订单号生成

订单、指定长度随机码生成是业务系统中重要且不可避免的一个需求,往往在电商系统中,业务量、并发量庞大,如何不重复、快速、安全的生成一个订单号成了需要重点考虑的问题。当生成订单号的逻辑和订单创建、落库逻辑分开,每次点击提交订单时,前端调用单独的生成订单号接口,再拿着生成的订单号去请求订单创建、落库的逻辑,每次生成的订单号都不一致,这样便保证了每次的请求都不是重复的,接下来实现不重复的订单号逻辑即可。需要注意的是,使用分布式锁会增加系统的复杂度和开销,可能会影响系统的性能和可用性。

2023-12-01 15:52:10 612 1

原创 数据库设计范式

数据库设计是构建可靠和高效系统的关键步骤之一。设计范式是一种规范,它帮助开发人员减少数据冗余、提高数据一致性和完整性。本文将探讨数据库设计范式的重要性,并通过基于MySQL的表设计示例来佐证其应用。

2023-11-30 20:33:43 932

原创 利用Spring Boot实现客户端IP地理位置获取

在当今互联的世界中,了解客户端的地理位置对于提供个性化服务和增强用户体验至关重要。无论是根据地区偏好定制内容,还是确保符合本地法规,访问客户端IP位置都是一项宝贵的资产。如抖音评论区、用户页都会展示用户的IP属地信息。在本文中,我们将探讨一个Spring Boot项目,它能够高效地获取客户端IP地址的地理位置,并讨论其应用场景和实现方式。

2023-11-29 12:01:55 1208

原创 Spring Framework IoC依赖注入-按Bean类型注入

依赖注入是一种先进的设计思想,它通过外部注入依赖对象来实现组件之间的松耦合。在 Spring 框架中,依赖注入的核心实现便是通过控制反转(Inversion of Control,IoC)容器。IoC 容器负责实例化、配置和组装应用中的对象,并在需要时将它们智能地注入到其他对象中。相较于传统的面向对象思想,当业务代码变得复杂时,通过直接使用new进行对象构造对象间的关系,容易导致代码耦合度的上升。Spring 通过控制反转巧妙地解决了这一问题,运用了好莱坞原则的理念:不要给我们打电话,我们会给你打电话。

2023-11-21 21:44:58 288

原创 Spring Framework IOC依赖查找 - 按类型查找解析

AppConfig配置类定义了两个名为"bean1"和"bean2"的MyBean类型的Bean,这两个类分别有不同的实现逻辑,在不同的逻辑中去调用。

2023-11-20 17:26:50 89

原创 Spring Framework IOC依赖查找 - 按名称查找解析

具体来说,在使用ApplicationContext作为容器时,如果不显式地配置为延迟初始化,那么所有的单例bean都会在容器启动时被实例化。是指在需要使用某个资源或对象时才进行加载,而不是在应用程序启动时就提前加载。在Spring Framework中,实时加载和延迟加载是指在容器启动时是否立即实例化bean的不同策略。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。在实际应用中,根据具体的需求和场景来选择合适的加载方式是非常重要的。

2023-11-19 15:22:14 87

原创 Spring Framework中的依赖注入:构造器注入 vs. Setter注入

构造器注入和Setter注入是依赖注入(Dependency Injection,DI)中两种常见的方式,用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。总结以上论点就是:通过构造器注入对象,实现了对象初始化后的不可变性,同时确保所需依赖不为空。这有助于保持对象状态的稳定性。通过构造器注入,可以清晰地看到类的依赖关系,大量构造器参数说明当前类耦合过多、职责过多,从而促使编码者考虑是否需要重构,以提高代码质量和可维护性。

2023-11-14 21:31:49 189

原创 优雅的Java编程:将接口对象作为方法参数

在Java编程中,方法的参数传递方式通常是通过基本类型、对象引用或者集合等方式。然而,一种更加优雅且灵活的设计模式是将接口对象作为方法的参数。这种方式为我们带来了许多好处,包括降低耦合性、实现多态性和可替换性、实现依赖倒置原则等。本文将深入探讨这种设计模式的优势以及在实际开发中的使用场景。将接口对象作为方法参数是一种强大的设计模式,它提高了代码的可维护性、可扩展性和可读性。通过实现多态性、降低耦合性、遵循依赖倒置原则等,我们能够写出更加优雅、灵活的Java代码。

2023-11-13 10:16:58 1183

原创 深度解析CompletableFuture:Java 异步世界的奇迹

是 Java 8 引入用于支持异步编程和非阻塞操作的类。对于没有使用过通过它这么长的名字就感觉到一头雾水,那么现在我们来一起解读一下它的名字。Completable:可完成Future:未来/将来这两个单词体现了它设计的目的:提供一种可完成的异步计算。result:存储异步计算的结果stack:存储观察者链NEXT:异步调用链中观察者链的管理这三个变量用于Completion类中tryFire方法的标志,表示不同的触发模式。SYNC。

2023-11-12 16:25:41 200

空空如也

空空如也

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

TA关注的人

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