- 博客(78)
- 收藏
- 关注
原创 JAVA双亲委派加载机制
双亲委派是 Java 类加载的核心机制,通过逐级向上委派、向下尝试加载,保障了类的一致性和安全性。如 Tomcat 为每个 Web 应用提供独立的类加载器,优先加载自身目录的类,未找到再委派父类加载器。如果父类加载器无法加载(例如父类加载器的搜索范围内没有该类),子类加载器才会尝试自己加载。父类加载器加载过的类,子类加载器不会重复加载,确保类的唯一性。不同层级的类加载器负责不同范围的类加载,形成清晰的边界。允许类加载器网状委派,实现动态模块化加载。始终由启动类加载器加载,全局唯一。
2025-02-20 08:57:19
322
原创 Spring AOP详解
Spring AOP 是一种强大的编程范式,能够将横切关注点从业务逻辑中分离出来,提供了更加清晰、易维护的代码结构。通过 AOP,可以在不修改现有代码的情况下增强功能,提升系统的灵活性与可维护性。
2025-02-15 10:34:04
661
原创 六大原则
详细:此原则强调的是分离关注点,即每个类应该只负责一项功能或行为,并且该类的所有服务都应该紧密围绕这一核心责任。例如,可以通过依赖注入(DI)的方式将具体的实现作为参数传递给需要它的类,而不是让这些类自己去实例化它们所依赖的对象。这有助于降低系统的耦合度,并促进代码的重用。详细:为了满足ISP,我们应该避免创建过于庞大和通用的接口,而是提供多个专门的接口供不同的客户端使用。设计模式的六大原则,即SOLID原则,是面向对象设计中的一组指导性原则,旨在帮助开发者创建更灵活、可维护和可扩展的软件。
2025-02-10 19:34:13
159
原创 Spring Boot 中的监视器是什么
Spring Boot 中的监视器主要是指应用程序的运行时监控功能,通常是通过 Spring Boot Actuator、日志、JMX 等机制实现的。通过这些监控功能,开发者可以轻松地追踪应用程序的健康状态、性能指标及其他运行时信息,从而提高系统的可维护性和可靠性。
2025-02-07 10:22:42
392
原创 SpringBoot Starter的工作原理
Spring Boot Starter 提供了一个方便的方式来集成常见的功能模块,并且通过自动配置和条件加载的机制,大大简化了 Spring 应用的配置过程。开发者只需选择合适的 Starter 依赖,Spring Boot 就会为应用自动配置和初始化相关组件。通过 Starter,Spring Boot 实现了开发快速、配置简洁、易于管理的目标。
2025-02-07 10:06:26
525
原创 Spring Boot 需要独立的容器运行吗
Spring Boot 不需要独立的容器运行,它内置了一个嵌入式的Web服务器(如Tomcat、Jetty或Undertow),所以可以直接作为一个独立的应用程序运行,而不需要外部的Servlet容器。这种情况下,Spring Boot作为一个Web应用运行,但这并不是Spring Boot的推荐方式,Spring Boot鼓励使用内嵌容器来简化部署。总结来说,Spring Boot的优势之一就是不需要独立的容器,它通过内嵌的Web容器来实现独立运行。
2025-02-07 10:01:55
460
原创 Spring Boot 有哪些优点
Spring Boot 是一个非常强大且灵活的框架,极大地提升了开发者的开发效率。通过减少配置和简化开发流程,它使得开发者可以更专注于业务逻辑和功能实现。无论是传统的 Web 应用开发,还是基于微服务架构的开发,Spring Boot 都能提供很好的支持。
2025-02-07 10:01:04
878
原创 什么是SpringBoot
Spring Boot 极大地简化了 Spring 应用的开发过程,通过提供自动化配置、嵌入式服务器以及生产环境相关功能,使得开发者能够专注于业务逻辑,减少了不必要的配置和部署工作。它是构建现代微服务架构应用和云原生应用的重要工具之一。
2025-02-07 09:59:50
949
原创 代理模式和适配器模式有什么区别
(Proxy Pattern)和(Adapter Pattern)都是结构型设计模式,它们有不同的应用场景和目标,虽然在某些方面看起来相似,但它们的意图和实现方式有显著的区别。
2025-01-13 20:21:40
922
原创 设计模式中的代理模式
动态代理允许我们在运行时创建代理对象,而不需要为每一个委托类都编写一个具体的代理类。Java中的动态代理主要分为两种:基于接口的代理和基于子类的代理。在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。当目标对象没有实现任何接口时,可以使用CGLIB库通过继承的方式生成代理类。缺点是对于每个需要代理的目标对象都需要创建一个代理类,这会导致代码膨胀。代理类和目标对象通常实现相同的接口或继承相同父类。在编译时就已经确定了代理类和被代理类的关系。1. JDK动态代理。
2025-01-10 20:15:48
447
原创 java反射
Java 反射是一种强大的技术,使得我们可以在运行时动态地操作类的结构、方法和属性。它主要用于框架开发、动态代理、序列化等场景。尽管反射提供了灵活性,但在性能和安全性上需要谨慎使用。
2024-12-30 18:56:09
370
原创 单例模式的写法
懒汉式:延迟加载,线程安全性差(需要双重检查锁定)。饿汉式:类加载时立即创建实例,线程安全,但浪费资源(如果实例不常用)。静态内部类:延迟加载,线程安全,不存在性能问题,推荐使用。枚举式:最安全、最简洁,JVM 保证唯一性,适合用于单例模式。通常推荐使用静态内部类或枚举式,它们具有较高的性能并能避免常见的错误。
2024-12-27 20:43:53
754
原创 MyBatis动态 SQL 的执行原理
MyBatis 的动态 SQL 提供了强大的功能,使得开发者能够灵活地生成复杂的 SQL 查询。通过使用。
2024-12-26 10:27:59
1378
原创 IBatis和MyBatis在细节上的不同有哪些
特性iBatisMyBatis框架名称MyBatis命名空间基本支持命名空间,功能较弱命名空间支持更强,支持更多复杂情况配置文件只支持 XML 配置支持 XML 配置和注解配置动态 SQL基本支持,表达能力较弱动态 SQL 强大,支持多种标签和条件注解支持不支持注解完全支持注解,简化配置Mapper 接口无原生接口支持支持 Mapper 接口,与 XML 或注解配合缓存机制基础缓存支持强大的缓存支持,包括自定义缓存策略分页查询无内建分页功能内建分页功能或支持第三方插件性能优化。
2024-12-25 14:15:36
553
原创 MyBatisSQL优化
优化 MyBatis SQL 性能的关键是:优化 SQL 语句本身、避免不必要的查询、合理使用缓存、避免 N+1 查询、批量处理操作,以及使用数据库索引和分析执行计划。通过这些优化措施,能够显著提升数据库操作的效率和应用的性能。
2024-12-24 20:25:35
542
原创 MyBatis的一级、二级缓存
一级缓存是 MyBatis 内部的缓存,作用范围是SqlSession。每个SqlSession都有自己的一级缓存,当在同一个SqlSession中执行多次查询时,MyBatis 会将查询结果缓存在SqlSession的一级缓存中。若再次执行相同的查询操作,MyBatis 会直接从缓存中获取数据,而不再访问数据库。二级缓存是 MyBatis 提供的全局缓存,作用范围是Mapper 映射文件。它可以跨多个SqlSession存储数据,通常用于多个请求或多个用户之间共享缓存。一级缓存。
2024-12-23 14:04:32
865
原创 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
一对一查询:可以通过标签来实现,它适用于一个表的记录与另一个表的记录一一对应的情况。一对多查询:可以通过标签来实现,或者使用嵌套查询(<select>标签)来执行一对多的查询。区别用于映射一对一的关系,而用于映射一对多的关系。联合查询一般适用于一对多的一次性查询,但在复杂查询中可能会出现数据重复或性能问题;嵌套查询则可以将父子表分开处理,但可能会导致多个查询的执行,影响性能。选择合适的实现方式,主要根据查询的复杂度、性能要求和实际业务需求来决定。
2024-12-21 11:32:26
1351
原创 接口绑定有几种实现方式
XML 映射方式:通过在 XML 文件中定义 SQL 语句,并在 Java 接口中声明方法进行绑定。注解方式:直接在 Java 接口方法上使用 MyBatis 提供的注解来定义 SQL 语句。混合方式:结合使用 XML 和注解,注解用于简单的 SQL 操作,XML 用于复杂的 SQL 或动态 SQL。根据项目的需求和复杂性,你可以选择最合适的方式。对于简单的 SQL,注解方式比较直观和方便;而对于复杂的查询和动态 SQL,XML 映射方式更为灵活。
2024-12-20 19:59:14
1032
原创 Mybatis是否支持延迟加载?它的实现原理是什么?
MyBatis 的延迟加载是通过动态代理机制实现的,使用SqlSession在访问时进行后续的查询。配置时,需要启用,并可以通过和标签设置某个属性的延迟加载。延迟加载在提高性能的同时也要注意SqlSession的生命周期和事务管理,以确保懒加载能够正常工作。
2024-12-19 10:00:28
679
原创 什么是MyBatis
MyBatis是一个流行的Java持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、改、查等)。MyBatis 继承了传统的 JDBC 编程方式,但通过提供更高层次的抽象,简化了 SQL 执行的过程,避免了大量的样板代码。MyBatis 是一个非常灵活且强大的持久层框架,适用于那些希望精确控制 SQL 执行的 Java 开发者。
2024-12-18 20:21:50
879
原创 路由传值的几种方式
路由传值的方式多种多样,每种方式都有其适用场景。在选择时,需要根据数据的敏感性、持久性、共享需求以及应用的架构来决定最合适的方式。例如,路径参数适用于传递资源 ID,查询参数适用于过滤和分页,状态管理适用于跨组件共享数据,localStorage 和 sessionStorage 适用于持久化数据存储等。
2024-12-17 20:20:26
947
原创 $route和$router的区别
router用于进行路由跳转和控制,提供了改变当前路由的能力。$route用于获取当前路由的信息,是一个只读对象,包含了当前路由的路径、查询参数、动态参数等。这两个对象通常一起使用,$router用来改变路由,$route用来访问当前路由的状态。
2024-12-16 20:19:41
217
原创 B-树和 B+树的区别
特性B-树B+树数据存储数据存储在内部节点和叶子节点数据只存储在叶子节点叶子节点链接不链接叶子节点按链表顺序链接查询效率查询时可能需要遍历多个节点查询效率较高,叶子节点按顺序存储范围查询不如B+树高效高效,通过叶子节点链表实现插入与删除操作较为复杂,可能涉及多个节点插入和删除操作较简单,只影响叶子节点内存使用节点存储数据,内存占用较大内部节点不存储数据,内存利用率更高。
2024-12-14 10:56:16
965
原创 路由之间是怎么跳转的?有哪些方式?
声明式跳转:通过<Link>或等标签实现,通常用于静态页面中的路由跳转。程序化跳转:通过等方法实现,通常用于事件处理、权限判断等动态场景。不同框架和技术栈提供了不同的路由机制,但基本原理相同,都是通过修改浏览器的 URL 地址来切换视图。
2024-12-13 20:24:47
1532
原创 vue组件之间是怎么传值的
父子组件传值:通过props从父传给子组件,通过$emit从子传给父组件。兄弟组件传值:可以通过父组件的中转来共享数据。跨组件传值:通过 Event Bus 或 Vuex 可以跨层级进行数据通信。状态管理:对于较大的应用,使用 Vuex 进行集中式状态管理更加高效和清晰。根据应用的复杂度和需求,选择合适的方式来进行组件间的通信。
2024-12-12 02:15:00
408
原创 Vue中有时候数组会更新页面,有时候不更新
直接修改数组的索引:Vue 不能检测到这种修改,需使用Vue.set()或。使用数组的变异方法:这些方法会触发视图更新。替换整个数组:替换数组本身会触发视图更新。Vue 版本差异:Vue 2.x 和 Vue 3.x 在响应式系统上有所不同。异步更新机制:Vue 的视图更新是异步的,可能存在延迟。通过了解这些常见的陷阱,你可以更好地控制 Vue 中数组数据的更新行为。
2024-12-11 19:42:13
707
原创 vue的生命周期
plaintextbeforeCreate // 实例刚创建,数据和事件未初始化 created // 实例创建完成,数据已初始化 beforeMount // 视图挂载前,模板尚未渲染 mounted // 视图挂载完成,DOM 已渲染 beforeUpdate // 数据更新前,视图未更新 updated // 数据更新后,视图已更新 beforeDestroy // 实例销毁前 destroyed // 实例销毁后。
2024-12-10 20:09:42
643
原创 MVVM和MVC区别
是一种经典的设计模式,适用于简单到中等复杂度的应用,特别是在 Web 开发中,它通过分离视图、控制器和数据模型,使得应用的逻辑更加清晰和可维护。
2024-12-09 19:55:32
2837
原创 红黑树的组成结构
红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree,BST),其每个节点都包含额外的颜色信息(红色或黑色)。红黑树不仅能够保证查找、插入和删除操作的最坏时间复杂度为 �(log�)O(logn),而且通过平衡机制,使得树的深度尽可能小,从而提高了查找和操作的效率。
2024-12-07 21:21:54
454
原创 在数据结构中,树是什么?怎么形容一棵树
节点:树由节点组成,每个节点包含两部分:数据和指向子节点的引用(或指针)。根节点:树中有一个特殊的节点称为根节点(Root Node),它是树的起始点,没有父节点。子节点:每个节点可以有零个或多个子节点。父节点:每个节点除了根节点外,都有一个唯一的父节点(Parent Node)。叶节点:没有子节点的节点称为叶节点(Leaf Node)或终端节点。分支节点:至少有一个子节点的节点称为分支节点或内部节点(Internal Node)。
2024-12-06 19:53:54
945
原创 一次完整的HTTP请求所经历几个步骤?
的,因此客户端(比如浏览器)会与目标服务器建立一个 TCP 连接。当你在浏览器中输入一个 URL 或在应用程序中触发某个请求时,首先需要解析这个 URL,识别出协议、域名、路径等信息。服务器处理完请求后,会通过 TCP 连接向客户端返回一个 HTTP 响应报文。否则,在响应完成后,客户端和服务器会关闭 TCP 连接。一旦 TCP 连接建立,客户端会向服务器发送 HTTP 请求报文。服务器收到 HTTP 请求后,会根据请求的内容做出响应。在这个过程中,客户端和服务器之间的 TCP 连接就被建立起来了。
2024-12-05 18:22:22
767
原创 Socket和http的区别和应用场景
总结来说,Socket提供了更底层的网络通信能力,适用于需要直接控制网络通信的场景,而HTTP则更适合于Web应用和需要请求-响应模型的场景。
2024-12-04 20:20:39
670
原创 什么是TCP的三次握手
TCP(传输控制协议)的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据,并且初始化双方的序列号。如果任何一步失败,TCP协议会通过超时和重传机制来尝试重新建立连接。
2024-12-03 20:48:16
2046
原创 什么是TCP/IP和UDP
特性TCPUDP连接类型面向连接无连接可靠性高,保证数据完整与顺序低,数据可能丢失或乱序速度较慢,存在重传和确认机制快,无重传和确认机制流量控制与拥塞控制支持流量控制与拥塞控制不支持流量控制与拥塞控制错误检测与修复支持错误检测与修复仅支持错误检测,不支持修复使用场景文件传输、网页浏览、电子邮件等实时应用,如视频、语音传输、在线游戏。
2024-12-02 20:05:24
1591
原创 快速排序算法
快速排序是一种高效的排序算法,尤其适用于大规模数据的排序。通过合理选择基准和优化递归,可以避免最坏情况并保持其良好的平均性能。在很多实际应用中,快速排序被广泛使用。
2024-11-30 11:25:41
819
原创 插入排序算法
插入排序(Insertion Sort)是一种简单的排序算法,它的基本思想是将待排序的元素逐一插入到已排序的部分中,直到所有元素都被插入到正确的位置上。具体过程就像是你在玩扑克牌时,将牌插入到已经排好的牌中一样。
2024-11-29 19:18:50
950
原创 二分查找
**时间复杂度**:二分查找的时间复杂度为O(log n),其中n是数组的长度。1. **初始化**:设定两个指针,`low`指向数组的起始位置,`high`指向数组的结束位置。3. **结束**:如果循环结束时`low`大于`high`,则表示目标值不在数组中,查找失败。- **空间复杂度**:二分查找是原地算法,其空间复杂度为O(1),不需要额外的存储空间。- **前提条件**:二分查找要求数组必须是有序的,否则算法无法正确工作。- **效率高**:对于大型有序数组,二分查找比线性查找快得多。
2024-11-28 10:47:08
401
原创 B-TREE
B-Tree(B树)是一种自平衡的多路搜索树,它被广泛应用于数据库和文件系统中作为索引结构。B-Tree的设计目标是减少磁盘I/O操作,提高数据检索效率。
2024-11-27 17:31:04
280
原创 栈
栈(Stack)是一种先进后出(Last In First Out, LIFO)的数据结构,它只允许在一端进行插入和删除操作。这一端被称为栈顶(Top),另一端被称为栈底(Bottom)。
2024-11-26 19:17:51
240
原创 什么是MyBatis?MyBatis的优缺点?
MyBatis 是一个支持定制化 SQL、存储过程以及高级映射的持久层框架。它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
2024-11-25 20:07:43
784
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人