- 博客(65)
- 收藏
- 关注
原创 Spring如何去解决循环依赖问题的?
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方的引用,循环的依赖将会导致陷入死循环。这就是Spring发生循环依赖的问题。A依赖B,B又依赖A它们之间形成了互相依赖A 依赖B,B依赖C,C又依赖A,形成了三者间依赖A 依赖A 形成了自我依赖。
2025-02-17 21:02:14
591
原创 Spring Boot 中的约定大于配置
例如,在知名的Java对象关系映射框架Hibernate的早期版本中,将类及其属性映射到数据库上需要是在XML文件中的描述,其中大部分信息都应能够按照约定得到,如将类映射到同名的数据库表,将属性分别映射到表上的字段。后续的版本抛弃了XML配置文件,而是使用这些恰当的约定,对于不符合这些约定的情形,可以使用Java 标注来说明。具体来说,就是 Spring Boot 通过一系列的默认设置和约定,减少了我们需要显式配置的内容,从而让我们专注于业务逻辑,而不必过多关注框架的配置细节。
2025-02-14 20:22:22
452
原创 布隆过滤器
布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为O(n),O(log n),O(1)。
2025-02-13 20:54:51
882
原创 分布式锁:超详细
当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。与单 机 模式下的锁不仅需要保证进程可见,还需要考虑进程与锁之间的网络问题。(我觉得分布式情况下之所以问题 变得 复杂,主要就是需要考虑到网络的延时和不可靠。。。一个大坑) 分布式锁还是可以将标记存在内存,只 是该内存 不是某个进程分配的内存而是公共内存如 Redis、Memcache。至于利用数据库、文件等做锁与单机的 实现是一样 的,只要保证标记能互斥就行。
2025-02-06 20:53:31
837
原创 Java反射机制
另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Class 类对象将一个类的方法、变量等信息告诉运行的程序。但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
2025-02-06 20:18:25
969
原创 Shiro
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。如果你需要保存密码,你要考虑如何保护这些密码数据,像下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少。
2025-02-06 20:17:02
877
原创 Maven
Maven 是一种广泛使用的 Java 项目构建自动化工具。它简化了构建过程并帮助管理依赖关系,使开发人员的工作更轻松。这篇文章不会涉及到 Maven 概念的介绍,主要讨论一些最佳实践、建议和技巧,以优化我们在项目中对 Maven 的使用并改善我们的开发体验。
2025-02-06 20:14:32
1189
原创 Redis
Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据库、 缓 存和消息中间件。它支持的数据结构有字符串(strings)哈希(hashes)列表(lists)集合 ( sets)有序集合(sorted sets)等,除此之外还支持bitmaps和地理 空间( geospatial )索引半径查询等功能。它内置了复制(Replication)LUA 脚本(Lua scripting)LRU 驱动事件(LRU eviction)事 务(Transactions)
2025-02-06 20:06:15
1059
原创 分布式锁:详解
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。锁是一个比较通用的解决方案,更准确点来说是悲观锁。
2025-01-04 17:10:50
608
原创 MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
1. 简单易用:MyBatis 采用了简单的配置和注解的方式,使得开发者可以快速上手,减少学习成本。2. 灵活性:MyBatis 提供了灵活的 SQL 映射配置,可以根据实际需求编写复杂的 SQL 查询语句。3. 高性能:MyBatis 使用了动态 SQL 语句和一级缓存等技术,可以提高数据库操作的性能。4. 易于集成:MyBatis 可以与 Spring、Spring Boot 等框架集成,方便与其他组件进行整合。
2024-12-21 16:59:53
729
1
原创 MySQL:三大日志
MySQL三大日志包括:undolog,redo log,binlog,它们分别有以下作用:undolog:是生成的日志。用于事务的,保证了事务的。redo log:是生成的日志。用于数据,保证了事务的。binlog:是生成的日志。用于等。
2024-12-10 20:35:10
1477
原创 Redis事务
Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。Redis 事务实际开发中使用的非常少,功能比较鸡肋,不要将其和我们平时理解的关系型数据库的事务混淆了。除了不满足原子性和持久性之外,事务中的每条命令都会与 Redis 服务器进行网络交互,这是比较浪费资源的行为。明明一次批量执行多个命令就可以了,这种操作实在是看不懂。因此,Redis 事务是不建议在日常开发中使用的。
2024-12-09 20:45:23
612
原创 易懂:MySQL事务(Transaction)详解
事务(Transaction):一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元,一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
2024-12-03 20:39:25
777
原创 超详细:MySQL索引的执行过程
解释:因为满足name like '小%'的记录可能有多条,而age字段的有序是建立的name有序的基础之上,上图中(小红, 15) (小红, 16) (小金, 17) (小兰, 16),
2024-11-27 20:46:44
903
原创 超详细:Redis分布式锁
由于 Redis 集群数据同步到各个节点时是异步的,如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。所谓可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。可重入分布式锁的实现核心思路是线程在获取锁的时候判断是否为自己的锁,如果是的话,就不用再重新获取了。
2024-11-22 17:16:35
1491
原创 Redis持久化机制详解
在服务线上请求的同时,Redis 还需要进行内存快照,内存快照要求 Redis 必须进行文件 IO 操作,这意味着单线程同时在服务线上的请求还要进行文件 IO 操作,文件 IO 操作会严重拖垮服务器请求的性能。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份分离出来,然后对这个复制的页面进行修改。子进程因为数据没有变化,它能看到的内存里的数据在进程产生的一瞬间就凝固了,再也不会改变,这也是为什么 Redis 的持久化叫「快照」的原因。
2024-11-20 19:58:05
792
原创 Redis 5 种基本数据类型详解
String 是 Redis 中最简单同时也是最常用的一个数据类型。String 是一种二进制安全的数据类型,可以用来存储任何类型的数据比如字符串、整数、浮点数、图片(图片的 base64 编码或者解码或者图片的路径)、序列化后的对象。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种简单动态字符串SDS。
2024-11-19 19:52:35
1013
原创 超详细:索引介绍(易懂!)
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。
2024-11-15 19:49:24
1147
原创 平衡二叉树、红黑树、B树、B+树
那么由于红节点不能两两相连,且右路径的黑节点数必须和做路径相同,所以右路径的节点是顶多是左路径的两倍。平衡二叉树的基础是二叉搜索树,对于一个二叉搜索树而言,新插入的数字若小于根节点则放在左边,反之放在右边。此外,基于红黑树的限制条件,在插入一个新的节点之后,红黑树的调整次数通常较少,大多数情况下不超过三次旋转。在构建一棵B树的时候,需要预先定义它的阶数m,限制一个节点至多存放m-1个值,并且也表明一个节点至多可以有m个子树。1、B+树的每一个子节点都会存储父节点的key,这里的key就是图中节点的值。
2024-11-13 17:07:50
1351
原创 超详细:树的基本概念(小白也能懂)
所有节点高度中的最大值,很明显,该树的高度也为4,13、14或15是最远叶子节点,从根节点到这三个最远叶子节点的路径上的节点总数是4,而根节点的高度是树中所有节点高度中的最大值。所有节点深度中的最大值,很明显,该树的深度为4,从根节点到13、14或者15节点路径上的节点总数是4,而13、14、15节点的深度是树中所有节点深度中的最大值。如上图树中2号节点的深度为2,高度为3,因为从根节点到2号节点的唯一路径上的节点总数为2,从2号节点到最远叶子节点(13、14或15)的路径上的节点总数为3。
2024-11-11 19:24:44
1437
2
原创 超详细:三大范式设计+反范式设计
3、部分函数依赖:如果A是一个属性组,则B属性值的确定需要依赖A属性组的某一些字段即可,例如学号和课程名称为一个属性组,那么学生姓名其实就只需要学号就可以确定。4、传递函数依赖:如果A属性(属性组),可以确定唯一个B属性的值,再通过B属性的值又可以唯一确定C属性的值,例如一个学号确定一个系名,一个系名对应一个系主任。5、主键:在一张表中,一个属性或者属性组,被其他所有属性完全依赖,则称这个属性为该码的表,比如上图的学号和课程名称组成的属性组。比如上图的姓名,完全依赖于学号。它允许数据冗余,以提高查询性能。
2024-11-10 21:37:24
1317
3
原创 超详细:Vue入门
我们设置数据 ok 为 true,show 也为 true,查看浏览器运行效果,并键入 F12 打开“开发者工具”中的 Elements 选项卡,查看对应的 DOM 结构,可以发现我们写了 3 个 DIV 元素,但是在 DOM 结构中只有 v-if 和 v-show 的 DIV 存在,v-else 对应的 DIV 因为不满足条件,被删除了。v-show 无论条件是否成立,元素都必须添加到 DOM 树中,所以有更高的初始渲染消耗,通过 CSS 样式来控制是否显示,性能消耗小,适合频繁切换显示隐藏的元素。
2024-11-08 19:06:18
1667
原创 超详细:Redis 性能优化
简单来说,如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。具体多大才算大呢?String 类型的 value 超过 1MB复合类型(List、Hash、Set、Sorted Set 等)的 value 包含的元素超过 5000 个(不过,对于复合类型的 value 来说,不一定包含的元素越多,占用的内存就越多)。如果一个 key 的访问次数比较多且明显多于其他 key 的话,那这个 key 就可以看作是hotkey(热 Key)。
2024-11-07 20:00:38
1150
原创 超详细:Redis 事务
Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。Redis 事务实际开发中使用的非常少,功能比较鸡肋,不要将其和我们平时理解的关系型数据库的事务混淆了。除了不满足原子性和持久性之外,事务中的每条命令都会与 Redis 服务器进行网络交互,这是比较浪费资源的行为。明明一次批量执行多个命令就可以了,这种操作实在是看不懂。因此,Redis 事务是不建议在日常开发中使用的。
2024-11-06 19:56:47
3513
原创 IOC&AOP详解
IoC (Inversion of Control )即控制反转/反转控制。它是一种思想不是一个技术实现。描述的是:Java 开发领域对象的创建以及管理的问题。例如:现有类 A 依赖于类 B传统的开发方式:往往是在类 A 中手动通过 new 关键字来 new 一个 B 的对象出来使用 IoC 思想的开发方式:不通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面去取即可。
2024-11-05 17:01:10
1201
原创 常见加密算法
加密算法是一种用数学方法对数据进行变换的技术,目的是保护数据的安全,防止被未经授权的人读取或修改。加密算法可以分为三大类:对称加密算法、非对称加密算法和哈希算法(也叫摘要算法)。
2024-10-31 19:36:54
1363
原创 Java值传递详解
在 swap() 方法中,a、b 的值进行交换,并不会影响到 num1、num2。因为,a、b 的值,只是从 num1、num2 的复制过来的。也就是说,a、b 相当于 num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。也就是说 change 方法的参数拷贝的是 arr (实参)的地址,因此,它和 arr 指向的是同一个数组对象。看了这个案例很多人肯定觉得 Java 对引用类型的参数采用的是引用传递。实际上,并不是的,这里传递的还是值,不过,这个值是实参的地址罢了!
2024-10-28 19:45:28
627
原创 Shiro授权(Authorization)
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(subject)、资源(Resource)、权限(Permission)、角色(Role)。@OverrideSystem.out.println("调用MyShiroRealm.doGetAuthorizationInfo获取权限信息!");静态授权:授权主体(用户)相应的角色和权限info.addStringPermission("用户列表");
2024-10-23 11:52:34
1086
原创 超详细:索引介绍
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。
2024-10-22 17:19:17
794
原创 CAS 详解
JDK 1.5 以后的 AtomicStampedReference 类就是用来解决 ABA 问题的,其中的 compareAndSet() 方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。这就是 自旋锁机制。AtomicInteger是 Java 的原子类之一,主要用于对 int 类型的变量进行原子操作,它利用Unsafe类提供的低级别原子操作方法实现无锁的线程安全性。指令,那么自旋操作的效率将有所提升。
2024-10-21 19:43:22
612
原创 乐观锁和悲观锁详解
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。// 需要同步的操作try {// 需要同步的操作。
2024-10-18 17:05:08
727
原创 Java基础常见面试题总结(2-3)
目录Object 类的常见方法有哪些?==和 equals()的区别== 对于基本类型和引用类型的作用效果是不同的 Object 类 equals() 方法equals() 方法存在两种使用情况 hashCode()有什么用? 散列表存储的是键值对(key-value)的特点为什么要有 hashCode? 那为什么 JDK 还要同时提供这两个方法呢?那为什么不只提供 hashCode() 方法呢?那为什么不只提供 hashCode() 方法呢?为什么重写 equals0 时必须重写 hashCode0 方法
2024-10-17 19:31:46
569
原创 Java基础常见面试题总结(2-2)
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。上面的结论没有完全理解的话也没关系,我们来看一个具体的案例!
2024-10-16 19:54:23
876
原创 Java基础常见面试题总结(2-1)
我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为要调用无参的构造方法)。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),Java 就不会添加默认的无参数的构造方法了。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。
2024-10-15 19:40:37
572
原创 Shiro认证(Authentication)
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、会话管理和加密等功能。对于任意一个应用程序,Shiro都可以提供全面的安全管理服务,对比Spring Security,可能没有Spring Security功能强大,但是完美在实际工作中可能不需要那么复杂的功能,所以使用简单易用的Shiro就已经足够了。@Resource@OverrideSystem.out.println("调用MyShiroRealm.doGetAuthorizationInfo获取权限信息!");
2024-10-15 19:02:54
1163
原创 Java基础常见面试题总结(1-5)
方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。就比如下面这个方法就可以接受 0 个或者多个参数。另外,可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数。
2024-10-14 19:40:59
346
原创 Java基础常见面试题总结(1-4)
它可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。也就是说,静态变量只会被分配一次内存,即使创建多个对象,这样可以节省内存。对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。静态变量是通过类名来访问的,例如User.name(如果被private关键字修饰就无法这样访问了)。
2024-10-11 20:52:25
364
原创 中间件:SpringBoot集成Redis
目录 1.1 Redis简介1.1.1 基本信息1.1.2 数据结构1.1.3 优势1.2 Redis基本使用1.2.1 Windows安装1.2.2 配置1.2.3 启动1.2.4 连接 编辑1.2.5 基本操作 1.3 Jedis操作Redis1.3.1 基本操作1.3.2 连接池1.4 SpringBoot操作Redis1.4.1 基本操作Redis是一个高性能的key-value数据库,以下是对其的详细介绍:Redis支持丰富的数据类型,包括但不限于:此外,Redis还提供了Geospa
2024-10-11 20:27:14
1232
原创 Java基础常见面试题总结(1-3)
当调用包装类的valueOf()方法时,JVM会先检查传入的数值是否在缓存范围内,如果是,则直接从缓存数组中返回对应的对象;我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。Byte,Short,Integer,Long 这 4 种包装类默认创建了数值[-128,127]的相应类型的缓存数据,Character 创建了数值在[0,127]范围的缓存数据,Boolean直接返回True or False。
2024-10-10 20:38:09
621
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅