自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2023-05-08 15:32:55 453 2

原创 浅谈下JVM堆的内存结构和GC回收流程

我们在Java面试中,只要是2年以上经验,一定会问你一下关于JVM方面的问题。开发两年时间不能对JVM没有了解,如果你还不了解,说明你的学习与探索能力不高,不能给到应有的加分项哦!小编也是最近刚刚开始学习,总结一下最近的学习成果。方便以后看,也希望小伙伴们看到可以帮助到您!这样一个大的面试题就描述完成了,主要是理解GC回收的流程懂了,堆的结构也就知道怎么回事了。

2023-05-08 15:29:13 422

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

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

2023-05-08 14:20:17 586

原创 关于RocketMQ源码的总结

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

2023-05-08 14:16:48 293

原创 Springboot-Starter造轮子:自动锁组件

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

2023-05-08 14:15:39 190

原创 如何使用 SpringBoot 日志?

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

2023-05-08 14:11:00 794

原创 SpringBoot如何集成Redis?

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

2023-05-08 14:09:30 184

原创 Spring Data JPA如何轻松实现数据的持久化?

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

2023-05-08 14:08:19 130

原创 简单带你入门Spring框架

Spring是一个流行的Java应用程序框架,它简化了Java开发,提供了广泛的功能和组件,使开发人员能够更快速、更高效地创建企业级应用程序。在入门Spring之前,我们需要具备Java基础知识和javaWeb知识。由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建复制代码。

2023-05-08 14:06:39 299

原创 通过代码调试来讲Spring循环依赖?

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

2023-05-08 14:05:35 101

原创 Spring中 @Configuration 和 @Component 的区别及原理详解

Indexed​/***/​复制代码@Component​​​复制代码从定义来看, @Configuration 注解本质上还是 @Component,因此 @ComponentScan 能扫描到@Configuration 注解的类。@Component在Spring中是代表LITE模式的配置注解,这种模式下的注解不会被Spring所代理,就是一个标准类,如果在这个类中有@Bean标注的方法,那么方法间的相互调用,其实就是普通Java类的方法的调用。

2023-05-06 14:33:46 1408

原创 Spring中最常用的11个扩展点,你都知道那些?

我们一说到spring,可能第一个想到的是IOC(控制反转) 和AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。今天跟大家一起聊聊,在Spring中最常用的11个扩展点。

2023-05-06 14:26:16 215

原创 一文带你彻底了解Spring的定时任务调度

本文我们聊一下Spring定时任务调度。这个主题,相信大家都比较熟悉,平时用的应该也比较多。不过说起实现原理,了解的小伙伴应该就不太多了,网上对应的文章虽然很多,不过基本都是使用教程。即使有少部分提及原理,说的也是含糊不清,更有甚者是胡说八道。其实Spring的定时任务调度,并不神秘,也不是Spring特有的,本质还是借助JDK的能力实现的,只是,也就是更简洁、更便捷一点。关于JDK的定时任务,主要是借助实现的,感兴趣的小伙伴可以可以自行了解其实现原理。

2023-05-06 14:17:08 869

原创 Spring Boot 的启动扩展点,你都知道么?

一般情况下,Spring通过反射机制利用bean的class属性指定支线类去实例化bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在bean中提供大量的配置信息。此篇总结,如果有错误或者疏漏的地方,恳请指正。使用场景:用户可以扩展这个类,来为要实例化的bean作一个代理,比如为该对象的所有的方法作一个拦截,在调用前后输出一行log,模仿。可以看到,该类用于执行各种驱动接口,在bean实例化之后,属性填充之后,通过执行以上红框标出的扩展接口,来获取对应容器的变量。

2023-05-06 14:14:15 104

原创 浅谈下Spring的核心思想

最后我用一段话来简单描述下 Spring 的原理:Spring 根据我们提供的配置类和XML配置文件,解析其中的内容,得到它需要管理的 Bean 的信息以及之间的关联,并且 Spring 暴露出很多扩展点供我们定制,如,我们只需要实现这个接口就可以进行一些定制化的操作。Spring 得到 Bean 的信息后会根据反射来创建 Bean 实例,组装 Bean 之间的依赖关系,其中就会穿插进原生的或我们定义的相关来改造Bean,替换一些属性或代理原先的 Bean 逻辑。

2023-05-06 14:02:39 134

原创 你知道 Java 类能够在运行时动态生成吗?

我们可以从常见的 Java 类来源分析,通常的开发过程是,开发者编写 Java 代码,调用 javac 编译成 class 文件,然后通过类加载机制载入 JVM,就成为应用运行时可以使用的 Java 类了。从上面过程得到启发,其中一个直接的方式是从源码入手,可以利用 Java 程序生成一段源码,然后保存到文件等,下面就只需要解决编译问题了。有一种笨办法,直接用 ProcessBuilder 之类启动 javac 进程,并指定上面生成的文件作为输入,进行编译。最后,再利用类加载器,在运行时加载即可。

2023-05-06 13:59:06 194

原创 强引用、软引用、弱引用、幻象引用有什么区别?

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。强引用(“Strong” Reference),就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。软引用。

2023-05-06 13:56:24 188

原创 Java 中 valueOf 和 parseInt 的区别

在编程中,遇到类型转换,好像会经常用到parseInt和valueOf,当然这里只拿Integer类型进行陈述,其他类型也是雷同的;想必有读者也跟我一样,经常交叉使用这两个方法,但却不知道这两者到底有什么区别,接下来就来探究一番;

2023-05-06 13:54:55 91

原创 synchronized 和 ReentrantLock 有什么区别呢?

软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一。本篇博文的重点是,有人说 synchronized 最慢,这话靠谱吗?

2023-05-06 13:54:31 118

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

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

2023-05-06 13:53:38 116

原创 Redis 主从、哨兵和分片集群

单节点 redis 并发能力有上限,要进一步提高 redis 并发能力,就要搭建,实现。

2023-05-05 13:38:15 111

原创 Java基础:泛型

自定义泛型结构 ①泛型类 ②泛型接口 ③泛型方法泛型类可以有多个参数,如Map泛型要么一开始就不使用,要么使用就要一直用JDK1.7后泛型可简化为是不允许的异常类不能是泛型的不能使用new E[],但可以使用父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型 (保留泛型可以是全部保留也可以是部分保留, 指定泛型类型可以是直接擦除(没有类型)也可以是指定具体类型)第4条静态方法中不能使用类的泛型 因为T是非静态的/*** @author 兴趣使然的L*/

2023-05-05 13:35:30 132

原创 Java基础:反射机制

Constructor类存在于反射包(java.lang.reflect)中,指的是Class 对象所表示的类的。下,对任意的类都可以获取到该类的所有属性和方法,对任意的对象都可以调用该对象的任意一个方法和属性。Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息,所反映的方法可能是。就是Java的反射机制,它带来的是在运行时动态地分析类及执行类中方法的能力)② 通过Class对象获取到指定参数的构造器和指定的参数和名字的方法。② 类的构造器的访问权限足够。

2023-05-05 13:34:25 274

原创 Java设计模式:单例模式

看了这么多的单例模式实现方式,应该也注意到代码中注释的内容中一直在强调的私有化构造器写一个获取单例的静态方法如果开发中并不要求懒加载,可以使用饿汉式实现单例模式双重锁检查、静态内部类、枚举。

2023-05-05 13:33:31 91

原创 SpringSecurity:@PreAuthorize如何实现自定义权限校验方法

在我们一般的web系统中必不可少的就是权限的配置,也有经典的RBAC权限模型,是基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。当然已经实现了权限的校验,但是不够灵活,我们可以自己写一下校验条件,从而更加的灵活!很多开源框架中也是用的比较多,小编看了一下若依是自己写了一个注解实现的,pig是使用来实现自己的校验方式,小编以pig框架的为例。这样就完成了自定义校验,具体的校验可以自己在配置里进行修改,当然也可以自己写一个注解来进行自定义校验,可以参考若依的注解!

2023-05-05 13:28:49 1459

原创 万字详解HashMap底层原理及jdk1.8源码解读

HashMap在我们日常开发中可谓经常遇到,HashMap 源码和底层原理在现在面试中是必问的。所以我们要掌握一下,也是作为两年开发经验必备的知识点!HashMap基于Map接口实现,元素以的方式存储,并且允许使用null 键和null值,因为key不允许重复,因此只能有一个键为null,另外HashMap是无序的、线程不安全的。HashMap继承类图快捷键Ctrl+alt+U。

2023-05-05 13:26:27 171

原创 springboot如何整合xxl-job分布式定时任务

定时任务有很多种,有一些大的框架也有一些简单的实现。JDK的Timer和TimerTaskQuartz异步任务调度框架分布式定时任务XXL-JOBSpring Task注解@Scheduled小编也就知道这些,欢迎大佬补充哈!!今天小编就以现在比较火的分布式定时任务xxl-job,优点比较轻量级,但是从21年到现在没有比较大的更新!现在最新的好像是2.4.0。XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

2023-05-05 13:24:44 99

原创 Springboot基于Redisson实现Redis分布式可重入锁

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

2023-05-05 13:23:50 172

原创 SpringBoot+Mybatis-Plus整合Sharding-JDBC实现分库分表

小编最近一直在研究关于分库分表的东西,前几天docker安装了mycat实现了分库分表,但是都在说mycat的bug很多。很多人还是倾向于,其实他是一个全家桶,有JDBC、Proxy 和 Sidecar组成,小编今天以最简单的JDBC来简单整合一下!现在最新版已经是5.1.1,经过一天的研究用于解决了所有问题,完成了单库分表!!这样就完成了最新版的的简单测试和一些坑的解决,总的来说配置很费劲,不能有一定的错误!

2023-05-05 13:21:33 2098

原创 SpringBoot:如何根据各地区时间来设置接口有效时间

之前接到需求,需要给APP内的H5活动的接口加上时效性,防止活动后还有用户调用接口;因为有些H5活动是长期的,有些是短期的,所以我需要做好区分,因为我们的app是国外用户在用的,所以还要考虑的时区的问题;想了一下决定用注解`拦截器的方式去实现默认已经创建好了SpringBoot项目。

2023-05-05 10:59:12 705

原创 Java中实例初始化和静态初始化的过程

Java代码初始化块是Java语言中的一个非常重要的概念。初始化块负责在创建对象时进行一些必要的操作,例如设置对象的初始状态、初始化成员变量等。初始化块被分为实例初始化块和静态初始化块两种类型。实例初始化块是在创建对象时执行的,每次创建新对象时都会执行。实例初始化块用于执行一些在对象创建时需要进行的操作,例如初始化实例变量。静态初始化块是在类加载时执行的,仅仅执行一次,并且是在类构造器调用之前执行的。静态初始化块用于进行一些在类加载时需要进行的操作,例如初始化静态变量。

2023-05-04 16:49:06 752

原创 Java包装类型:自动装箱/拆箱导致NPE

包装器类型和基本数据类型都可以的业务场景下,优先考虑使用基本类型对于不确定的包装器类型,一定要对NULL情况做检验和判断。

2023-05-04 16:48:10 468

原创 Java中的优先级队列 PriorityQueue 与 堆

堆是一种完全二叉树,其中每个节点的值都不小于(或不大于)其子节点的值。最大堆(大根堆):对于每个节点,其值都大于或等于其子节点的值。最小堆(小根堆):对于每个节点,其值都小于或等于其子节点的值。

2023-05-04 16:47:31 471

原创 一文详解RocketMQ的事务消息原理

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

2023-05-04 16:39:25 1771

原创 JVM:检测死锁与内存溢出

我们在进行JVM调优的时候经常会遇到OOM跟死锁等待,所以如果发现了这两类情况,那就必须把他们检测出来,检测哪一部分出现了问题,使用一些工具将问题给定位出来并且解决,合理的进行调优。当然JVM调优不是一蹴而就的,JVM调到最优需要进行多次调优,而且也不存在最优解,因为你可能会发现,这一次调优已经很好了,但是修改一下参数可能又比上一次更优。

2023-05-04 16:38:39 294

原创 SpringBoot 的配置文件该如何使用?

配置项目的端口号#用户自定义配置项hi=hellotest.hi=test_hello //可以加 .复制代码。

2023-05-04 13:43:38 146

原创 关于SpringBoot 项目跨域问题的几种解决方法

在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议域名端口任一不一样时都会导致跨域,这篇文章主要介绍跨域的几种常用解决方案。

2023-05-04 13:42:15 2055

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

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

2023-05-04 13:33:50 406

原创 如何把springboot项目部署到k8s

可以看到serviced的ip为10.96.10.79 对外端口为 31921,安全组需开放该端口才能访问。登录私有仓库需要创建secret,存储docker registry的认证信息。快速创建一个deployment,导出yaml文件。到这里我们服务部署就算完成了,看一下所有的节点。创建好之后,后续需要挂载到pod上。修改k8sdemo.yaml文件。

2023-05-04 13:20:03 134

原创 浅谈spring bean的生命周期

生命周期,简单理解就是事物从开始出现到最终消亡的一段时间。spring bean的生命周期就是从spring创建bean,到最终spring将bean销毁的一个过程(或一段时间),而我们上篇谈到的spring bean的初始化方法和销毁方法,都会在bean的生命周期内得到调用。简单来说,spring容器中的bean会经历如下过程:创建bean实例-->创建完成,正常使用-->spring销毁bean接下来我们就基于版本的代码对上述过程详细分析下。

2023-05-04 13:08:16 41

空空如也

空空如也

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

TA关注的人

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