- 博客(137)
- 收藏
- 关注
原创 【SpringBoot】Spring AOP 详解
本文介绍了Spring AOP的核心概念与应用。AOP(面向切面编程)通过将分散的功能模块化,实现代码复用。关键概念包括:切点(定义生效范围)、连接点(具体方法)、通知(执行代码)和切面(切点+通知)。文章详细讲解了通配符(*)和连续符(..)在切点表达式中的使用场景,并列举了@Aspect、@Around等核心注解的功能特点。特别说明了@Order控制切面执行顺序的规则,以及@annotation实现自定义注解切面的完整流程,包含从定义注解到切面类实现的代码示例。文中还强调了环绕通知必须处理Proceed
2025-08-14 10:26:51
804
原创 【SpringBoot】统一功能处理
本文介绍了Spring Boot应用中常见的三种配置实现:1. 登录拦截器实现,通过继承HandlerInterceptor接口定义preHandle、postHandle和afterCompletion方法;2. 统一结果返回处理,使用@ControllerAdvice注解和ResponseBodyAdvice接口实现响应数据的统一封装;3. 全局异常处理,通过@ExceptionHandler注解捕获并处理所有异常。这些配置通过WebMvcConfigurer进行注册,实现了请求拦截、响应格式统一化和异
2025-08-13 15:02:04
312
原创 【SpringBoot】MyBatis 动态 sql
本文介绍了MyBatis中常用的动态SQL标签及其参数:1)<if>根据test表达式判断是否包含SQL片段;2)<trim>通过prefix/suffix设置前后缀,prefixOverrides/suffixOverrides去除多余字符;3)<where>自动生成WHERE子句;4)<set>用于参数更新;5)<foreach>遍历集合,包含collection、item等参数;6)<sql>定义可重用的SQL片段;7)<i
2025-08-12 16:27:46
217
原创 【SpringBoot】持久层 sql 注入问题
SQL注入安全风险及MyBatis占位符区别 SQL注入是一种常见的安全漏洞,攻击者通过前端恶意传参改变SQL语句结构获取敏感数据,主要由于参数过滤不严或后端代码缺陷导致。在MyBatis框架中,#{}和${}两种占位符存在重要区别:#{}采用预编译SQL,参数不参与语法构建,能自动处理类型转换,有效防止SQL注入;${}采用即时SQL,参数直接替换到语句中,需要手动处理字符串引号,存在注入风险但适用于需要动态SQL的场景(如排序)。开发时应优先使用#{}确保安全,仅在必要时谨慎使用${}。
2025-08-11 14:41:13
338
原创 【SpringBoot】MyBatis 详解
MyBatis是一个简化JDBC开发的持久层框架,支持注解和XML两种方式实现数据库操作。注解方式使用@Mapper标记接口,通过@Select、@Insert等注解直接编写SQL语句,支持#{}/${}参数绑定和自动驼峰命名转换。XML方式则将SQL语句写在配置文件中,通过namespace和id关联接口方法。两种方式都需要配置数据源和MyBatis相关属性,如日志实现、XML文件路径等。MyBatis还提供了主键回填(@Options)等便捷功能,大幅简化了Java程序与数据库的交互过程。
2025-08-11 11:22:19
758
原创 SpringBoot 配置文件
Spring Boot支持三种配置文件格式:properties、yml和yaml。properties文件使用"="连接键值对,而yml/yaml文件使用":"加空格,并采用两个空格缩进。yml支持对象配置,通过@ConfigurationProperties注解可绑定配置到对象。字符串值在yml中不加引号,单引号会转义特殊字符。配置读取可通过@Value注解实现,如@Value("${mykey.k1}")获取嵌套属性。
2025-08-08 16:38:53
258
原创 Spring MVC
Spring框架家族包含三个核心技术:Spring是基础的企业应用开发框架,SpringBoot是其简化配置的封装版本,SpringMVC则是基于MVC模式的Web框架。这些框架通过系列注解实现功能开发,如@RequestMapping处理路由、@RequestBody接收JSON参数、@PathVariable获取路径参数等。核心控制器注解包括@Controller(默认返回视图)和@RestController(组合@ResponseBody实现数据返回),配合参数获取注解如@RequestParam、
2025-08-08 10:56:34
247
原创 Spring 的 IoC 和 DI
本文介绍了Spring框架中Bean的管理和使用。主要内容包括:1)Spring容器的核心功能IoC(控制反转)和DI(依赖注入);2)Bean存储的注解方式,包括五大类注解(@Controller、@Service等)和@Bean方法注解;3)依赖注入的@Autowired和@Resource注解使用;4)@Bean注解的详细用法,包括如何注入同一类型的不同Bean实例。文章强调了SpringBoot项目中的分层规范和注解命名规则,并提供了相关代码示例说明Bean的声明和注入方式。
2025-08-08 09:52:48
415
原创 SpringBoot 环境安装
摘要:本文介绍了SpringBoot开发环境的搭建步骤:1)卸载旧版IDEA,通过注册表删除相关项和控制面板卸载程序;2)下载社区版IDEA 2022.1.4;3)安装SpringBoot插件(提供百度网盘资源),强调不要解压插件文件且安装后禁止更新;4)验证插件安装成功后创建SpringBoot项目。注意事项包括专业版IDEA无需卸载,以及社区版特定版本的处理方法。
2025-08-07 15:41:44
569
原创 封装 brpc::Channel
本文介绍了基于brpc框架的服务管理设计。主要采用Channel作为客户端与服务端的交互通道,通过service_channel封装服务名称与Channel的映射关系。系统设计包含:1)使用数组管理主机节点地址,哈希表建立地址与Channel的映射;2)采用互斥锁保护共享容器;3)实现RR轮转策略均衡分配Channel;4)提供add_host/del_host动态管理节点;5)ServiceManager通过回调函数处理服务上下线事件,并使用互斥锁保护服务集合和服务-通道映射表。该设计实现了服务节点的动态
2025-07-12 18:18:29
232
原创 brpc 的简单使用
本文介绍了使用brpc框架开发RPC服务的基本流程。服务端开发需继承EchoService基类并重写Echo方法处理请求,通过Server类启动服务;客户端通过Channel与服务器交互,使用Stub类发起请求。文章详细说明了服务端处理请求时的参数使用、done回调机制,以及服务启动的四步流程,同时介绍了客户端创建Channel、发送请求的基本步骤,为brpc框架的入门开发提供了实用指导。
2025-07-12 09:57:40
455
原创 brpc 介绍与安装
本文介绍了C++编写的工业级RPC框架brpc,它广泛应用于高性能系统。brpc通过接口调用实现客户端与服务端通信,简化网络编程。安装步骤包括:先安装git、g++等依赖库,再通过git克隆brpc源码,执行cmake构建和make安装。若出错可能因缺失依赖库。全文简要说明了brpc的作用原理和安装方法。
2025-07-12 08:50:15
175
原创 etcd-cpp-apiv3 二次封装
本文介绍了基于etcd的客户端接口封装,主要包括以下内容: 核心接口类: Value类:存储键值对数据 Event类:记录键值对变化事件 Response类:服务器响应 KeepAlive类:租约保活机制 Client类:客户端操作接口 Watcher类:键值对监控 二次封装: Register类:封装Client和KeepAlive,实现服务注册和自动续约 Discover类:封装Client和Watcher,实现服务发现和变更通知 功能特点: 通过租约机制实现服务自动过期 支持服务注册、发现和监控 提供
2025-07-07 15:36:15
402
原创 Ubuntu 安装 etcd 与 etcd-cpp-apiv3
摘要:本文介绍了etcd的安装配置和使用方法。首先通过apt安装etcd-server和etcd-client,然后在/etc/default/etcd中配置节点名称、数据目录、监听URL等参数。启动etcd服务后,使用etcdctl存储键值对,若报错需设置ETCDCTL_API环境变量。最后详细说明了etcd-cpp-apiv3的安装步骤,包括依赖库安装、源码编译和安装。全文提供了从部署到客户端开发的完整流程说明。
2025-07-05 19:17:59
337
原创 spdlog 项目介绍与二次封装
摘要:本文介绍了对C++开源日志库spdlog的二次封装方案。spdlog提供了5个日志等级(trace至critical)和两种日志输出方式(同步/异步)。通过工厂模式创建日志对象,封装后提供了init_logger()初始化接口,可切换调试模式(同步输出trace级以上日志)和发布模式(异步输出指定等级日志)。封装还定义了LOG_DEBUG等宏,自动附加文件名和行号信息,并设置了默认日志格式(时间、日志名、等级、内容)。使用时需链接spdlog和fmt库。该封装简化了spdlog的使用,同时保留了其核心
2025-07-05 12:38:57
1093
原创 gtest 库的安装和使用
GoogleTest是谷歌开源的C++单元测试框架,用于验证程序的正确性。安装可通过sudo apt-get install libgtest-dev完成。使用GoogleTest时,通过TEST宏定义测试用例,第一个参数为测试套件名称,第二个参数为测试样例名称。测试框架通过testing::InitGoogleTest初始化,并通过RUN_ALL_TESTS执行所有测试。例如,测试一个计算器类的加法、减法、乘法和除法功能,可以分别编写四个TEST宏,使用ASSERT_EQ断言验证结果。最后,在main函数
2025-05-19 19:24:15
500
1
原创 gflags 安装及使用
gflags是Google开发的一个C++库,用于处理命令行参数。通过包含头文件#include <gflags/gflags.h>,开发者可以使用宏定义命令行参数,如DEFINE_bool、DEFINE_int32等,分别用于定义布尔、整数等类型的参数。定义后,使用google::ParseCommandLineFlags函数解析命令行参数。在代码中使用这些参数时,需加上FLAGS_前缀。gflags还支持通过命令行或配置文件设置参数,如./test --reuse_addr=false或./
2025-05-16 19:20:09
835
1
原创 C++的 I/O 流
我们重点要掌握的是:输入输出流定义的全局对象 cout cin 等, 还有文件输入输出流,熟悉文件输入输出流相关接口。
2025-02-05 16:55:34
1123
1
原创 C++11(中)
类新增成员函数, default, delete, 可变模板参数, STL容器的 emplace_back 系列, lambda表达式, function 包装器, std::bind
2025-01-31 19:31:22
892
原创 C++11(上)
列表初始化 {}。 initializer_list 。auto 。nullptr 。左值与右值 。右值为什么可以提高效率 。模板中的万能引用 。属性退化。 完美转发 std::forward<T>()。
2025-01-23 18:11:10
1317
原创 详解常见的寄存器和中断的概念以及CPU的状态
数据寄存器(DR)用来暂时存放CPU执行指令是用的操作数,运算结果, 中间结果地址寄存器(AR)用来存放中某个数据或指令的地址条件码寄存器(CCR)其标志位由CPU硬件设置,例如,一次算数运算可能导致CCR被设置为正, 负, 零, 溢出程序计数器(PC)存放下一周期被执行指令的指令寄存器(IR)存放待执行的指令程序状态字寄存器(PSW)PSW的各个位代表系统中当前各种不同的状态与信息,例如CPU的优先级,用户态, 核心态等中断现场保护寄存器。
2024-12-19 18:54:20
763
1
原创 操作系统的基本认识
这个词可能或多或少听说过,比如。这些其实都是工程师们经过实践后的产物。而这六个字就是操作系统的抽象化,更准确的说,是很理论化的东西。举一个不是很恰当的例子,和,马哲就是一种比较抽象的理论,而中国特色社会主义是马哲实践后的产物。所以这里要给大家避个坑——如果要学操作系统相关的知识,千万不要盯着操作系统原理去学,一定要从一款具体的操作系统切入(比如Linux)。操作系统原理好比计算机里的哲学,真的很抽象。计算机的硬件(键盘,CPU,显示器,磁盘,内存…)只是冷冰冰的硬件,而操作系统就是硬件的。
2024-12-14 20:07:00
823
2
原创 宽度优先搜索(BFS)思想总结以及做题技巧
上文阐述BFS的两个应用场景,这里我们把BFS算法的模板总结一下,下面是伪代码的形式总结模板//模板一//创建vis数组来标记数组中的元素是否被遍历过,0否1是,也可以用bool表示,m和n表示数组的长和宽//创建队列//进行宽搜//获取队头元素q.pop();//删除队列中的队头元素(...) //如果是树的话,这里获取孩子节点,如果是二维数组的话,就遍历一下周围if(没有越界 && 没有被遍历过 && 符合某种性质) {q.push(...) //入队列//模板二。
2024-12-02 08:16:37
835
2
原创 归并排序思想以及做题技巧总结
这一条件,可以用归并排序的过程来求解,但我们还要知道某个数的原始下标才可以,我们可以用一个index数组(数组初始化为 0, 1, 2, 3 ......)和nums数组绑定——nums数组中的数据怎么挪动,index数组中的数据就怎么挪动,这样我们可以通过index数组找到某个数的原始下标。我们把数组分成左右两个区间,先去左区间找出所有逆序对,再去右区间找出所有逆序对,再一左一右区间找剩余的逆序对。对于归并排序而言,我们只需探讨一左一右区间即可,因为下一层的一左一右区间是上一层的左区间或右区间。
2024-11-27 10:48:50
888
2
原创 快速选择算法解决 top K 问题
top K 问题一般是用堆解决的,时间复杂度为,而快速选择算法是基于快排的思想,时间复杂度逼近。下面,我们用快速选择算法解决一道 top K 的力扣题。只要在数组划分三段的思想上分类讨论,即可实现快速选择算法。
2024-11-24 16:11:29
528
1
原创 字符串相关题解
这道题更像一道语法题,考察对容器的掌握情况。如果按题目要求去模拟,不仅要分析每个字符串,还要判断其他字符串是否是自己的异位词,时间复杂度会很高,代码实现也会很麻烦。如果两个字符串是异位词,那么这两个字符串排好顺序后是一样的,那么我们可以用一张哈希表映射,k值为排序后的字符串,v值为异位词数组。那么遍历完源字符串数组后,哈希表中所有的v值就是结果N个字符,排序会消耗O(N⋅log(N)) 时间。
2024-11-16 13:53:16
502
原创 一文搞懂链表相关算法
为了防止cur找不到下一个节点,要提前用next保存起来,cur遍历到的节点都会放到newNode的后面,当cur遍历完整个链表后,newNode后面就是逆序后的链表。用快慢双指针算法。慢指针 slow 每次移动一个节点,快指针 fast 每次移动两个节点,slow 和 fast 都初始化(指向)为链表的头节点, 算法如下
2024-11-13 17:08:46
1208
2
原创 【力扣刷题】【滑动窗口算法】水果成篮
2.判断哈希表中的果树种类,如果种类个数为2,更新结果(区间的长度区较大值),如果种类的个数大于2,一直出窗口更新哈希表。用哈希表记录一个区间内果树的种类和对应的数量。当果树的数量在哈希表中为0的时候,就把该果树从哈希表中移除。1.区间相当于窗口,先入窗口,更新哈希表。那区间要怎么维护呢?
2024-11-06 10:52:05
242
2
原创 一文彻底搞懂二分算法的细节
非朴素二分是在朴素二分的思想上进行泛化,判断一道题是否需要二分算法不在是“数组是否查找区间左端点循环条件:left < right下标更新:if (...) left = mid + 1;中点值mid:left + (right - left) / 2查找区间左端点循环条件:left < right下标更新:if (...) left = mid;中点值mid:left + (right - left + 1) / 2模板的思想总结当下标更新为if (...) left = mid + 1;
2024-11-06 10:50:03
1157
2
原创 【力扣刷题】【滑动窗口算法】最大连续1的个数 III
这题读起来有些抽象,它让找数组中连续 1 的最大个数,但连续的 1 中又可以有最多 k 个 0。乍一看没啥思路,其实这这题目可以换一种问法——在子数组中包含 k 个 0 的子数组的最大长度是多少?检查 0 的个数是否超标: 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正常;那么我们只需在数组中维护一段区间,当区间的0的个数等于 k 时,我们就更新结果。程序到这⾥,说明窗⼝内元素是符合要求的,更新结果;right++ ,处理下⼀个元素;让当前元素进⼊窗⼝,顺便统计到哈希表中;
2024-11-05 20:46:52
294
1
原创 【力扣刷题】【滑动窗口算法】无重复字符的最长字串
空间复杂度上我们可以用一个哈希表,把空间复杂度降为O(1)。哈希表中存储某个区间字符和字符出现的次数的映射,但我们不必真的定义一个std::unordered_map。暴力解法是用两层循环列举出所有可能,并用O(N)的空间复杂度存储临时的字符来判断某个区间是否重复了。如果这个字符出现的频次超过 1 ,说明窗⼝内有重复元素,那么就从左侧开始划出窗⼝,如果没有超过 1 ,说明当前窗⼝没有重复元素,可以直接更新结果。直到 ch 这个元素的频次变为 1 ,然后再更新结果。
2024-11-02 15:33:07
298
1
原创 【力扣刷题】【滑动窗口算法】长度最小的子数组
上图中,灰色的区间已经是符合条件的区间了,此时黑色指针向右移动一格,如果是暴力算法,红色指针应该重置到黑色指针的位置,然后向右遍历。我们来讨论一下,红色指针有必要重置吗?题目里说数组里的都是正整数,当区间里已经符合条件了,我们还需要把最右边的指针重置到左边吗。2.灰色区间不符合条件,红色指针被重置后遍历,由于整个区间都是正整数,灰色区间的大小只会增加。1.灰色区间依旧符合条件,红色指针被重置然后遍历,依旧是当前的灰色区间。用两个指针,两层循环,列举出所有的结果,把每次符合的最优结果更新到临时变量里。
2024-11-02 14:51:02
442
1
原创 muduo库TcpConnection类源码解析——链接管理
enum StateE { kDisconnected, //断开连接状态kConnecting, //尝试建立连接的状态kConnected, //成功建立连接的状态kDisconnecting //正在断开连接的状态//把一个链接挂接到EventLoop上进行事件监控//链接的名字//链接的状态 // FIXME: use atomic variable//为true表示链接正在进行读事件监控//IP地址的简单封装//新建链接的回调//消息到来的回调//低水位线回调。
2024-10-27 13:45:06
1288
9
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅