- 博客(83)
- 收藏
- 关注
原创 Spring 无法解决循环依赖的 5 种场景
Component// 依赖其他BeanSpring 的循环依赖处理机制体现了框架设计的高度智慧,但作为开发者,最优雅的解决方案往往不是技术手段,而是架构设计。单一职责原则:拆分臃肿的 Bean依赖倒置原则:面向接口编程层次化设计:Controller -> Service -> Repository 的严格分层。
2025-03-07 18:58:59
1102
原创 Spring 三级缓存 vs 二级缓存:深度解析循环依赖的终极解决方案
/ Bean A 依赖 Bean B@Component@Autowired// Bean B 依赖 Bean A@Component@Autowired。
2025-03-04 20:55:13
661
原创 死锁发生的原因及如何避免
线程 A 等待线程 B 的资源,线程 B 等待线程 C 的资源,线程 C 又等待线程 A 的资源。线程 B 持有锁 Y,并尝试获取锁 X。:线程 A 持有锁 X,线程 B 必须等待线程 A 释放 X 后才能使用。:线程 A 持有锁 X,无法被系统强制剥夺锁 X 给线程 B。:线程在持有至少一个资源的同时,等待获取其他线程持有的资源。:存在一个线程等待链,每个线程都在等待下一个线程持有的资源。:对资源(如锁)进行编号,所有线程必须按编号从小到大申请。:若线程无法获取全部资源,则释放已持有的资源,稍后重试。
2025-02-25 14:05:04
667
原创 深入剖析Spring MVC
Model:封装应用程序的数据和业务逻辑。View:负责渲染数据(通常是 HTML 页面)。Controller:处理用户请求并协调 Model 和 View。
2025-02-18 20:52:33
911
原创 使用 JavaConfig 配置 Spring
JavaConfig 是 Spring 框架提供的一种基于 Java 的配置方式。它通过使用注解标记的类来替代传统的 XML 配置文件。JavaConfig 的核心思想是“约定优于配置”,通过注解和代码来定义 Bean 及其依赖关系。使用// 配置 Bean 的方法使用@Bean@Bean。
2025-02-15 09:24:11
777
原创 Spring 整合 MyBatis:核心知识点详解
在传统的Java开发中,开发者需要手动管理数据库连接、事务以及SQL语句的执行。是Spring提供的一个类,用于自动扫描MyBatis的Mapper接口,并将其注册为Spring的Bean。:Spring的IoC容器可以管理MyBatis的Mapper接口,简化了对象的创建和管理。:通过Spring的配置,可以简化MyBatis的配置过程,减少冗余代码。:Spring提供了声明式事务管理,可以轻松地管理数据库事务。,并指定MyBatis的Mapper文件位置。在Spring的配置文件中,配置数据源。
2025-02-10 19:48:43
484
原创 Spring MVC
Spring MVC是一个基于MVC设计模式的Web框架,用于构建灵活、可扩展的Web应用。它通过DispatcherServlet处理请求,并将请求分发给相应的控制器进行处理。
2025-02-07 09:56:17
539
原创 Spring AOP
AOP(Aspect-Oriented Programming)是一种编程范式,旨在将横切关注点从核心业务逻辑中分离出来。通过AOP,开发者可以将日志、事务管理、安全性等通用功能模块化,从而提高代码的可维护性和可重用性。
2025-02-07 08:50:53
556
原创 深入理解Spring框架的核心概念与使用
Spring是一个轻量级的开源框架,旨在简化Java企业级应用的开发。它通过提供一系列模块,如Spring Core、Spring AOP、Spring MVC等,帮助开发者构建灵活、可扩展的应用。
2025-02-04 15:15:53
355
原创 Spring 实现注入的方式
如果没有匹配, 则回退为一个原始类型进行匹配,如果匹配则自动装配。①如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛 出异常。③如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会 抛出异常。②如果指定了 name ,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。:默认按照 Bean 的名称进行注入,如果名称相同则可以选择使用。注解指定具体的 Bean 名称进行注入。
2025-02-04 14:45:01
764
原创 如何在MyBatis中优化SQL
MyBatis 是一款流行的 Java 持久层框架,它简化了数据库操作,并且能够灵活地映射 Java 对象与数据库表之间的关系。在使用 MyBatis 进行数据库操作时,SQL 性能优化是至关重要的,特别是在面对复杂查询、大规模数据处理或高并发场景时。
2025-01-13 20:58:40
692
原创 Java反射机制
Java反射(Reflection)是一种机制,它允许程序在运行时加载、探测和操作类、方法、构造函数等信息。通过反射,Java程序能够动态地获取类的详细信息,并能在运行时实例化对象、调用方法、访问字段等,而不需要在编译时就知道具体的类、方法或字段。反射机制为Java提供了极大的灵活性,常用于一些框架或库中,如Spring、Hibernate等,它们通过反射来实现依赖注入、动态代理等功能。
2025-01-06 20:43:54
1023
原创 设计模式中的代理模式
动态代理允许我们在运行时创建代理对象,而不需要为每一个委托类都编写一个具体的代理类。这提供了更高的灵活性和可扩展性。Java中的动态代理主要分为两种:基于接口的代理和基于子类的代理。在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。使用CGLIB需要引入相应的依赖(如Maven依赖)。2. CGLIB 动态代理。1. JDK动态代理。
2025-01-04 09:36:24
1036
原创 代理模式和适配器模式有什么区别
代理对象与目标对象通常有相同的接口,因此可以在客户端不感知的情况下替代目标对象。适配器通过将一个接口转换成客户端所期望的接口,从而使得不兼容的类能够一起工作。代理模式(Proxy Pattern)和适配器模式(Adapter Pattern)是两种结构型设计模式,它们看似相似,但在设计意图、使用场景以及功能上有一些显著的区别。:远程代理(如在分布式系统中,代理类用于远程调用目标对象)或虚拟代理(用于延迟加载某些计算量大或数据量大的对象)。:将旧的接口适配到新的接口,或者将一个类的接口适配为另一个类的接口。
2025-01-03 15:22:03
957
原创 静态代理与动态代理区别
由于代理类在编译时就已经确定,一旦需要增加新的代理逻辑或者修改代理行为,通常需要手动修改代理类。:静态代理是在编译时就确定了代理类的实现,通常通过手动编写代理类或者由工具在编译期生成。:适用于需要根据不同的需求生成不同的代理类,或者代理的类的数量较大,且不可能在编译时知道具体的代理类的场景。静态代理需要提前确定好所有代理的类,因此比较适合代理逻辑相对简单,且代理类不需要太多变化的场景。:如果有多个接口或多个实现类需要代理,则每个接口或实现类都需要创建一个对应的代理类,可能会导致大量的代码重复。
2025-01-02 08:28:00
1014
原创 设计模式-单例模式
懒汉式:延迟加载,线程安全性差(需要双重检查锁定)。饿汉式:类加载时立即创建实例,线程安全,但浪费资源(如果实例不常用)。静态内部类:延迟加载,线程安全,不存在性能问题,推荐使用。枚举式:最安全、最简洁,JVM 保证唯一性,适合用于单例模式。通常推荐使用 静态内部类 或 枚举式,它们具有较高的性能并能避免常见的错误。
2024-12-28 22:05:58
727
原创 设计模式的分类及作用
设计模式(Design Patterns)是软件开发中一种经过验证的、可重用的解决方案,用来解决在特定场景下的常见问题。设计模式可以帮助程序员在面对复杂问题时,通过已经被验证过的方式来设计系统,使得代码更加清晰、可维护、可扩展。和,每一类包含不同的模式。
2024-12-27 15:16:39
1428
原创 Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么
执行器主要特点适用场景每次执行都创建新的Statement,没有缓存适合单次执行、简单查询或低频次操作。缓存,复用执行过的 SQL适合有重复查询的场景,减少 SQL 解析开销。批量执行 SQL,减少与数据库的交互次数适合批量插入、批量更新、批量删除等大量数据处理操作。适用于简单的单次 SQL 执行。适用于重复执行的 SQL,能有效复用。适用于需要执行大量 SQL 的批量操作,能显著提高性能。在 MyBatis 的配置中,你可以根据应用场景选择不同的Executor。
2024-12-26 08:27:18
1061
原创 MyBatis中动态SQL执行原理
XML 配置解析:MyBatis 读取映射文件中的动态 SQL 标签(如<if><choose><foreach>等)并解析它们。条件判断:在执行时,MyBatis 根据传入的参数判断哪些 SQL 标签的条件满足,并决定是否将相关的 SQL 片段包含在最终的 SQL 中。生成 SQL:根据条件判断结果,MyBatis 动态生成 SQL 查询语句。参数绑定:MyBatis 将查询方法的参数绑定到 SQL 中的占位符。执行 SQL:最终生成的 SQL 被执行,结果返回给调用者。
2024-12-25 18:00:46
1271
原创 MyBatis 的一级缓存和二级缓存
一级缓存是SqlSession级别的缓存,也叫做本地缓存。它默认开启,并且是 MyBatis 的默认缓存机制。在一次数据库会话(SqlSession)中,MyBatis 会将查询到的结果缓存到一级缓存中。如果相同的 SQL 被多次执行(在同一个SqlSession中),MyBatis 会从缓存中读取数据,而不去数据库中查询,这样可以减少数据库的访问。二级缓存是级别的缓存,也叫做全局缓存。它在 MyBatis 的多个SqlSession之间共享缓存数据。换句话说,二级缓存的数据是跨SqlSession。
2024-12-24 14:00:45
1127
原创 MyBatis 中常用标签
在 MyBatis 中,常用标签是进行 SQL 映射和处理数据库操作的核心。MyBatis 通过 XML 配置文件或者注解来映射 SQL 语句和 Java 对象之间的关系。以下是 MyBatis 中常用的标签,主要包括等,这些标签是 MyBatis 进行数据库操作的基础。
2024-12-23 16:50:28
1297
原创 Mybatis 如何实现一对一、一对多的关联查询
在 MyBatis 中实现一对一和一对多的关联查询可以通过多种方式来完成,主要包括和。每种方式都有其特点和适用场景。
2024-12-21 08:34:29
921
原创 MyBatisz中接口绑定实现方式
在 MyBatis 中,接口绑定(也称为 Mapper 接口)是将 SQL 语句与 Java 方法关联起来的一种方式。它允许开发者定义一个接口,并通过 MyBatis 自动将其方法映射到相应的 SQL 操作上。和Sql语句比较简单时,使用注解进行绑定;当Sql语句比较复杂时,使用xml进行绑定。
2024-12-20 15:20:27
1042
原创 MyBatis 的优缺点
MyBatis 在灵活性、可控性和性能方面表现出色,特别是在需要精细控制 SQL 和优化查询性能的应用场景中。然而,在自动化程度、快速开发和支持复杂的对象关系映射方面,它可能不如一些全功能的 ORM 框架。因此,选择 MyBatis 还是其他 ORM 框架取决于具体项目的特性和团队的技术栈。对于那些需要高性能、细粒度控制以及有经验的 SQL 开发者来说,MyBatis 是一个很好的选择。
2024-12-19 08:31:41
1141
原创 MyBatis
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。
2024-12-18 20:25:39
1091
原创 $route 和$router 的区别
在 Vue.js 中, 和 是 Vue Router 提供的两个非常重要的对象,它们用于管理和操作路由。定义: 是一个响应式的对象,它包含了当前激活路由的所有信息,例如路径、参数、查询字符串等。你可以把它看作是“当前路由快照”。常见属性: 的用途 读取路由信息:你可以使用 来访问当前路由的各种信息,如路径 ()、参数 ()、查询字符串 () 等等。动态组件渲染:根据 中的数据(比如 或 ),可以实现动态加载不同的组件或内容。导航守卫:虽然 本身不直接用于导航控制,但它可
2024-12-17 13:56:37
879
原创 Vue 的响应式原理
在 Vue 2.x 中,Vue 使用来拦截对象属性的getter和setter。每当一个 Vue 实例被创建时,它会遍历所有传入的数据对象的属性,并将它们转换为 getter 和 setter。
2024-12-16 21:03:14
1204
原创 vuex 作用及五大组成部分
Vuex 是 Vue.js 的官方状态管理库,旨在帮助开发者构建大型应用时更好地管理和共享全局状态。它提供了一种集中式存储和管理应用所有组件的状态的方式,并且遵循单一状态树的原则。通过 Vuex,可以更容易地实现状态的可预测性和调试。
2024-12-14 19:36:50
813
原创 Vue中常见指令
在Vue.js中,指令(Directives)是带有v-前缀的特殊属性,用于在HTML元素上添加特殊的Vue行为。它们可以用来绑定数据、监听事件、控制条件渲染等。
2024-12-12 10:25:37
476
原创 vue-生命周期
Vue 的生命周期是指 Vue 实例从创建到销毁期间经历的一系列阶段。每个阶段都有相应的钩子函数(Lifecycle Hooks),允许开发者在这些关键时刻执行自定义逻辑。
2024-12-10 15:15:27
796
原创 http 和 https 的区别?
HTTP (HyperText Transfer Protocol) 和 HTTPS (HyperText Transfer Protocol Secure) 是两种用于在 Web 浏览器和网站服务器之间传输网页的协议,它们的主要区别在于安全性。
2024-12-06 20:12:26
3218
原创 HTTP状态码
HTTP 状态码是服务器在响应客户端请求时返回的一个数字代码,它用于表示请求的处理结果。状态码是一个三位数,根据其分类可以分为五类,每类由第一位数字标识,并且通常伴随着一个简短的英文短语来帮助理解其含义。
2024-12-05 21:18:42
545
原创 TCP的建立连接与关闭连接
三次握手:确保了双方都能正确初始化序列号,并且保证双方都知道对方已准备好通信。四次挥手:因为TCP连接是双向的,所以每个方向都需要单独关闭。TIME_WAIT状态的存在是为了处理可能在网络中延迟到达的重复报文,确保旧连接的数据不会影响新连接。此外,它还有助于解决网络分组重组的问题。
2024-12-04 18:48:58
892
原创 什么是 Socket?
Socket(套接字)是计算机网络编程中的一个重要概念,它用于在不同计算机之间进行通信。Socket 提供了一种机制,使得应用程序可以通过网络发送和接收数据。Socket 通信通常基于 TCP/IP 协议,但也可以使用其他协议,如 UDP。
2024-12-03 19:58:06
585
原创 TCP/IP 和 UDP
TCP/IP 是一个包含多个协议的框架,用于互联网的数据传输,其中TCP和UDP是传输层最重要的两个协议。TCP提供了一种可靠的、面向连接的服务,适用于需要确保数据完整性和顺序性的应用;UDP提供了一种快速的、无连接的服务,适用于需要降低延迟和减少开销的应用。
2024-12-02 20:50:37
1663
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人