自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 收藏
  • 关注

原创 this调用导致 @Transactional 事务失效原因以及解决方法

摘要:Spring的@Transactional注解基于AOP动态代理实现,要求通过代理对象调用才能生效。常见失效场景是类内部使用this调用本类事务方法(this指向原始对象而非代理)。解决方案:1)使用AopContext.currentProxy()获取代理对象调用(需开启@EnableAspectJAutoProxy(exposeProxy=true));2)将事务方法拆分到独立Service类中,通过注入调用。后者更推荐,避免直接操作代理对象。(149字)

2026-08-04 22:28:29 239

原创 ThreadLocal介绍

摘要: ThreadLocal实现线程数据隔离,核心原理是利用线程内部的ThreadLocalMap存储数据,以ThreadLocal实例为key。多线程共享同一个ThreadLocal对象时,数据因存储在不同线程的独立Map中而互不干扰。典型应用场景如Tomcat请求处理中的用户信息存储。注意事项包括:线程池场景需手动remove()防止脏数据、弱引用key无法完全避免内存泄漏、避免存储可变共享对象等。ThreadLocal类似独立办公室的储物柜,同一把钥匙(ThreadLocal实例)在不同线程(办公室

2026-08-03 15:11:13 301

原创 SpringBoot静态资源映射

Spring Boot 对 WebJars 的映射规则是:所有 /webjars/** 请求,都会去 classpath:/META-INF/resources/webjars/ 下(如下图)找资源。如果能成功打开 jQuery 的源码文件,说明 WebJars 映射规则生效 ——Spring Boot 自动找到了 classpath:/META-INF/resources/webjars/jquery/3.3.1/jquery.js 这个资源。如果按优先级从高到低,依次删除文件,即可验证所有的优先级。

2026-08-02 15:21:19 256

原创 10 Springboot的热部署

SpringBoot热部署功能通过spring-boot-devtools依赖实现,无需重启即可更新代码、配置和模板文件。添加依赖后,修改文件按Ctrl+F9(部分需加Fn)触发热重启,支持Java代码、配置文件和模板(需关闭模板缓存)。静态资源修改后浏览器刷新即可生效,显著提升开发效率。该功能适用于开发环境,需注意不同IDE的快捷键差异。

2026-08-02 15:18:41 245

原创 【redis实战】使用Redis实现图片验证码

本文介绍了基于Redis的验证码功能实现方案。通过对比数据库、Cookie和Session存储的缺点(性能低、不安全、分布式不兼容等),选用Redis作为验证码存储方案,因其高性能、自动过期和分布式友好等优势。技术实现上,使用SpecCaptcha生成验证码图片和文本,IdUtil生成UUID作为Redis键,并通过RedisTemplate设置120秒过期时间。接口返回统一格式的验证码数据(UUID、Base64图片和验证码文本),供前端展示和校验。核心代码展示了验证码生成、存储和返回的全流程,体现了安全

2026-08-02 15:14:39 604

原创 4 Docker 镜像安装与容器启动

本文介绍了Docker镜像安装与容器启动的两种方式,类比本地软件安装流程。方式1是通过Docker Hub在线搜索和拉取镜像(如MySQL),方式2是使用离线镜像包加载。重点讲解了容器启动命令dockerrun的参数配置,包括端口映射、环境变量设置和数据卷挂载等。文章还解释了容器与镜像的关系、Docker的网络隔离特性,以及如何通过端口映射解决多容器运行时的端口冲突问题。最后对比了容器与独立操作系统的异同,强调容器是轻量级的隔离运行环境。

2026-04-26 22:43:01 633

原创 3 安装docker

摘要:本文介绍了Docker的zip安装方法,主要步骤包括:1)将docker.zip文件放入/opt/docker目录并解压;2)通过docker info命令验证安装是否成功。相比yum安装,zip安装方式无需联网。安装过程可简化为三个关键步骤:解压安装包、赋予执行权限、运行安装脚本。docker info命令可用于查看Docker系统配置和运行状态,包括版本信息、资源统计等,是验证安装和排查问题的重要工具。安装成功后,通过查看版本信息即可确认安装完成。

2026-04-26 22:39:15 95

原创 微服务架构

,如果用硬编码 IP 的方式调用,新增 / 减少实例时要改代码(比如从 3 个扩到 4 个,就得手动加 IP),又麻烦又容易出错,只适合极小系统。图中的 “Nginx(流量网关)” 是一个集群(多台 Nginx 服务器组成),只对外暴露443端口(HTTPS 协议的默认端口)。API 网关会先接收前端的请求,然后通过 RPC 分别调用这三个微服务,拿到各自的数据后,剔除手机号、身份证号等敏感信息,再组装成一个统一的响应结果返回给前端。核心目的就是解决微服务集群(比如多实例的商品服务)的调用问题。

2026-04-25 17:36:49 893

原创 微服务架构——有关概念

目录2 微服务系统架构2.1 一些概念2.1.1 域名2.1.3 断点故障2.1.2 DNS服务器2.1.3 浏览器输入www.baidu.com的操作流程2.1.4 localhost和 127.0.0.1 的区别2.1.5 不同协议默认端口号2.1.6 网关2.1.7 集群2.1.8 QPS2.1.9 RPC2.1.10 VPN2.1.11 带宽2.1.12 网络通讯的五元组(七元组)2.1.13 有状态和无状态服务2.1.14 DNS 挟持

2026-04-25 17:35:11 404

原创 什么是微服务

本文系统梳理了Java Web开发技术演进历程。从早期基于Servlet的单体架构,到SSH/SSM框架时代的技术分层,最终演进为当前主流的微服务架构。重点分析了微服务架构的特点:将单体应用拆分为独立部署的小型服务单元,每个服务聚焦单一业务功能,通过轻量协议通信。文章对比了不同架构的优劣势,指出微服务具有松耦合、技术栈灵活、容错性强等优势,但也带来了分布式系统复杂性的挑战。技术发展从Servlet到SpringBoot/SpringCloud的演进,体现了Java生态对开发效率和系统可扩展性的持续优化。

2026-04-23 22:54:48 469

原创 快速Spring Cloud+ELK+AOP搭建一个简单的项目

本文介绍了使用SpringCloud+ELK+AOP搭建微服务项目的完整方案。项目包含生产者(8081端口)和消费者(8082端口)两个微服务,通过Feign实现远程调用。关键技术点包括: 日志收集:通过AOP切面拦截接口请求,使用Logback将日志发送到Logstash(4560端口) ELK环境:使用Docker搭建Elasticsearch存储日志,Kibana(5601端口)进行可视化展示 调用流程:浏览器请求→消费者AOP拦截→Feign调用生产者→返回结果→日志记录→ELK存储展示 配置细节:

2026-04-23 16:42:52 735

原创 7 MySQL事务

摘要:本文介绍了数据库事务的基本概念和操作方式。事务是数据库操作的执行单元,具有ACID特性(原子性、一致性、隔离性、持久性)。文中通过转账案例演示了MySQL事务的两种操作方式:命令方式(start transaction/commit/rollback)和设置自动提交方式(set autocommit=off)。同时讲解了JDBC中操作事务的Connection接口方法,以及事务隔离级别(Read uncommitted至Serializable)对脏读、不可重复读和幻读的影响。最后通过具体案例演示了不

2026-04-20 10:54:50 847

原创 6 sql注入漏洞

此时所有的 ' 都只是普通字符串里的引号,不再具备 “闭合字符串、拼接 SQL 逻辑” 的能力,数据库会把 1\'or\'1\'=\'1 当作完整的密码字符串去匹配,而不是 SQL 语法的一部分。SQL 注入产生原因是 SQL 语句的拼接,利用 SQL 关键字产生效果。SQL 注入产生原因是 SQL 语句的拼接,利用 SQL 关键字产生效果。这里把用户输入的 username 和 password 直接拼接到 SQL ,没任何过滤,就给了攻击者篡改 SQL 逻辑的机会。* 后台的程序拼接SQL语句。

2026-04-20 10:41:00 399

原创 网络爬虫登录场景与流程

本文摘要:网络爬虫登录流程主要分为四种场景:1)公开数据直接请求;2)账号密码登录(使用Selenium模拟);3)验证码登录(结合短信读取工具);4)图形验证码登录(需OCR识别)。通用流程包括发起请求、获取响应、解析数据、存储数据及反爬处理。不同场景需采用特定工具组合(如Requests、Selenium、OpenCV等)应对验证机制,最终获取有效会话进行数据爬取。

2026-04-09 22:44:10 2347

原创 计算机网络——网络模型和TCP

摘要:OSI七层模型(物理层至应用层)是理论性网络分层标准,TCP/IP四层模型(应用层至网络接口层)是其简化实现。TCP通过三次握手建立可靠连接,四次挥手安全断开,采用序列号、确认应答、超时重传等机制保证可靠传输。滑动窗口实现流量控制,匹配接收方处理能力。TIME_WAIT状态确保连接彻底关闭并防止旧数据干扰。TCP面向连接、可靠,UDP无连接、高效,两者适用于不同场景。HTTP短连接通常由服务器发起关闭,长连接则由任意方触发关闭条件时发起。

2026-04-09 22:41:57 657

原创 AI视觉概述

obsidian。

2026-04-06 21:46:00 514

原创 Linux命令

Linux常用命令速查指南: 进程管理:ps -ef/aux查看进程,top监控资源,kill -9终止进程 内存查看:free -h显示内存使用情况 文件查找:find按名称查找,grep按内容搜索 日志查看:tail -f实时跟踪,less分页浏览 端口查询:ss/netstat查看端口占用 权限管理:chmod修改权限,chown更改属主 记忆要点: 进程操作:ps查,top看,kill杀 文件检索:find找文件,grep搜内容 日志监控:tail实时,less分页 网络诊断:ss查端口 权限设置:

2026-04-06 21:21:55 242

原创 JVM——OOM异常

摘要:OOM(OutOfMemoryError)是JVM无法分配内存时抛出的致命错误,主要包括堆溢出、方法区溢出和直接内存溢出三种类型。堆溢出常见于内存泄漏或大对象分配失败;方法区溢出由类元数据过多引起;直接内存溢出则因堆外内存未及时释放。定位方法包括生成堆转储文件、分析内存快照和检查代码。解决方案涉及调整内存参数、修复内存泄漏、优化缓存设计、减少动态类生成等。关键是通过监控工具预警内存异常,并在代码层面规范资源管理。

2026-04-04 22:53:56 627

原创 JVM——线上问题定位

本文总结了线上问题排查的通用方法:对于接口报错/RT超时,可通过日志定位或使用SBA/ELK监控工具;CPU飙高时可用top+jstack命令或Arthas工具分析线程堆栈;死锁问题可通过jstack或Arthas的thread-b命令检测。文章还区分了有无运维时的不同处理流程,并详细介绍了各类问题的具体排查方案,包括日志分析、监控系统使用、线程状态检查等,为线上故障定位提供了系统化的解决思路。

2026-04-04 22:51:51 578

原创 nginx——方向代理和负载均衡

Nginx是一款高性能的Web服务器和反向代理工具,因其稳定性强、并发处理能力优异而广受企业青睐。其核心功能包括:1)反向代理,通过隐藏真实服务器IP保障服务安全;2)负载均衡,支持轮询、权重分配等策略,可自动剔除不可用节点;3)请求过滤,结合Lua脚本实现安全防护。配置主要通过nginx.conf文件实现,包含全局设置、事件模块、HTTP服务定义等部分,可通过upstream定义服务集群,location配置代理规则。在Docker部署时需挂载配置文件实现持久化,并通过端口映射对外提供服务。Nginx还支

2026-04-02 08:41:45 674

原创 JVM面试题——垃圾收集器

摘要 Java垃圾收集器主要包括Serial/SerialOld、ParNew、Parallel/ParallelOld、CMS、G1和ZGC等。Serial系列是最基础的单线程收集器,适合客户端场景;Parallel注重吞吐量,是JDK8默认收集器;CMS追求低停顿,但会产生内存碎片;G1采用Region分区设计,兼顾延迟和吞吐,是JDK9+默认收集器;ZGC则通过染色指针技术实现亚毫秒级停顿。选择策略需根据应用场景:客户端用Serial,后台计算用Parallel,响应敏感用CMS或G1,极致延迟用ZG

2026-04-02 08:34:33 520

原创 云服务上安装nginx

本文介绍了Nginx的两种安装方法:通过Docker的zip安装和源码编译安装。zip安装部分详细说明了使用docker-compose.yml配置Nginx容器并启动服务的步骤。源码安装部分涵盖了从系统更新、依赖安装到下载源码、编译安装的完整流程,包括配置检查、启动验证等关键步骤。特别提醒了与GitLab的80端口冲突问题,给出了停止GitLab服务或修改Nginx端口的解决方案。两种安装方法完成后均可通过浏览器访问验证是否安装成功。

2026-04-01 22:04:51 288

原创 JVM面试题——垃圾回收GC

本文对比了C/C++与Java的内存管理机制,重点分析了Java的垃圾回收原理。C/C++需手动管理内存,灵活但易出错;Java采用自动垃圾回收(GC),通过可达性分析算法判断对象存活状态,配合分代收集策略(新生代用复制算法,老年代用标记-清除/压缩算法)实现高效回收。详细解析了方法区回收条件、四种引用类型(强/软/弱/虚)的特性及应用场景,并指出不同JDK版本的默认GC组合。Java内存管理的核心优势在于自动化和安全性,但需权衡GC带来的STW停顿问题。

2026-04-01 21:57:54 718

原创 nginx——前置知识

本文摘要:文章系统介绍了计算机网络中的域名系统知识,包括主机名与域名的区别、DNS解析流程、域名分级结构等核心概念。重点讲解了本地hosts文件优先解析机制、InetAddress类的常用方法及其应用场景,并详细说明了搭建外网可访问环境的完整流程。通过对比分析和具体示例,清晰阐述了从内网到公网的域名解析原理及实现方式,为JavaWeb开发中的网络通信提供了基础理论支持。

2026-03-31 21:40:42 605

原创 JVM面试题——方法区、栈、堆

本文摘要: JVM内存结构分为堆、栈和方法区三大核心区域。堆是线程共享的,存储对象实例,采用分代设计(新生代Eden+Survivor、老年代);栈是线程私有的,通过栈帧存储方法执行上下文;方法区存储类元数据,JDK7前用永久代实现,JDK8+改用元空间。堆通过分代GC(MinorGC/MajorGC/FullGC)管理对象生命周期,参数-Xms/-Xmx控制堆大小。三者通过引用指针关联:栈存对象引用指向堆实例,堆存类元数据指针指向方法区。分代设计和参数优化可提升GC效率,避免OOM。

2026-03-31 21:32:29 969

原创 JVM面试题——类加载器

摘要:Java类加载器负责将.class文件加载到JVM内存,形成Class对象。主要分为引导类加载器(核心类库)、扩展类加载器(扩展功能)、应用类加载器(用户程序)和自定义类加载器。类加载过程包括加载、链接(验证、准备、解析)和初始化三个阶段。双亲委派模型通过层级委托机制确保核心类安全,防止篡改。自定义类加载器可通过重写loadClass()方法打破该模型,用于热部署等特殊场景。

2026-03-30 21:03:28 552

原创 JVM面试题——概述

Java虚拟机(JVM)核心机制解析 JVM作为Java程序执行的核心引擎,实现了"一次编译,到处运行"的跨平台特性。其工作流程包含:前端编译将.java源码转为.class字节码;运行时通过类加载器加载字节码,由执行引擎(解释器+JIT)转换为机器码执行。JVM内存模型包含线程共享的方法区和堆,以及线程私有的虚拟机栈、本地方法栈和程序计数器。JDK(开发环境)包含JRE(运行环境),而JRE又包含JVM(执行引擎)。执行引擎作为"翻译官",负责字节码到机器码的转换及

2026-03-30 20:59:14 490

原创 什么是JVM——餐厅类比

本文通过餐厅类比系统解析JVM工作原理:将JVM比作运行在操作系统"商场"中的独立餐厅,自主划分内存区域(堆/方法区/栈等)。核心模块包括:类加载器(收单归档员)、运行时数据区(场地规划)、执行引擎(调度领班)和本地接口(外援联络员)。重点阐释了栈帧结构(厨师托盘四分区)和执行引擎的翻译调度机制,强调JVM内存管理独立于操作系统,程序计数器是JVM自建的线程进度标记。完整流程展示了从类加载到GC回收的全链路运作,最终归结为JVM统筹内存与指令、CPU执行机器码的核心协作模式。

2026-03-28 22:46:14 537

原创 MybatisPlus多数据源和MybatisX插件

本文介绍了MyBatis-Plus多数据源配置及MyBatisX插件的使用。主要内容包括:1)多数据源场景模拟,通过创建两个数据库(mybatis_plus和mybatis_plus_1)演示纯粹多库模式;2)详细说明代码实现步骤,包括数据库创建、依赖导入、yml配置及注解指定数据源;3)测试用例展示如何通过不同数据源获取用户和商品数据;4)简要介绍MyBatisX插件功能,说明其在处理复杂SQL和多表联查时的优势。文章提供了从配置到测试的完整流程,适用于多种数据源场景的实现。

2026-03-28 22:42:23 183

原创 MybatisPlus——代码生成器

MyBatis-Plus代码生成器可以快速生成基于数据库表的全套Java代码,包括实体类、Mapper接口、Service层和Controller层。通过FastAutoGenerator配置数据源、包路径和表名等参数,能够自动生成包含@TableName注解的实体类、继承BaseMapper的Mapper接口、实现IService的服务层以及基础控制器。生成器支持自定义输出目录、表前缀过滤,并提供了Freemarker模板引擎选项。该工具显著提升了开发效率,使开发者只需关注业务逻辑实现,大幅减少了重复的C

2026-03-27 22:41:29 149

原创 MybatisPlus——通用枚举

摘要:本文介绍了MyBatis-Plus通用枚举的实现方法。通过@EnumValue注解标记枚举属性与数据库字段的映射关系,实现自动类型转换(如SexEnum.MALE↔1)。具体步骤包括:1)创建带@EnumValue的枚举类;2)配置枚举扫描路径;3)在实体类中使用枚举字段。该方法提高了代码可读性(SexEnum.MALE比1更直观)和安全性(避免非法值),同时减少了手动转换的工作量。测试案例验证了枚举值能正确存入数据库并自动转换。

2026-03-27 22:37:27 439

原创 MybatisPlus条件构造器(下)

本文介绍了MyBatis-Plus中QueryWrapper和LambdaQueryWrapper的使用方法。主要内容包括:1. 基础条件构建(like、between、isNotNull等)及多条件AND/OR连接;2. 排序、删除、子查询等操作实现;3. 条件优先级控制,通过and/or的lambda表达式实现条件分组;4. 可选条件处理,使用condition参数简化代码;5. LambdaQueryWrapper通过方法引用避免字段名拼写错误;6. UpdateWrapper实现更新操作。重点说明了

2026-03-26 22:53:43 529

原创 MybatisPlus条件构造器(上)

MyBatis-Plus条件构造器提供了灵活的SQL构建方式,主要包括QueryWrapper(查询/删除)和UpdateWrapper(更新)两大类。Wrapper是顶级抽象类,其子类支持链式调用和条件拼接。QueryWrapper提供eq、like、in等条件方法,支持动态条件过滤;UpdateWrapper额外支持set方法设置更新值。Lambda版本(LambdaQueryWrapper/LambdaUpdateWrapper)通过方法引用避免硬编码字段名。构造器支持AND/OR逻辑分组、条件参数动

2026-03-26 22:48:26 345

原创 MybatisPlus常用注解(下)

摘要:本文介绍了MyBatis-Plus中属性名与字段名的映射规则及两种处理方式(驼峰转下划线自动转换和@TableField注解)。详细说明了逻辑删除的实现方法,包括注解配置和状态值自定义。重点讲解了字段自动填充功能,通过@TableField的fill属性和自定义MetaObjectHandler实现创建时间、更新时间等字段的自动填充。同时对比了代码层自动填充与数据库时间戳规则的优先级关系,指出代码层配置会覆盖数据库规则。这些功能可有效减少冗余代码,提升开发效率。

2026-03-25 10:04:55 702

原创 MybatisPlus常用注解(上)

MyBatis-Plus默认规则与主键策略总结 MyBatis-Plus默认将实体类名作为表名,主键列默认为"id"并使用雪花算法生成ID。若表名与类名不一致,可通过@TableName注解或全局配置table-prefix解决。主键不一致时需使用@TableId(value="字段名")指定,其type属性支持ASSIGN_ID(默认雪花算法)和AUTO(数据库自增)等策略。全局配置可在yml文件中设置主键策略和表前缀。针对大数据场景,介绍了水平分表(取模/分段)和

2026-03-25 10:01:25 352

原创 IService——查询(下)

本文介绍了MyBatis-Plus框架中的BaseMapper获取、实体类获取以及链式查询和更新操作。主要内容包括:1)通过getBaseMapper()获取Mapper接口实例,使用getEntityClass()获取实体类信息;2)链式查询原理及两种实现方式(普通字符串方式和Lambda方法引用方式),通过query()和lambdaQuery()方法实现条件链式拼接;3)链式更新操作通过update()和lambdaUpdate()方法实现条件更新;4)saveOrUpdate方法实现条件更新或新增操

2026-03-24 23:02:54 378

原创 IService——查询(上)

本文介绍了MyBatis-Plus中常用的查询方法,主要包括: 单条查询:通过id查询(getById)、条件查询(getOne)及结果转换(getObj/getMap) 批量查询:通过id列表(listByIds)或字段条件(listByMap)批量获取数据 列表查询:无条件查询(list)或带条件查询(list) 分页查询:支持实体类(page)和Map(pageMaps)两种返回格式 特殊查询:只返回第一列数据(listObjs)及其类型转换 所有方法均支持条件构造器(Wrapper)进行灵活查询,并

2026-03-24 22:54:27 515

原创 IService——修改

本文介绍了MyBatis-Plus中常用的几种数据更新方式:1. 根据ID修改(updateById),通过实体对象指定更新字段;2. 根据条件修改,包括使用UpdateWrapper设置更新内容和条件(update),或结合实体类与Wrapper(update(entity, wrapper));3. 批量更新方法(updateBatchById),支持按ID集合或分批次更新;4. 修改插入(saveOrUpdate),根据主键存在与否自动选择更新或插入操作。每种方法均提供了对应的代码示例,展示了不同场景

2026-03-23 09:58:11 214

原创 IService——删除

本文摘要:MyBatis-Plus提供了多种删除数据的方式,包括根据ID删除、根据条件删除和批量删除。根据ID删除包括普通删除、是否填充删除和实体ID删除;根据条件删除支持columnMap和queryWrapper两种方式;批量删除分为带IN语句和不带IN语句两种形式,后者通常通过循环逐个删除实现。此外,还支持按批次大小删除和是否填充的配置选项,其中填充功能可触发自动填充逻辑,适用于逻辑删除等场景。所有批量删除操作默认由Spring事务管理保证原子性。

2026-03-23 09:44:19 986

原创 IService——使用和新增

摘要:MyBatisPlus的IService接口封装了通用的CRUD操作,提供save、saveBatch等方法实现单条/批量数据插入和修改。通过泛型设计适配不同实体类,方法命名遵循get/remove/list/page等规范。ServiceImpl实现类持有Mapper实例并实现复杂逻辑,开发者只需继承即可复用基础CRUD功能。批量操作支持指定批次大小,避免SQL过长问题。saveOrUpdateBatch方法自动判断执行插入或更新操作,简化开发流程。

2026-03-19 16:48:17 383

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除