第一章 动态代理1.1 概念1代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。
1动态代理,提供了一个代理的对象,有了代理对象后,当访问某个方法时,会被代理对象拦截(拦截后可以对方法进行前增强、后增强【代理对象不会破坏原有方法的代码】)
1.2 好处1234非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。可以为被代理对象的所有方法做代理。可以在不改变方法源码的情况下,实现对方法功能的增强。不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。
1.3 动态代理的特点12341.动态的创建.class文件2.动态的加载.class文件到内存中(创建Class对象)3.Proxy类是java中定义好的专门创建代理对象的类,该类需要一个"类加载器"4.对程序员来讲,不需要书写代理类
1.4 动态代理的代码实现格式1代理对象 = Proxy.newProxyInstance(类加载器 , 父接口 , 处理器)
123类加载器: 动态的加载.cla ...
编程开发
未读基于Spring Boot的MyBatis多表查询操作讲义一、什么是多表查询与关联映射在实际企业级应用中,数据往往分散在多张数据库表中,例如”用户表”和”订单表”、”文章表”和”评论表”。当我们需要同时获取这些关联数据时,就必须进行多表查询。MyBatis作为持久层框架,提供了两种核心机制来处理多表查询的结果映射:
resultMap:自定义结果集映射规则,解决实体类属性名与数据库字段名不一致的问题,更重要的是支持嵌套映射,即通过association(一对一)和collection(一对多)标签将关联表的数据封装到实体类的关联属性中。
分步查询:通过select属性指定另一个Mapper方法,先查询主表,再根据主表的结果”分步”查询关联表。可以配合延迟加载提升性能。
核心标签:
<association>:一对一关联(例如:订单 → 用户)
<collection>:一对多关联(例如:用户 → 订单列表)
resultMap 的 extends 属性可复用映射规则
二、为什么要使用多表与关联映射的优势
面向对象导航:通过实体类的嵌套对象(如Order. ...
编程开发
未读1. ThreadLocal 是什么ThreadLocal 是 Java 中的一个线程本地变量工具类,它提供了线程级别的变量存储能力。每个线程都可以通过 ThreadLocal 获取到自己独有的变量副本,不同线程之间的变量互不干扰。
简单来说,ThreadLocal 就像是为每个线程配备了一个专属的 “储物柜”,线程可以将自己的私有数据存入其中,并且只能访问自己存入的数据。
2. ThreadLocal 的作用ThreadLocal 主要有以下作用:
提供线程私有变量:让每个线程都拥有自己独立的变量副本
解决线程安全问题:避免多线程环境下共享变量的同步问题
简化参数传递:减少多层方法调用时的参数传递,线程内可直接获取所需变量
保存线程上下文信息:如用户身份、请求信息等,方便线程内随时访问
3. 什么时候使用 ThreadLocal适合使用 ThreadLocal 的场景:
避免方法参数传递链过长:当多个方法需要同一参数时
示例场景:在软件三层架构的开发中,某个数据需要在所有层之间传递并使用,就可以通过ThreadLocal实现。
4. 如何使用 ThreadLocal基本使用步 ...
SpringBootWeb 入门 · 请求 · 响应 · 重点总结一、Spring & SpringBoot 概述1.1 核心概念
项目
说明
Spring
管理和整合第三方框架的框架,提供依赖注入、事务管理、Web 开发支持等核心功能
SpringBoot
对 Spring 进行二次封装,简化配置、快速开发,最大特点:简化配置 + 起步依赖
SpringBootWeb
SpringBoot 封装后专门用于前后端数据交互的 Web 框架,内置 Tomcat 服务器
1.2 起步依赖
项目
说明
定义
完成某个功能所需最少依赖的集合,SpringBoot 将其整合为一个新依赖
命名特征
坐标名称中一定包含 starter 单词,如 spring-boot-starter-web
好处
引入一个起步依赖,自动传递所有相关依赖,且版本由父工程统一管理,无需指定 version
常用起步依赖
说明
spring-boot-starter-web
Web 开发(含内嵌 Tomcat + SpringMVC)
spring-boo ...
Mybatis · 三层架构 · 重点总结一、软件三层架构1.1 三层划分
层次
别名
包名
职责
表示层
用户界面层
controller / web
接收用户请求,展示数据,处理用户操作
业务层
业务逻辑层
service
系统核心,处理业务规则,连接上下两层
数据层
持久层 / 数据访问层
dao / mapper
与数据库交互,执行增删改查操作
1.2 架构目标
高内聚、低耦合;提高系统可维护性、可扩展性和灵活性。
二、Mybatis 概述2.1 核心概念
项目
说明
定义
优秀的持久层框架,用于简化 JDBC 的开发
作用
专门针对数据库进行 CRUD;免除了 JDBC 中设置参数和获取结果集的繁琐工作
SQL 编写方式
注解(简单 SQL)或 XML 映射文件(复杂/动态 SQL)
官网
https://mybatis.org/mybatis-3/zh/
2.2 Mybatis 入门四步骤
步骤
操作
① 创建 Spring Boot 项目
勾选依赖:Web、Lombok、M ...
Mybatis入门前言在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。
在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执行结果。
增删改操作:返回受影响行数
查询操作:返回结果集(查询的结果)
我们做为后端程序开发人员,通常会使用Java程序来完成对数据库的操作。Java程序操作数据库,现在主流的方式是:Mybatis。
什么是MyBatis?
MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
官网:https://mybatis.org/mybatis-3/zh/index.html
在上面我们提到了两个词:一个是持久层,另一个是框架。
持久层:指的是就是数据访问层(dao),是用来操作数据库的。
框架:是一个半成品软件,是一套可重用 ...
SpringBoot基础课程内容前言在没有正式的学习SpringBoot之前,我们要先来了解下什么是Spring。
我们可以打开Spring的官网(https://spring.io),去看一下Spring的简介:Spring makes Java simple。
Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流行程度排序为:
Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。而我们在项目开发时,一般会偏向于选择这一套spring家族的技术,来解决对应领域的问题,那我们称这一套技术为spring全家桶。
而Spring家族旗下这么多的技术,最基础、最核心的是 SpringFramework。其他的spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等等。
而如果我们在项目中,直接基于SpringFramework进行开发,存在两个问题:配 ...
全局异常处理论文里是一个简单版的异常处理器,而实际项目用了一个更强大的“全能型”处理器。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879下面是对第一段异常处理器代码的详细注释版,完全仿照你提供的注释风格和结构进行解释说明。```java/** * 全局异常处理器 * 作用:统一拦截整个项目中所有抛出的异常,并返回给前端一个标准格式的错误信息。 * 解释:如果没有这个类,后端出错时,前端会收到一大段乱糟糟的报错页面或HTML, * 有了它,前端总能收到一个结构清晰的JSON对象,方便统一处理。 */@RestControllerAdvice // 这个注解告诉Spring:这是一个专门处理异常的切面类,并且返回的数据会自动转成JSON格式public class AGlobalExceptionHandlerController ...
RAG 基础原理一个完整的 RAG 系统由两条流水线组成:离线索引流水线(将文档预处理存入向量库)和在线查询流水线(接收用户问题、检索、生成)。
离线阶段将原始文档切分成小块,通过 Embedding 模型转换为向量,存入向量数据库。
在线阶段将用户问题同样转换为向量,从数据库中找到最相近的文档块,拼接成上下文交给 LLM 生成答案。https://www.runoob.com/ai-agent/retrieval-augmented-generation.html
MCPLLM前端这个项目的前端,用 Vue 3 的最新推荐写法来保证代码结构清晰,用 Vite 这个新一代工具来构建(类比于maven,构建打包(Build) 压缩、整合代码)
热更新就是类似“改完代码自动重启生效”但更快更精准的效果;冷启动就像把一个需要 30 秒启动的 Java 应用优化到 1 秒以内
Pinia 就是让你用 Vue 3 写组件的方式去写全局数据仓库,它轻量、类型安全,并且完美替代了旧的 Vuex,成为目前 Vue 项目中管理全局状态的“标配”。
按需引入 组件只引入需要的 store,减少 ...
线程池 · 设计模式(单例 · 工厂) · 重点总结一、线程池1.1 为什么需要线程池
问题
说明
频繁创建/销毁线程
线程属于系统宝贵资源,每次 new Thread() 都需要向 OS 申请资源,用完即销毁,效率低
线程池的作用
预先创建好一批线程,任务来了直接从池中取,用完归还,实现线程复用,提升效率
1.2 核心接口与类
类/接口
说明
Executor
线程池顶层接口,定义 execute(Runnable) 方法
ExecutorService
常用子接口,扩展了更多功能(submit、shutdown 等)
ThreadPoolExecutor
推荐使用的线程池实现类,7 参数构造器,灵活可控
Executors
工具类,提供快速创建线程池的静态方法(不推荐生产使用,有 OOM 风险)
1.3 ThreadPoolExecutor 七大参数(⭐ 重点)
参数位置
参数名
类型
说明
1
corePoolSize
int
核心线程数,一直保持存活(即使空闲)
2
maximumPoolSize
i ...
🔥 热搜
加载中...





