自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(573)
  • 收藏
  • 关注

原创 Spring 框架之 AOP 原理深度剖析

Spring AOP是基于代理和动态代理技术实现的切面编程框架,通过将业务逻辑分解为多个部分来提高代码的复用性和可维护性。在实现过程中,Spring AOP主要通过Advisor、Pointcut、Advice、JoinPoint和ProxyFactory等核心接口来管理和织入切面代码。在使用Spring AOP时,我们需要定义切面类、连接点和切入点,并通过Spring配置文件中的aop:config和aop:aspect标签来指定各种通知类型。

2023-05-10 14:55:26 459 2

原创 万字详细解析Dubbo

Dubbo使用Netty作为底层通信框架,能够带来更快的响应速度和更好的可靠性,同时还支持多种序列化方式,例如Hessian、Java原生序列化等,使得Dubbo在跨语言、跨平台的服务调用中也具有很好的扩展性和兼容性。同时,在设计和开发阶段,也需要考虑多实现的问题,从接口定义和实现的角度进行合理划分和设计,以便更好地适应后续的需求变化。以上就是在代码中绕过注册中心进行点对点直连的步骤,需要注意的是,这种方式适用于测试和开发阶段,不建议在生产环境中使用,因为无法实现服务的动态发现和负载均衡等功能。

2023-05-10 13:11:54 850

原创 SpringBoot 如何结合 Liquibase 实现数据库的变更管理?

Liquibase 是一个开源的数据库变更管理工具,支持多种数据库(如 MySQL、Oracle、SQL Server 等),可以通过 XML、YAML 或 SQL 格式定义数据库变更脚本。Liquibase 可以自动执行这些脚本,并记录每次变更的信息,以便后续进行回滚或比较数据库状态等操作。本文详细介绍了 Spring Boot 和 Liquibase 的集成方式,并给出了相应的示例代码以便读者参考。当然,这只是基础用法的演示,实际项目中可能会遇到更复杂的需求,例如多数据源、多租户等。

2023-05-10 13:10:35 436

原创 一文深度解析DDD 领域驱动

此外,针对service包还有另一种主流的module划分方式——直接把service包的api、application、domain、infrastructure作为四个独立的module,优点是能通过pom依赖的方式来限制层与层之间的依赖,开发人员能在编码阶段发现依赖问题及时修正,但缺点也明显——不够灵活,工程也会变得较重。写代码前需要考虑清楚不同的代码应该写到哪里,结合前人优秀的工程架构思路与公司当前的技术架构,整合一套灵活的、适合我们自己的DDD,不能照搬,更不能为了DDD而DDD。

2023-05-10 10:33:32 621

原创 SpringBoot 整合 Mybatis Plus 实现基本CRUD功能

对数据库的操作是我们公司中必不可少的功能,Mybatis Plus是在Mybatis的基础上的增强,使得我们对一些基本的CRUD使用起来更方便等,这篇文章主要讲讲SpringBoot如何去整合Mybatis Plus,并实现基本的CRUD功能。

2023-05-10 09:19:08 206

原创 SpringBoot 项目中 Bean 拷贝及工具类封装

在我们SpringBoot 项目的开发中,经常需要做对象的拷贝和转化,例如我们需要把前端传给我们的DTO对象转化为POJO对象存到数据库,返回前端数据时需要把POJO对象转换为VO,这篇文章就讲讲SpringBoot中对象的拷贝及其工具类的封装。

2023-05-10 09:17:56 229

原创 通俗易懂的AQS核心源码解析

AQS的全称就是,翻译过来就是抽象队列同步器,这是JUC包中的一个类。这个类很关键,很多并发工具类都是基于这个类实现的,他也是JUC同步框架的基石。实现类需要去继承该类,并重写指定方法就可以实现一套线程同步机制。我们经常用到的ReentrantLock和CountDownLatch等也都是基于AQS实现的。我们刚刚提到,这个state字段是用volatile修饰的。

2023-05-08 13:31:41 222

原创 ThreadPoolExecutor底层原理源码的理解

/快//慢//很慢i < 100;i++) {复制代码运行结果如图:当线程执行到任务30时将会报出异常,为什么下面还会继续执行任务11-20呢?其实这与提交优先级、执行优先级有关。

2023-05-08 13:29:46 88

原创 面试问Spring循环依赖?今天通过代码调试让你记住

下次面试再被问到循环依赖的问题,我会怎么来给面试官说明白呢?1、Spring通过3个缓存map来解决循环依赖的问题,分别是singletonObjects,singletonFactories,earlySingletonObjects2、singletonObjects这个缓存是存储完整的对象,可以直接使用的。3、singletonFactories这个缓存是为了延迟初始化,是解决循环依赖的关键,存在循环依赖注入时,可能注入的对象需要被代理,这个工厂类来实例化一个代理类。

2023-05-08 10:02:11 102

原创 kafka高性能设计之内存池

Kafka的内存池是一个用于管理内存分配的缓存区域。它通过在内存上保留一块固定大小的内存池,用于分配消息缓存、批处理缓存等对象,以减少频繁调用内存分配函数的开销。Kafka内存池的实现利用了Java NIO中的 ByteBuffer。当需要创建一个新的缓存对象时,内存池会取出一块固定大小的内存块,并在存储内存池对象的池中保存该内存块的引用。当该内存块不再被使用时,内存池将把它收回,以供下一次使用。

2023-05-08 09:19:56 318

原创 如何理解Spring中的Bean

​ Bean作为Spring框架面试中不可或缺的概念,其本质上是指代任何被Spring加载生成出来的对象。(本质上区别于Java Bean,Java Bean是对于Java类的一种规范定义。)Spring Bean代表着Spring中最小的执行单位,其加载、作用域、生命周期的管理都由Spring操作。可见Spring Bean在整个Spring框架中的重要地位。​ 本文从Bean的定义、设计目的入手,介绍了SpringBoot中Bean机制的重要地位。

2023-05-08 09:18:04 186

原创 SpringBoot集成Redis

该类使用了@Configuration注释来标识这是一个配置类,并使用@Bean注释来标识该方法是创建一个Bean的工厂方法。该方法名为redisTemplate,并使用了@ConditionalOnMissingBean注释,表示如果在上下文中没有StringRedisTemplate类型的Bean,则会自动创建一个该类型的Bean。这段代码是一个基于Spring框架和Redis实现的工具类,封装了一些常见的操作方法。需要注意的是,get方法返回的是一个经过JSON序列化的字符串,而不是原始的对象。

2023-05-08 09:16:53 217

原创 Springboot-Starter造轮子之自动锁组件(lock-starter)

可能有人会有疑问,为什么外面已经有更好的组件,为什么还要重复的造轮子,只能说,别人的永远是别人的,自己不去造一下,就只能知其然,而不知其所以然。(其实就为了卷)在日常业务开发的过程中,我们经常会遇到存在高并发的场景,这个时候都会选择使用redis来实现一个锁,来防止并发。但是很多时候,我们可能业务完成后,就需要把锁释放掉,给下一个线程用,但是如果我们忘记了释放锁,可能就会存在死锁的问题。

2023-05-08 09:15:37 317

原创 RocketMQ源码的总结

在RocketMQ中,Consumer端的两种消费模式(Push/Pull)都是基于拉模式来获取消息的,而在Push模式只是对pull模式的一种封装,其本质实现为消息拉取线程在从服务器拉取到一批消息后,然后提交到消息消费线程池后,又“马不停蹄”的继续向服务器再次尝试拉取消息。的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。消息有序指的是一类消息消费时,能按照发送的顺序来消费。

2023-05-08 09:13:11 242

原创 Spring Data JPA:轻松实现数据持久化

Spring Data JPA是Spring Framework的一个子项目,它提供了一种易于使用的方式来访问各种关系型数据库的数据。它通过将JPA(Java Persistence API)和Spring Framework的强大功能相结合,简化了数据库访问的复杂性,并提供了许多特性和工具,如基于注解的Repository模型、自动化查询、分页和排序支持、复杂查询DSL等。

2023-05-08 09:12:43 1103

原创 教你如何使用 SpringBoot 日志

创建一个SpringBoot项目后,我们点击运行,在控制台会弹出如下内容:这些其实就是系统自带的日志。那么我们如何自定义日志呢?我们可以设置日志的级别,在SpringBoot的配置文件# 自定义日志级别复制代码现在:上面这是对根路径设置级别,还可以分别对不同的目录进行同时设置。# 自定义日志级别# 对根目录设置# 对controller 目录设置一个级别# 它们不会冲突,除了 com.example.demo.controller 下为 trace,其它地方都为error。复制代码。

2023-05-08 09:11:14 3495

原创 Java中的接口和抽象类有什么区别?

接口和抽象类是 Java 面向对象设计的两个基础机制。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。

2023-05-06 13:28:23 263

原创 一文详解 Spring Boot 创建 Bean 的过程

在讨论 Spring 时使用的 Bean 指的是托管在 Spring 容器(或称 IoC 容器)中的 Java 类对象。Bean 的作用范围分为 Singleton、Prototype 两种(spring-web 又增加了 request\session 等)。默认情况下,Bean 的作用范围是 Singleton。在 IoC 容器启动时,默认会创建、初始化 Singleton Bean,这个过程被称之为 “eager registration of singletons”。

2023-05-06 13:25:23 2019

原创 Spring Data JPA

底层数据库操作笼统讲就是增删改查,例如JDBC模板,Hibernate,Mybaties,JPA。接下来尝试springBootJPA旅程内容扩展unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样。nullable=false是这个字段在保存时必需有值,不能还是null值就调用save去保存入库。这两个用法是不同的,需要看个人需要,互相不可取代,根据个人需要可以两个都设置也可以只设置其中一个。

2023-05-06 13:24:17 106

原创 两段式轻松梳理SpringCloudGateway源码核心脉络

书接前节,当发起Rest或WebSocket等调用时,请求至Netty服务器,handler即被回调来处理该请求,它是定义为ReactorHttpHandlerAdapter,本身实现了BiFunction,在其内部持有一个HttpHandler实例,在handler的apply方法中就重点调用HttpHandler实例的handle方法,进一步,在HttpHandler一个重要的实现类HttpWebHandlerAdapter中,内部又持有一个WebHandler实例对象。

2023-05-06 13:17:49 148

原创 过滤器、拦截器、ControllerAdvice和AOP

内部对所有的BeanPostPorcessor对象进行遍历,调用postProcessAfterInitialization进行处理,而Aop就是基于该扩展点实现的:

2023-05-06 13:16:01 174

原创 SpringBoot 中操作 Redis 及工具类的封装

在我们项目开发中总是免不了会使用缓存,Redis现在基本是我们公司中非常常见的缓存方案,包括在用户token的缓存,热点信息的缓存等,这篇文章主要讲讲在SpringBoot项目中如何去操作Redis,及最后工具类的封装。

2023-05-06 10:22:10 233

原创 Java8 Stream流的合并

最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。id1id2id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。现在要取3个字段,怎么做呢?

2023-05-06 09:13:15 732

原创 springboot集成skywalking8.5

负责接收skywalking-agent发送过来的Tracing数据信息,Analysis Core对这些数据信息进行分析,把分析的数据存储到外部的存储器当中,Query Core提供查询数据的功能。skywalking是一款国产的开源框架,它具有分布式链路追踪、性能指标分析、应用和服务依赖的分析等功能。负责从应用程序中收集链路信息,然后将链路信息发送到skywalkingOAP处理器。负责存储skywalking分析后的数据。vm options增加参数。负责展示链路信息等数据。调用接口,查看打印日志。

2023-05-06 09:09:07 373

原创 Spring中的Aware接口及应用场景

Aware接口是Spring Framework中提供的一组标记接口,用于在Bean装配的过程中获取Spring容器中提供的一些核心组件或运行时上下文等信息。通过使用Aware接口,我们可以在Bean实例化和初始化过程中获取到Spring容器中其他组件,方便Bean类实现更复杂的业务逻辑。本文将会一一介绍Spring中各个Aware接口,以及这些接口的主要应用场景。

2023-05-06 09:07:04 489

原创 SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现分库分表

小编最近一直在研究关于分库分表的东西,前几天docker安装了mycat实现了分库分表,但是都在说mycat的bug很多。很多人还是倾向于,其实他是一个全家桶,有JDBC、Proxy 和 Sidecar组成,小编今天以最简单的JDBC来简单整合一下!现在最新版已经是5.1.1,经过一天的研究用于解决了所有问题,完成了单库分表!!SpringBoot+Mybatis-Plus整合Sharding-JDBC4.0.0实现单库分表Docker安装Mycat和Mysql进行水平分库分表实战这样就完成了最新版的。

2023-05-05 13:20:23 770

原创 Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】

我们在实现使用Redis实现分布式锁,最开始一般使用进行加锁,使用Lua脚本保证原子性进行实现释放锁。这样手动实现比较麻烦,对此Redis官网也明确说Java版使用Redisson来实现。小编也是看了官网慢慢的摸索清楚,特写此记录一下。从官网到整合Springboot到源码解读,以单节点为例小编的理解都在注释里,希望可以帮助到大家!!这样大家就跟着小编走完了一遍底层源码,是不是感觉自己又行了,哈哈哈。小编走下来一遍觉得收货还是蛮大的,以前不敢点进去源码,进去就懵逼了,所以人要大胆的向前迈出第一步。

2023-05-05 13:18:57 217

原创 Spring、SpringBoot:声明式事务和编程式事务源码

在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家可以看看!后面小编在出一篇事务失效场景哈,喜欢的可以关注,等待更新哈!这篇博客将重点探讨这两种事务处理方式的源码实现、区别、优缺点、适用场景以及实战。我们来接着说事务,里面还涉及到三个知识点,大家可以自行百度好好了解!事务的特性。

2023-05-05 13:17:21 226

原创 SpringBoot-多数据源读写分离的自定义配置

注意:这是一个数据源的案例,当是需要配置多个数据源的时候,流程是一样的1.在配置文件中配置数据库连接数据2.创建配置类3.创建mapper接口和mapper.xml文件。

2023-05-05 10:53:33 186

原创 SpringBoot:集成Quartz实现持久化定时接口调用任务

Quartz 是功能强大的开源作业调度库,几乎可以集成到任何 Java 应用程序中,从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的计划,以执行数以万计的工作;可以执行您编写的所有内容。

2023-05-05 10:52:05 618

原创 RabbitMQ、RocketMQ和Kafka之间有什么性能差距?

MQ的作用解耦、异步、削峰填谷。mysql并发写大部分情况下维持在600-800之间,并发读1200-1500之间,所以消费端在消费消息的时候需控制在并发小于1000,从而达到限流的效果。mq做个缓冲,消息放到磁盘,几个G或上t都可以存储,消息丢失的可能性比较小。

2023-05-05 10:46:56 333

原创 java中的多态和对实例化对象以及向上、向下转型

而这行代码成立的最重要的原因是:Dog是Animal的一个子类,并且Dog类总是小于等于Animal类。因此在调用由Dog类重写Animal类的方法如此代码中的Shout方法时,此语句成立。因为Dog、Cat这些是Animal的子类,所以类型 Animal >= Dog、Cat......这些子类。先解释下父类引用指向子类对象:在TestPolym类中的AnimalShout方法中,接收着Animal类的对象。反之,使用此语句去运行不是由Animal类中的方法重写而来的方法时,此语句会报错。

2023-05-05 10:43:38 151

原创 Spring源码:Bean生命周期(三)

在之前的文章中,我们已经对bean的准备工作进行了讲解,包括bean定义和判断等。在这个基础上,我们可以更加深入地理解getBean方法的实现逻辑,并在后续的学习中更好地掌握createBean方法的实现细节。首先,从单例缓存池中获取 bean 实例。如果没有,Spring 会创建新的 bean 实例,并将其添加到单例缓存池中。接着,Spring 会检查当前容器是否有指定名称的 bean 定义。如果没有,Spring 会调用父容器的 getBean 方法,直到找到为止。

2023-05-05 10:40:23 58

原创 SpringBoot 项目中统一返回前端格式老手是这样封装的

的好处是,它可以更加精细地控制响应结果的格式,可以对所有的返回值进行统一的封装,也可以针对某些返回值进行特殊处理,灵活性更高。消息转换器已经默认添加到了消息转换器列表中,它会将请求和响应中的字符串类型数据转换成Java中的。字段可以是一个对象,也可以是一个集合。另外,为了方便前端的解析,响应格式通常采用JSON格式。是一个接口,可以在Controller方法执行完成后,对返回的结果进行修改和增强。会处理该请求,并将请求中的数据转换成Java中的。类型,当接口返回类型是字符串类型,则。接口,并重写了其中的。

2023-05-05 10:37:35 678

原创 Spring JPA Ⅹ 联表查询 : ManyToMany

注解实现多对多关系映射。我们还是以上面用户和房子为例(博主是多想要一套房子啊),毕竟一个用户可以拥有多套房子,而一套房子也可以写多个人的名字。复制代码注解详情请见注解属性详解。其中需要注意的是没有的属性。多对多的情况下不能级联删除也能理解,毕竟不是一个人能说了算的。

2023-05-05 10:37:02 260

原创 SpringSecurity + JWT + Redis 自定义登录流程

自定义登录流程是整合 SpringSecurity 开发必不可少的一步。上篇文章我们介绍了整合数据库的登录,本篇文章在此基础上整理了 SpringSecurity + JWT + Redis 的登录流程。参数的接收@Data复制代码controller部分复制代码controller 只是负责匹配路由和返回数据,业务通过 service 的相关方法完成,因此 controller 中没有太多代码service部分@Resource@Resource@Override。

2023-05-04 11:39:20 181

原创 带你一起揭开stream流的神秘面纱

如果你会任意一门语言的stream流,没道理不会大数据开发。俗话说男追女隔座山,女追男隔层纱。如果说零基础学大数据,感觉前面是一座山,那么只要你会java或者任意一门语言的stream流,那大数据就只隔了一层纱。本文以java stream流计算为例,讲解一些基础的spark操作。另一个流行的大数据框架flink同理。

2023-05-04 11:23:55 95

原创 微服务下如何保证事务的一致性?

数据库中的数据是共享资源,因此数据库系统通常要支持多个用户的或不同应用程序的访问,并且各个访问进程都是独立执行的,这样就有可能出现并发存取数据的现象,这里有点类似Java开发中的多线程安全问题(解决共享变量安全存取问题),如果不采取一定措施会出现数据异常的情况。列举一个简单的经典案例:比如用户用银行卡的钱还京东白条,银行卡扣款成功了,但是白条因为网络或者系统问题没有还款成功,就会出大问题,这时候我们就需要使用事务。

2023-05-04 11:21:47 372

原创 带你解析Redis的数据类型及底层原理

连锁更新的问题大家可以去了解一下ziplist中entry它的结构,这个结构里面有个prevlen属性导致了连锁更新的问题,它用来表示上一个节点的数据长度,通过它可以定位到上一个数据,也因此压缩列表才可以从后向前遍历,如果前一个节点的长度小于254字节(255是特殊字符,被zlend占用,表示ziplist的结束),这个属性占用一个字节,否则使用5个字节去保存长度值。在Redis内部,字符串的追加以及返回长度是很常见的,而追求高性能的Redis肯定是不容许这些事情发生的,所以进行了结构的封装。

2023-05-04 11:18:51 134

原创 RocketMQ源码:事务消息原理

事务消息不支持延时消息和批量消息。为了避免单个消息被检查太多次而导致半队列消息累积,MQ默认将单个消息的检查次数限制为 15 次,用户可以通过参数来修改此限制。如果已经回查某条消息超过次的话,则Broker将丢弃此消息,并打印错误日志。事务消息将在参数指定的时间长度之后被回查。当发送事务消息时,用户还可以通过设置用户属性来改变这个限制,该参数优先于参数。事务消息的生产者 ID 不能与其他类型消息的生产者 ID 共享。

2023-05-04 11:06:52 129

空空如也

空空如也

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

TA关注的人

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