自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2023-05-09 08:05:47 1748

原创 SpringBoot自动配置原理详解

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

2023-04-24 08:01:46 3197 5

原创 谈谈你对ThreadLocal的理解

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

2023-03-27 08:31:04 681

原创 Java锁机制详解

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

2023-02-07 09:52:00 1206

原创 Java 学习笔记(五)

开发者可以根据实际需求自定义AuthenticationEntryPoint的实现。例如,在自定义实现中,可以记录认证失败的日志、发送特定的错误消息给用户、或者执行其他与认证失败相关的操作。@PreAuthorize注解是Spring Security提供的一种权限控制方式,它允许开发者在方法执行前对用户进行访问控制。通过在方法上添加@PreAuthorize注解,并传入一个表达式作为参数,可以指定哪些用户可以访问该方法。

2024-10-08 11:11:41 731

原创 Java 学习笔记(四)

综合上述参数,@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true) 注解的含义是:如果 spring.aop.auto 的配置值为 true,或者该配置项完全不存在(因为 matchIfMissing = true),则条件成立,标注了该注解的类、方法或Bean将被包含进Spring应用上下文中。这对于条件化地激活或禁用自动配置特别有用。

2024-09-18 15:22:11 856

原创 一个HTTP请求的处理过程

Spring MVC框架通过过滤器、监听器、DispatcherServlet、拦截器、处理器等多个组件的协同工作,实现了对HTTP请求的高效处理。整个处理流程涵盖了请求的接收、预处理、业务逻辑处理、后处理、视图渲染和响应返回等多个阶段,每个阶段都可以通过相应的组件进行自定义和扩展,以满足不同的业务需求。

2024-09-12 08:30:11 502

原创 Java 学习笔记(三)

过滤器(Filter)定义与功能:过滤器是Servlet规范中定义的一种组件,它能够对几乎所有进入应用的HTTP请求进行预处理,以及对HTTP响应进行后处理。过滤器的主要作用包括但不限于:对请求和响应进行日志记录、身份验证、权限控制、数据压缩、字符编码转换等。运作原理:过滤器依赖于Servlet容器,通过实现javax.servlet.Filter接口来创建自定义过滤器。

2024-09-11 08:33:07 662

原创 Java 学习笔记(二)

CountDownLatch 是 Java 并发包 java.util.concurrent 中的一个类,它用于协调一个或多个线程,允许一个或多个线程等待一组在其他线程中执行的操作完成。CountDownLatch 是一种同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要特性和用法构造函数:CountDownLatch(int count):创建一个新的 CountDownLatch 实例,给定的计数 count 是必须在 await() 方法之前降至零的线程数。主

2024-09-10 09:27:30 800

原创 Java学习笔记(一)

读屏障的作用之一,就是与缓存机制交互,确保在执行读操作之前,处理器的工作内存(即缓存)中的数据是最新的,或者至少是能够反映所有之前写操作的结果的。解析过程可以发生在多个不同的时间点,包括在类加载的解析阶段、在接口方法解析过程中,或者是在类的字段或方法的字节码被实际使用的时候(如懒加载)。加载阶段是由类加载器(ClassLoader)完成的,它负责查找并加载类的二进制数据到 JVM 中,生成代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

2024-09-09 09:49:38 538

原创 HTTPS 的加密流程详解

HTTPS 采用的是对称加密和非对称加密结合的混合加密方式

2024-05-31 21:19:28 493

原创 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 719 1

原创 SQL JOIN

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

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

原创 正向代理和反向代理

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

2024-03-18 08:24:21 919

原创 Javac 和 Javap

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

2024-03-16 08:28:26 951

原创 Lambda 表达式

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

2024-03-15 16:22:38 951

原创 笔试刷题记录(二)

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

2024-03-08 08:20:37 886

原创 笔试刷题记录(一)

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

2024-03-07 08:27:30 727

原创 HTTP 和 TCP 的区别

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

2024-03-06 08:33:22 2986

原创 MYSQL 索引

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

2024-03-05 08:49:05 1080

原创 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 946

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

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

2024-03-03 08:51:14 1393

原创 Redis 集群

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

2024-03-02 08:48:37 846

原创 谈谈 JWT

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

2024-03-01 09:26:22 913

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

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

2024-02-29 09:04:35 1297

原创 Spring AOP 相关注解

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

2024-02-28 10:39:52 948

原创 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 5510

原创 SpringMVC的执行流程

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

2024-02-26 19:56:59 1136

原创 Spring Bean 是线程安全的吗

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

2024-02-22 16:41:16 930

原创 ArrayList 与 LinkedList 区别

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

2024-02-15 09:29:04 1245

原创 JDK 动态代理

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

2024-02-12 21:25:00 854

原创 Java 多态

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

2024-02-11 08:27:20 797

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

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

2024-02-10 15:57:10 1006

原创 @Repository 与 @Mapper的区别

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

2024-02-07 09:21:46 2602

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

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

2024-01-30 11:38:38 2172

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

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

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

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

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

2023-10-02 13:14:05 2223 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 743

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

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

2023-07-11 09:49:37 3144 13

原创 JavaSE总结(六)

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

2023-07-03 09:05:20 177

空空如也

空空如也

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

TA关注的人

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