- 博客(46)
- 收藏
- 关注
原创 Spring事务和事务传播机制
使用@Autowired直接注入事务管理器和,无需写构造方法。简洁易用,自动管理事务开启和提交。更灵活,可手动控制事务的提交和回滚。都可动态设置事务的隔离级别和传播行为。使用方式特点简洁、易用,事务模板负责开启和提交事务,适合简单逻辑灵活、可动态控制事务属性,适合复杂逻辑或动态事务需求声明式事务最常用,在 Service 层添加异常控制事务回滚默认只回滚 RuntimeException / Error可回滚任意异常捕获异常会导致事务提交 → 可用回滚隔离级别。
2025-08-19 18:41:49
803
原创 Spring AOP 和 Spring 拦截器
拦截器(Interceptor)是 Spring MVC 提供的核心功能之一,主要作用是在请求到达 Controller 前后进行拦截和处理。实现@Slf4j@Component@Overridelog.info("preHandle - 目标方法执行前");// 返回 true 表示放行,false 表示拦截@Overridelog.info("postHandle - 目标方法执行后");@Overridelog.info("afterCompletion - 视图渲染完成后");
2025-08-19 16:56:47
1185
原创 Spring Boot + MyBatis
使用@Mapper注解标记 Mapper 接口,简化开发流程。注解方式定义 SQL,免去 XML 配置,开发更快捷。通过@Options实现主键自动回写,方便获取插入记录的 ID。业务层封装 Mapper 操作,易于扩展。控制层处理 HTTP 请求,结合日志打印,便于调试和维护。XML 文件方式更适合复杂的 SQL 管理和动态 SQL通过配置扫描 XML 文件更灵活,结构清晰XML 中namespace和接口必须严格对应SQL 语句写法标准,可复用性好,便于维护。
2025-08-13 11:57:49
932
原创 Spring Boot 配置文件、日志
Spring Boot 支持和建议在一个项目中统一使用一种格式简单值用@Value,复杂对象/集合用yml对缩进非常敏感,注意空格好,我帮你结合你上传的《Spring Boot 日志》PDF内容,整理一篇Spring Boot 日志入门使用教程,保留核心知识、加上一些实践示例,让你可以直接上手。logging:pattern:%d:日期时间%c:类名%M:方法名%L:行号%thread:线程名%m:日志内容%n:换行符。
2025-08-12 12:09:49
821
原创 Spring 依赖注入与 Bean 管理详解(含自动装配与多 Bean 冲突解决)
使用标注数据访问类,@Service标注业务逻辑类。通过构造器注入(带@Autowired)实现依赖自动装配,推荐这种方式。Spring Boot 启动时自动扫描组件并管理生命周期。→→→ 输出用户信息。构造函数打印日志,方便观察 Bean 创建过程。@Bean允许定义多个实例和自定义名称,方便注入。通过initMethod和管理 Bean 生命周期。自定义构造打印帮助观察 Bean 实例化。当然!我帮你把“Spring 自动装配:什么时候根据 Bean 名称匹配?
2025-08-11 11:54:08
1033
1
原创 IoC(控制反转)与 DI(依赖注入),以及 Spring 注解的区别和用法
强调“反转控制权” —— 从程序主动管理依赖,变成容器来管理。:把依赖以参数/属性/构造器的方式注入到类中,是 IoC 的一种具体实现。标注普通组件或工具类。Spring 会自动注册为 Bean。(IoC 是原则,DI 是实现手段之一)。处理 HTTP 请求,负责转发或返回数据。标注业务逻辑类,方便语义分层和 AOP。标注数据访问类,自动转换数据库异常。,负责注册第三方或自定义 Bean。下面一一说明并给出简单示例。
2025-08-11 10:37:52
841
原创 Spring Boot 注解详解:@RequestMapping 的多种用法
在 pom.xml 中添加 Spring Boot Web 依赖。属性限定请求参数(访问时必须带name参数)。属性可以限定 HTTP 请求类型。支持多个 URL 映射。
2025-08-10 17:08:41
512
原创 Java 线程
你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
2025-06-29 16:42:48
796
原创 Java 中通信接口
你这个程序使用的是UDP 协议:用于发送和接收数据包(Socket 实例):用于封装发送或接收的数据内容JavaSocket:表示客户端或服务端通信时的“套接字”:服务端专用,用于监听客户端连接请求。
2025-06-29 16:42:24
869
原创 操作系统中的IO多路复用
内核提供的一种事件通知机制,用于实现高性能的I/O多路复用。允许同时监视多个文件描述符,可以在这些文件描述符中的任何一个上等待数据的到达,而不需要为每个文件描述符创建一个单独的线程或进程来处理。可以在一组文件描述符上进行非阻塞的等待,当其中任何一个文件描述符准备好进行I/O操作时,函数返回,并告知哪些文件描述符已经就绪。是事件驱动的,当文件描述符上发生对应的事件时,内核会将该事件通知给应用程序,从而实现了异步的。只会通知活跃的事件,而不是遍历所有注册的文件描述符,因此在有大量非活跃文件描述符的情况下,
2024-04-20 18:10:24
1283
原创 网络编程中的序列化、反序列化与协议
在网络编程中,序列化和反序列化与协议密切相关,它们共同构成了数据在网络中传输的基础。本文将详细介绍序列化、反序列化以及它们与协议之间的关系,以及它们在网络通信中的应用。
2024-03-25 04:26:12
1033
原创 mysql 表的约束
外键是一种表的字段,它指向另一个表中的主键或唯一键,从而建立了两个表之间的关系。通常,外键约束主要定义在从表上,从表中的外键列的数据必须在主表的主键列或唯一键列中存在,或者允许为空。
2024-03-14 18:41:12
1216
1
原创 网络编程 TCP/UDP通信
作为程序的入口,从命令行参数获取服务器的端口号,创建TCP服务器套接字,并通过多线程实现与多个客户端的并发通信。: 连接成功后,进入另一个循环,用户可以输入待发送的数据,程序将数据发送到服务器,并等待服务器的回复。: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的IP地址和端口号。: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的端口号。: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建。: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建。
2024-02-24 04:34:14
1386
原创 网络编程基础
这个字段表示了套接字地址的类型,以便在处理套接字地址时正确地解释其余的结构体字段。在传输过程中,不同协议层对数据包有不同的称谓,如在传输层称为“段”、在网络层称为“数据报”、在链路层称为“帧”。IPv6是IP协议的新版本,为网络提供更多的地址空间。OSI七层模型为网络协议提供了一种清晰的框架,将网络分为七个层次,每个层次负责特定的功能。字段表示地址的协议族,通常是 AF_INET(IPv4)或 AF_UNIX(UNIX 域套接字)。该结构体在套接字编程中扮演着重要的角色,用于指定网络通信的终端地址。
2024-02-23 07:24:02
1632
原创 Linux POSIX信号量 线程池
POSIX信号量是一种用于同步和互斥操作的机制,属于标准的一部分。这一标准定义了操作系统应该为应用程序提供的接口,而POSIX信号量是在多线程和多进程环境下实现同步的一种方式。信号量本质上是一个计数器,用于描述临界资源的数量。在多线程或多进程的情况下,当多个执行单元(线程或进程)需要访问共享资源时,使用信号量可以有效地协调它们的行为,避免竞争条件和提高程序的可靠性。
2024-02-16 19:04:26
1066
1
原创 Linux线程 分离和同步与互斥 条件变量
线程分离是指线程在结束时,操作系统会自动回收其资源,而无需其他线程显式地等待它的结束或调用pthread_join函数。这种机制允许主线程不必关心子线程的状态,从而提高程序的并发性和可维护性。
2024-02-09 07:11:41
3050
原创 Linux 线程与pthread库
在Linux系统中,线程控制是多任务编程的核心,而POSIX线程库(pthread库)则是应用层的原生线程库,为开发者提供了丰富的线程控制功能。
2024-02-05 16:14:36
2552
原创 Linux 线程概念
线程是程序执行的最小单位,是进程内的独立执行流。一个进程可以包含多个线程,它们共享大部分资源,包括地址空间、文件和其他系统资源。线程的特点包括最小执行单元、资源共享、轻量级等。在多线程中,线程间可以并发执行,提高程序的效率和响应性。想象你是一名大厨,整个厨房是一个进程。任务如炒菜、烧水,代表在进程内部同时执行的不同任务,如果只有一个炉灶时(单线程),你只能一个一个地做事。如果有多个炉灶时(多线程),你可以同时炒菜、烧水,提高效率。线程就像是并行执行厨房任务,共享厨房资源,让整个烹饪过程更高效。
2024-02-03 05:35:40
1138
原创 信号阻塞与捕捉
信号处理函数执行时,当前信号会被加入进程的信号屏蔽字,防止同类信号再次中断处理。如果需要屏蔽其他信号,可以使用 sa_mask 字段,在处理结束后同样会自动还原。是一个强制终止信号,所以在正常情况下应该避免将其发送给进程,以防止可能导致数据损坏或其他不良后果。:一个信号集,用于指定在执行信号处理函数时需要被屏蔽的信号。进程可以通过修改信号屏蔽集来控制屏蔽和解除屏蔽的信号。:从当前的信号屏蔽字中解除 set 中的信号。中的信号会被阻塞,防止它们干扰当前信号的处理。:将当前的信号屏蔽字设置为 set 中的值。
2024-01-31 21:44:56
1003
原创 Linux 信号的产生与处理
系统定义了一系列信号,分为普通和实时信号,每个信号都有编号和宏定义名称。1~31为普通信号,34~64为实时信号。使用 kill -l 命令查看什么是捕捉信号?捕捉信号意味着进程在接收到信号时将执行用户自定义的信号处理函数。如何捕捉信号?// 信号处理函数 - 捕捉信号并执行默认处理动作// 捕捉 SIGINT 信号并设置自定义处理函数pause();// 暂停进程,等待信号发生return 0;在这个例子中,将SIGINT 信号的处理方式设置为custom_handler 函数。
2024-01-29 17:15:20
915
原创 Linux详解共享内存
什么是共享内存?共享内存是操作系统中的一块内存区域,用于多个进程之间直接访问和共享数据。通过获取内存地址,进程可以实现数据的读写操作。共享内存优点适用范围广:可用于父子进程和非父子进程通信。快速访问:直接访问内存,速度相对较快,无需通过文件系统。共享内存缺点不支持阻塞等待:无内建阻塞机制,读写端可以同时访问内存。缺乏访问控制:无法主动停止读写,需要额外的同步机制。
2024-01-27 05:09:06
1459
原创 匿名管道和命名管道
进程间通信是多任务操作系统中不同进程之间进行信息传递的一种机制。它的目的包括数据传输、资源共享、通知事件和进程控制等。管道是进程间通信的一种机制,用于在操作系统中实现不同进程之间的数据传递。它通常被用于具有亲缘关系的父子进程之间。管道在创建时会建立一个缓冲区,用于在进程之间传递数据。这个缓冲区实际上是一个环形队列,允许数据在进程之间实时传递。管道分为两种主要类型:匿名管道和命名管道匿名管道创建方式:pipe()用途:主要用于具有亲缘关系的父子进程通信。生命周期:随创建进程结束而结束命名管道。
2024-01-24 18:42:11
978
原创 制作与使用动态库与静态库
一个库主要包含一批头文件和一个或多个源文件。头文件包含函数声明,源文件包含函数实现。动态库: 在Linux下是后缀为.so文件,在Windows下是后缀为.dll文件。多个程序可以共享使用动态库代码。静态库: 在Linux下是后缀为.a的文件,在Windows下是后缀为.lib的文件。
2024-01-21 19:07:52
1093
原创 Linux ext2文件系统 软链接和硬链接
概述: ext2是Linux内核默认采用的文件系统之一,是ext文件系统的第二个版本。它引入了许多改进,如更大的文件名、更大的文件系统和更高的性能。特性不支持日志功能: 与后续版本(如ext3和ext4)不同,ext2没有日志功能,这意味着在系统崩溃时可能需要较长时间来进行文件系统检查和修复。支持软链接和硬链接: ext2支持软链接(symbolic links)和硬链接(hard links),使文件之间的关系更加灵活。支持权限和属性: 类UNIX的权限模型得以保留,文件和目录具有权限、所有者、组等属性。
2024-01-19 17:44:05
957
原创 用户级缓冲区与内核级缓冲区
在 C 语言中,缓冲区(Buffer)是一个用于临时存储数据的区域,通常用于提高输入和输出的性能。由于进程复制,两个进程共享相同的用户级缓冲区,但它们各自有独立的内核级缓冲区。也是使用用户级缓冲区的函数,但由于是二进制写入,不受行缓冲的影响,数据存储在用户空间的缓冲区中,不会立即刷新。这涉及到缓冲区的刷新和进程复制的问题,导致输出在两个进程中交错和重复。都使用了用户级缓冲区,这表示它们将数据存储在用户空间的缓冲区中,而不是直接发送到内核空间。是系统调用,直接操作内核级缓冲区,将数据写入内核空间的缓冲区。
2023-12-30 16:41:32
1472
1
原创 文件操作和文件系统
操作系统通过管理进程的方式,将每个正在执行的进程抽象为 task_struct(PCB),然后通过链表等方式将这些结构体组织起来,以实现对进程的有序调度和管理。:改变数据流的方向,使得数据不再流向默认的设备,而是流向了我们指定的目标,即文件 “log.txt”。上述例子中,我们使用 open 打开(或创建)一个名为 example.txt 的文件,以只写方式打开,如果文件不存在则创建,权限设置为 0644。进程通过文件描述符来管理打开的文件,通过数组指针的方式组织了打开的文件的 file 结构体,
2023-12-28 19:29:41
891
1
原创 简易的自定义Shell实现
首先,让我们了解一下这个自定义Shell的主要功能和结构。基本的命令解析和执行内建命令支持(cd、export、echo)获取用户名、主机名和当前工作目录显示错误代码传递和显示。
2023-12-14 11:09:59
181
1
原创 Linux进程替换
Linux提供了六种exec开头的函数,统称为exec函数族。path:指定可执行文件的路径。arg:以可变参数形式传递命令行参数,以NULL结尾。argv:参数数组,以NULL结尾。file:指定可执行文件的名称,会在PATH环境变量指定的路径中搜索。envp:环境变量数组,以NULL结尾。返回值:如果执行成功,则不返回,否则返回-1,同时设置errno来指示错误的类型。例子// 在PATH=/bin的环境中执行ls命令// 如果execvpe执行失败return -1;
2023-12-10 19:47:02
113
1
原创 位图和布隆过滤器
在大规模数据处理中,常常需要快速判断某个元素是否属于某个集合。传统的数据结构如哈希表能够实现这个目标,但在存储空间和查询效率方面存在一些缺陷。布隆过滤器(Bloom Filter)应运而生,它通过巧妙的设计在占用较少空间的同时提供了高效的查询能力。
2023-12-10 12:40:07
124
1
原创 模拟实现unordered_map和unordered_set
用于从键值对或键中提取键的函数对象(即获取键的操作符函数),在unordered_map和unordered_set中分别为unordered_map和unordered_set的内部类。通过哈希表的基础结构,我们构建了 unordered_map 类,这是一个键-值对的哈希表。: 值的类型,在unordered_map中表示键值对中的值,在unordered_set中则没有对应的值。: 哈希函数,默认为hashfunc,如果键的类型不是整数或字符串,需要提供自定义的哈希函数。
2023-12-03 16:59:40
69
1
原创 Linux进程地址空间
在这个地址空间中,各个区域承担不同的责任,包括内核空间、用户空间的命令行参数和环境变量、栈、共享区、堆、未初始化数据、初始化数据以及正文代码。每个进程都认为它拥有整个虚拟地址空间,但实际上,通过操作系统的地址映射机制,它们对应不同的物理地址。: 虚拟地址空间使得进程管理和内存管理之间的关系解耦,每个进程可以拥有独立的虚拟地址空间,而对物理内存的使用则由操作系统负责。在父子进程中,打印的变量值是不同的,这表明父子进程中的变量确实是各自私有的一份,而不是同一个变量。,而不是真正的物理地址。
2023-11-30 14:34:59
74
原创 wait和waitpid
wait 函数的作用是使父进程一旦调用它就立即阻塞,然后由 wait 自动分析当前进程的子进程是否已经退出。如果找到已经变成僵尸的子进程,wait 会收集这个子进程的信息,彻底销毁它,并随即返回。因此,僵尸进程是指子进程已经退出,但其进程描述符仍然保留在系统中,等待父进程获取相关信息。相比于 wait 函数,waitpid 具有更灵活的特性,可以等待特定的子进程,而不仅仅是等待第一个终止的子进程。如果指定的子进程已经退出,父进程可以在之后的处理中回收子进程。父进程会一直等待,直到指定的子进程退出为止。
2023-11-17 16:27:25
83
1
原创 Linux进程状态和fork函数
具体来说,fork 调用会生成一个新的进程,这个进程是父进程的副本。这种状态通常发生在进程被调试时,调试器会暂停进程的执行以便用户可以检查和修改其状态。对于父进程,返回的是新创建子进程的PID,而对于子进程,返回的是0。当子进程退出时,其信息并不会立即释放,而是保留在PCB中,等待父进程读取。进程处于死亡状态表示它已经完全结束了,所有的资源都已经被释放,不再占用系统资源,死亡状态是非常短暂的。D状态保证了进程在休眠时仍然保持在内存中,以便在特定条件满足时能够及时唤醒,保证了任务的顺利执行。
2023-11-09 12:35:38
121
1
原创 C++虚表和动态绑定
在动态绑定中,关键的机制是虚函数和虚表。通过基类指针或引用指向派生类对象时,可以在运行时根据对象的实际类型调用相应的虚函数。每一个包含虚函数的类都拥有自己的虚表,这个虚表属于类而不是具体的对象。虚函数(Virtual Function)在C++中,通过在类中声明一个函数为virtual,可以将其定义为虚函数。虚表指针(Virtual Pointer)是一个指向虚函数表的指针,虚函数表是一个包含虚函数地址的数组。通过基类指针或引用指向派生类对象时,可以在运行时根据对象的实际类型调用相应的虚函数。
2023-11-04 11:14:01
100
1
原创 二叉搜索树的插入和删除操作
二叉搜索树是一棵具有以下性质的树:1.左子树上所有节点的值均小于其父节点的值。2.右子树上所有节点的值均大于其父节点的值。3.左右子树也分别为二叉搜索树。
2023-11-04 08:45:06
403
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅