自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringSecurity 认证流程源码详细解读

如果这些校验都通过,就会将 result 返回。没错,他就是在套娃!点进入去之后,我们来到了 AuthenticationManager 接口,但这只是一个接口,显然不是我们要的,具体的实现代码应该在实现类中,所以我们继续选择 ProviderManager ,他是 AuthenticationManager 接口的一个实现类。点进去,发现这是 AbstractUserDetailsAuthenticationProvider 接口中的方法,而且只有一个实现,那我们继续进入实现类实现的方法。

2023-05-09 08:05:47 1359

原创 SpringBoot自动配置原理详解

那如果面试官问,说说你对 SpringBoot 自动配置的理解,我们该怎么回答?

2023-04-24 08:01:46 3065 4

原创 谈谈你对ThreadLocal的理解

以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2023-03-27 08:31:04 600

原创 Java锁机制详解

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。

2023-02-07 09:52:00 1044

原创 java: Can‘t generate mapping method with primitive return type. java: Can‘t generate mapping method

看到 generate mapping method 我的第一反应是和 mybatis 有关,然后我就去看了对应的xml文件,然后检查了半天,但是一顿操作猛如虎,一看伤害0.5。

2024-04-10 08:37:23 274 1

原创 SQL JOIN

在这个查询中,即使某个员工没有对应的部门(即 department_id 在 departments 表中不存在),该员工的名字仍然会出现在结果集中,而 department_name 列将包含 NULL 值。在这个查询中,即使某个部门没有员工(即该部门的 id 在 employees 表的 department_id 列中不存在),该部门的名字仍然会出现在结果集中,而 name 列将包含 NULL 值。当涉及到 SQL 中的 JOIN 操作时,理解其背后的实现原理以及每种连接方式的区别是非常关键的。

2024-03-28 16:22:25 681 1

原创 正向代理和反向代理

hosts文件是一个没有扩展名的系统文件,它允许用户手动指定某些域名与IP地址之间的映射关系。这个文件通常位于操作系统的特定目录下,如在Windows系统中位于。

2024-03-18 08:24:21 847

原创 Javac 和 Javap

总的来说,Javac负责将Java源代码编译成字节码,而Javap则用于分析和学习这些编译后的字节码内容。两者都是Java开发者工具箱中的重要工具,对于Java程序员来说,熟悉这些工具的使用是非常重要的。掌握这些基础知识对于Java开发者来说非常重要,因为它们是日常开发中不可或缺的工具。方法引用和构造器引用是Java 8中引入的一种新的语法特性,它们允许我们更简洁地表示Lambda表达式。是指通过使用已经存在的方法来代替Lambda表达式。是指通过使用类的构造函数来创建对象。,用于分析字节码文件。

2024-03-16 08:28:26 867

原创 Lambda 表达式

这些函数式接口提供了一种标准化的方式来表示函数,使得我们可以使用Lambda表达式来创建匿名函数,并将其作为参数传递给其他方法。Java中的匿名函数是指没有名字的函数,通常用于简化代码或者作为参数传递给其他方法。在Java中,匿名函数主要有两种形式:Lambda表达式和匿名内部类。函数式接口的主要作用是提供一种标准的方式来表示函数,使得我们可以使用Lambda表达式来创建匿名函数,并将其作为参数传递给其他方法。Lambda表达式是一种简洁的表示匿名函数的方法,它允许我们将函数作为参数传递给其他方法。

2024-03-15 16:22:38 907

原创 笔试刷题记录(二)

BC正确,选项B解释,java核心卷I中43页有如下表述:两个数值进行二元操作时,会有如下的转换操作: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。”是错误的,因为异常通知和返回通知是两种不同的通知类型,它们的触发条件是不同的。因此,这两种通知之间没有先后顺序的关系,它们的触发取决于目标方法的执行结果是正常返回还是抛出异常。C选项:f1 == f3,f3没有new创建,而是由f1赋值,所以f3地址是指向f1的,f1值改变,相当于改变f3值,所以相等。

2024-03-08 08:20:37 852

原创 笔试刷题记录(一)

(2)成员内部类拥有与外部类同名的成员变量时,会发生隐藏现象,即默认情况下访问的是成员内部类中的成员。在Java中,可以将一个类定义在另一个类里面或者一个方法里边,这样的类称为内部类,广泛意义上的内部类一般包括四种:成员内部类,局部内部类,匿名内部类,静态内部类。(1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;(4)成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;

2024-03-07 08:27:30 705

原创 HTTP 和 TCP 的区别

HTTP被设计成无状态的,这意味着每次通信后,连接就会关闭,不会保存之前的请求或响应的内容。传输控制协议(TCP)是一种面向连接的、可靠的传输层通信协议,它为数据通信提供了稳定的全双工流服务。例如,如果在三次握手过程中服务器发出的SYN-ACK丢失了,客户端将不会收到这个报文段,并且在超时后重新发送SYN进行连接尝试。同样,在四次挥手过程中,如果客户端发送的ACK丢失了,服务器将再次发送FIN以确认连接是否关闭。在TCP通信过程中,可能会出现各种异常情况,比如丢失的报文段、网络延迟、重复的报文段等。

2024-03-06 08:33:22 1502

原创 MYSQL 索引

在使用组合索引时,查询条件必须包含索引的最左侧列,否则索引将不会生效。在选择索引时,应该根据实际的数据特性和查询需求来决定最合适的索引类型。:在索引列上使用 IS NULL 或 IS NOT NULL 可能会导致索引失效,因为索引是不索引空值的。针对这些情况,开发者应尽量避免上述情况的发生,通过优化查询语句来确保索引的有效使用,从而提高数据库查询的性能。:如果查询中的值与索引列的数据类型不匹配,可能会发生隐式类型转换,导致索引失效。:在 OR 条件中,如果只有一个条件字段是索引,那么该索引失效。

2024-03-05 08:49:05 1014

原创 MySQL InnoDB 支持三种行锁定方式

DECIMAL 和 FLOAT 的区别是:DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。DECIMAL 用于存储具有精度要求的小数,例如与货币相关的数据,可以避免浮点数带来的精度损失。在 Java 中,MySQL 的 DECIMAL 类型对应的是 Java 类 java.math.BigDecimal。InnoDB 行锁是通过对索引数据页上的记录加锁实现的,MySQL InnoDB 支持三种行锁定方式:间

2024-03-04 09:27:41 882

原创 Java的基本数据类型和引用数据类型

总的来说,LinkedList的内存管理方式使其在处理频繁的插入和删除操作时具有优势,因为它不受内存碎片化的影响,可以更灵活地管理内存。例如,你可以组合多个简单的命令来完成复杂的任务,这种工作方式类似于流水线,每个环节处理特定的任务,然后将结果传递给下一个环节。总的来说,Spring Framework是基础,Spring MVC是构建在其上的Web框架,而Spring Boot则是为了简化Spring应用的开发和部署流程而产生的。总之,了解以上场景可以帮助开发者避免索引失效的问题,提高数据库查询的效率。

2024-03-03 08:51:14 963

原创 Redis 集群

Redis 主从复制、Redis Sentinel 和 Redis Cluster 是 Redis 提供的三种高可用性解决方案。下面将详细介绍这三种方案的原理、配置及实例。一、Redis 主从复制Redis 主从复制是一种数据备份和读写分离的方案。在这种方案中,一个 Redis 服务器作为主节点(Master),其他一个或多个 Redis 服务器作为从节点(Slave)。主节点负责数据的写入,从节点负责数据的读取。从节点会实时同步主节点的数据,以保证数据的一致性。其中,和。

2024-03-02 08:48:37 823

原创 谈谈 JWT

私有声明是自定义的声明,它可以被添加到JWT中以提供额外的信息,但并不是所有的JWT都包含私有声明。私有声明是特定应用程序或组织的需要,并且它们的用途和结构可能会根据每个特定的用例而有所不同。这个属性的值是一个字符串,指示所使用的加密算法,例如"HS256"表示HMAC SHA256。在使用JWT时,需要注意保护好私钥和敏感信息,以确保系统的安全性。它通常用于身份验证和授权。有效载荷是存放有效信息的地方,这些信息包含了三个部分:注册声明、公共声明和私有声明。这是在所有JWT中都存在的声明,它们不是可选的。

2024-03-01 09:26:22 883

原创 Spring Security的基本概念和用法

Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架。它是为Java应用程序提供全面的安全解决方案,包括身份验证、授权、防止跨站请求伪造(CSRF)等。Spring Security基于Spring框架,可以轻松地与Spring Boot、Spring MVC等其他Spring项目集成。

2024-02-29 09:04:35 1177

原创 Spring AOP 相关注解

在面向对象编程中,横切关注点通常是一些通用的、重复的逻辑,例如日志记录、事务管理、安全性检查等。通过定义切点,我们可以精确地指定在哪些方法上应用切面的逻辑,从而提高代码的可维护性和重用性。通过使用这些通知类注解,我们可以在不同的阶段插入自定义的行为,例如日志记录、权限检查、事务管理等。为了控制这些切面的执行顺序,可以使用。请注意,切点表达式可以根据具体需求进行灵活的组合和调整,以满足不同的切面逻辑。是Spring框架中的一个注解,用于定义切面的执行顺序。注解的值可以是负数,表示在默认的执行顺序之后执行。

2024-02-28 10:39:52 826

原创 Spring 的三级缓存机制

这时,bean B 也需要依赖 bean A,但由于 bean A 的工厂对象已经在三级缓存中,Spring 可以直接从三级缓存中获取到 bean A 的工厂对象,并通过它来创建 bean A 的实例。而对于需要被AOP代理的Bean,singletonFactories中的工厂对象会先创建一个原始的Bean实例,然后通过AOP代理来生成代理对象,并将代理对象放入一级缓存singletonObjects中。:在Spring中,AOP代理是在Bean的初始化阶段完成的,这意味着所有的属性填充和方法调用之后。

2024-02-27 15:03:14 3255

原创 SpringMVC的执行流程

处理器映射器通过不同的策略来查找处理器,这些策略可以是基于注解的、基于XML配置的或者基于Java配置的。通过合理地使用这些传播行为,可以确保业务逻辑的正确执行,同时避免事务相关的常见问题,如死锁和不一致的数据状态。它允许你在一个现有的事务中开启新的“事务”,以便能够在出现异常时仅回滚部分操作。:创建一个新的事务,并且暂停当前事务(如果存在)。:以非事务方式执行操作,如果存在事务,就把当前事务挂起。:支持当前事务,如果当前没有事务,就以非事务方式执行。:使用当前的事务,如果当前没有事务,则抛出异常。

2024-02-26 19:56:59 1106

原创 Spring Bean 是线程安全的吗

它的主要目的是降低代码之间的耦合度,提高代码的可维护性和可测试性。在开发过程中,应当仔细考虑Bean的作用域和状态管理,以确保应用程序在多线程环境下的正确性和稳定性。线程安全是指在多线程环境下,当多个线程访问某些共享资源时,无论操作系统如何调度这些线程,程序都能正确执行,不会出现数据不一致或者其他意外情况。总结来说,连接点是程序中可以插入切面逻辑的具体位置,而切入点是一种机制,用于选择哪些连接点将被切面逻辑所影响。,它定义了一组连接点,即在这些连接点上可以应用切面的逻辑。类的所有方法,因为没有过滤条件。

2024-02-22 16:41:16 901

原创 ArrayList 与 LinkedList 区别

随着元素的增加,当数组的容量不足以容纳新的元素时,ArrayList 会自动扩容,即创建一个新的更大的数组,并将旧数组的元素复制到新数组中。我们先来说value 为什么不能为 null ,因为ConcurrentHashMap 是用于多线程的 ,如果map.get(key)得到了 null ,无法判断,是映射的value是 null ,还是没有找到对应的key而为 null ,这就有了二义性。的静态常量,并为其分配一个唯一的值,可以确保在不同版本的类之间进行序列化和反序列化操作时不会出现兼容性问题。

2024-02-15 09:29:04 1213

原创 JDK 动态代理

对于 public 方法,使用 CGLIB 进行代理也是可行的,但关键在于 CGLIB 的代理机制提供了一种能力去代理那些在 JDK 动态代理中无法代理的方法。在 CGLIB 中,当目标类没有实现任何接口时,或者你想代理的是类的非 public 方法时,CGLIB 通过生成目标类的子类来实现代理。然而,对于 public 方法,如果你的目标类实现了一个或多个接口,并且你只想代理这些接口中定义的 public 方法,那么使用 JDK 动态代理通常是更好的选择,因为它更简单、性能也通常更好一些。

2024-02-12 21:25:00 834

原创 Java 多态

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。这句话的意思是,在具有多态性特性的程序中,当一个方法被调用时,具体调用哪个类的实现是在程序运行的时候才确定的,而不是在编写代码时就固定下来的。类型的引用,而不能假设它们指向具体的子类对象,这是为了保证代码的泛型性和灵活性,同时也是为了提高代码的可维护性和可扩展性。

2024-02-11 08:27:20 773

原创 为什么说重载发生在编译期而重写发生在运行期

Java包装类的缓存机制是在Java 5中引入的。该机制主要用于自动装箱过程,以提高性能和节省内存。当通过自动装箱将基本类型转换为包装类型时,会首先判断数值是否在特定范围内。对于Integer类来说,默认的缓存范围是-128到127。如果数值在这个范围内,就会从缓存中获取对应的包装对象,而不是创建一个新的对象。这个范围的最大值可以通过系统属性来设置。这种机制适用于Byte、Short、Integer、Long、Boolean、Character等包装类。

2024-02-10 15:57:10 890

原创 @Repository 与 @Mapper的区别

是 Spring 框架提供的注解,用于指定 Spring 容器扫描的包路径。它的作用是将指定包及其子包下的所有类进行扫描,并自动将符合条件的类注册为 Spring 容器中的 bean。使用在启动类上添加注解,并指定要扫描的包路径:在配置文件中配置属性,指定要扫描的包路径:当 Spring 容器启动时,会自动扫描指定的包路径,并将符合条件的类注册为 bean。符合条件的类包括使用了@Component@Service等注解的类。需要注意的是,如果同时使用了和注解,可能会导致重复扫描的问题。

2024-02-07 09:21:46 1523

原创 npm 错误 —— npm ERR! code ERESOLVE 解决方法

npm 错误 —— npm ERR!code ERESOLVE 解决方法。

2024-01-30 11:38:38 1248

原创 npm 安装时卡在 sill idealTree buildDeps 不动

npm 安装时卡在 sill idealTree buildDeps 不动。

2024-01-29 17:03:02 2736 2

原创 Maven下载源码出现:Cannot download sources Sources not found for org.springframwork...

问题出现原因,是目构建工具 Maven 的主路径消失了,或者说被 IDEA 改了,然后导致匹配不到下载的执行文件。所以需要把Maven主路径重新设置一下,构建成如下即可解决。好多人都可以,但是我的不可以。

2023-10-02 13:14:05 1853 1

原创 URL传 Base64字符串 造成报错 java.lang.IllegalArgumentException: Illegal base64 character 20

【代码】URL传 Base64字符串 造成报错 java.lang.IllegalArgumentException: Illegal base64 character 20。

2023-08-15 15:34:46 606

原创 SpringBoot + Vue 实现酒店客房管理系统

本系统旨在为酒店提供一种高效、简单的酒店客房管理系统,酒店只需要支付少量的服务购买资金,就可以使用酒店客房管理系统的全部服务,通过酒店客房管理系统可以大大提高酒店运营的效率,减少酒店工作人员的工作内容,减少酒店运营过程中出现人为失误带来的不必要损失,同时还可以减少企业人力开销,为企业节省大量不必要的开销,从经济方面考虑,不但是可行的,面且势在必行。该酒店客房管理采用了响应式设计,能够适应不同尺寸的设备屏幕,同时采用了一些现代化的前端技术,实现了美观的用户界面和优秀的用户体验。

2023-07-11 09:49:37 2710 11

原创 JavaSE总结(六)

在MyThread线程的run()方法中,我们通过Thread.interrupted()方法来判断线程是否被中断,当线程被中断后,Thread.interrupted()方法会返回true,并且会清除线程的中断状态。需要注意的是,interrupt()方法并不会真正中断线程的执行,它只是提供了一种机制,可以通知线程中断的需求,并可通过检测中断状态来决定线程的行为。调用该方法会设置线程的中断状态为true。因此,当我们运行上述代码时,3秒后MyThread线程会输出"线程被中断了",说明线程确实被中断了。

2023-07-03 09:05:20 162

原创 Redis学习总结(五)

该响应中包含了一个目标节点的地址和槽位号,客户端需要向该目标节点发送一个 ASKING 命令,告诉目标节点自己正在处理一个重定向请求,并将数据迁移到目标节点。节点间的命令通信:当一个节点接收到客户端的请求后,如果该节点不是负责处理该请求的槽位,则会触发重定向机制,将请求重定向到负责槽位的节点。负责槽位的节点接收到请求后,会进行相应的处理,并将结果返回给客户端。更具体地说,当一个节点宕机时,Redis Cluster会将该节点中的数据复制到其他节点上,并将其中一个节点提升为主节点,以继续提供服务。

2023-07-02 10:10:46 150

原创 JavaSE学习总结(五)

泛型是一种语法糖,泛型这种语法糖的基本原理是类型擦除。Java中的泛型基本上都是在编译器这个层次来实现的,也就是说:**泛型只存在于编译阶段,而不存在于运行阶段。**在编译后的 class 文件中,是没有泛型这个概念的。类型擦除:使用泛型的时候加上的类型参数,编译器在编译的时候去掉类型参数。我们定义了一个泛型类,定义了一个属性成员,该成员的类型是一个泛型类型,这个 T 具体是什么类型,我们也不知道,它只是用于限定类型的。

2023-07-01 09:19:18 175

原创 JavaSE学习总结(四)

异常被抛出后,JVM会在当前方法中查找匹配的异常处理器进行处理,如果当前方法没有找到匹配的异常处理器,JVM会递归地查找当前方法的调用方法,并在调用方法中进行处理,直到找到匹配的异常处理器。Java 中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和拋出异常,可以通过 throws 关键字在方法上声明该方法要拋出的异常,或者在方法内部通过 throw 拋出异常对象。throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。

2023-06-30 08:09:51 106

原创 JavaSE学习总结(三)

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型(而不是引用变量的类型)决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。前两者都需要显式地调用构造方法。

2023-06-29 12:47:19 100

原创 JavaSE学习总结(二)

在Java中,枚举(enum)是一种特殊类型的类,它们被用于表示一组固定的常量值。枚举中的每个常量都是枚举类型的一个实例,常量间以逗号分隔且位于花括号内。枚举常量实例在枚举类型中是唯一的,可以用作字典值,避免使用相同的字符串值甚至是整数值等基本类型值。枚举可以帮助我们更好的组织代码,使程序更加健壮,可读性更强,代码更加易于维护。以下是枚举在Java中的一些特点:枚举中的实例是有限的,定义了某种东西的所有可能的取值。枚举常量在枚举类型中是唯一的,可以用作字典值。

2023-06-28 14:00:38 82

原创 JavaSE学习总结(一)

其原因是在方法重载的时候,编译器会根据方法的名称、参数类型、参数个数和参数顺序等信息,生成一个唯一的方法签名,将其作为方法的唯一标识符。在调用该方法时,编译器会根据方法名、参数的类型、个数和顺序等信息,匹配该方法的唯一标识符,从而确定具体调用哪个方法。与传统的解释型语言不同,AOT使用编译器将代码编译为与系统硬件和操作系统兼容的本地机器代码,执行时无需再解释和翻译,可以直接运行。相比于传统的解释型语言,AOT能够提高程序的执行速度和执行效率,减少程序的启动时间,从而更好地满足用户对响应速度和性能的需求。

2023-06-27 10:50:27 123

原创 RocketMQ 常见面试题(四)

RocketMQTemplate是SpringBoot整合RocketMQ的核心类,它封装了RocketMQ的Java SDK,提供了一系列方便的方法用于发送消息。常用的方法如下:同步发送消息:SendResult syncSend(String destination, Message

2023-06-26 09:04:38 498

空空如也

空空如也

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

TA关注的人

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