- 博客(168)
- 收藏
- 关注
原创 Spring 最核心的注解@Bean本质
Spring最核心的注解@Bean本质是:方法本身不是Bean,方法执行后返回的对象才是Bean。Spring会把这个返回的对象放进容器管理。@Bean标注的方法相当于生产Bean的工厂,返回值才是真正的Bean。与其他类注解(如@Service)不同,@Bean适用于需要手动创建和配置第三方类的场景。使用时只需在其他类中通过@Autowired注入即可。核心要点:方法被Spring自动调用,返回值成为Bean,方法名即Bean名称。
2026-03-26 19:12:32
265
原创 Spring Boot约定大于配置(配置MQ消息转换器的具体实例)
Spring Boot约定大于配置原理及MQ自动转换示例 摘要:Spring Boot通过"约定大于配置"机制简化开发,只需按规范定义Bean即可自动完成复杂配置。以RabbitMQ消息转换为例,当开发者定义MessageConverter Bean时,Spring Boot会自动检测并将其注入RabbitTemplate和消息监听器。整个过程基于@ConditionalOnMissingBean规则:若未定义转换器则使用默认实现,若定义则覆盖默认配置。这种机制使得开发者只需关注核心业务
2026-03-26 17:11:13
470
原创 Knife4j如何访问接口文档页面
摘要:Knife4j是基于Swagger的增强型接口文档工具,提供更友好的界面和调试功能。查看文档需访问doc.html(3.x+版本)或swagger-ui.html(2.x版本)页面,包含接口列表、详细说明和在线调试。常见问题包括404错误、页面空白或接口未显示,需检查配置、依赖和路径设置。Knife4j支持Spring Boot项目,版本需与框架匹配。
2026-03-06 16:54:47
384
原创 jdk版本不一致报错
摘要:该报错表明JDK版本与项目依赖的Lombok或Maven编译插件版本不兼容,导致javac语法树类字段缺失。主要解决方案包括:1)升级Lombok至1.18.30+版本;2)更新Maven编译插件至3.11.0+;3)确保项目JDK、IDE设置与pom.xml配置一致。典型表现为低版本工具链无法识别高版本JDK的内部类结构,通过版本对齐和清理缓存可解决该编译错误。(149字)
2026-03-01 22:21:26
399
原创 什么场景需要用@Caching
摘要(149字): @Caching与@CacheEvict的核心区别在于处理复杂度。单一缓存清除时直接使用@CacheEvict更简洁(如清除jz_cache::STATUS_REGION)。@Caching的真正价值体现在多操作场景: 同时清除多个Key(如地区状态和活跃列表) 混合操作(如清除旧缓存+新增数据) 跨命名空间操作(如同时更新业务和统计缓存) 单操作场景嵌套@Caching会导致冗余,而多操作时必须用它组合注解。简言之:单操作直写,多操作容器装。
2026-02-28 21:44:23
366
原创 Redis为什么要把 value(缓存命名空间)和 key(缓存标识)分开定义
Spring Cache将value(命名空间)和key(标识)分开设计,体现分层管理理念。value负责业务分组(如地区/订单缓存),key定位具体数据,二者组合形成完整Redis Key(如jz_cache::ACTIVE_REGIONS)。这种设计优势在于: 支持批量操作(按命名空间清除/统计缓存) 避免Key冲突,提升可维护性 适配多缓存策略(不同命名空间可配置不同过期时间) 代码语义更清晰。合并写法虽可行,但会导致运维困难、策略复用性差等问题,违背工程化最佳实践。
2026-02-28 21:15:23
686
原创 Java和C++在数组参数传递上的差异
摘要:Java和C++在数组参数传递上有本质区别。Java中数组是引用类型,传递的是引用副本(值传递),但仍指向原数组内存,可直接修改内容。C++中数组名是指针,直接传递的是指针副本,需显式传递地址或引用才能确保修改原数组。虽然两种语言都能通过副本访问原数组内存实现swap功能,但Java通过引用机制简化了操作,而C++需要显式处理指针。核心差异在于Java隐藏了指针细节,而C++需要开发者手动管理内存地址。
2026-02-28 17:46:13
408
原创 MyBatis-Plus调用getEntity()触发异常
摘要:MyBatis-Plus 3.4.3.2版本中,lambdaQuery().eq().getEntity()会报错"can not use this method",需改用one()方法获取实体。修复方案包括:1)替换getEntity()为one();2)增加空值校验;3)更新后重新查询返回最新数据。同时优化了异常处理和返回值逻辑,确保返回的是更新后的状态。验证时需测试不同状态的服务ID调用情况,确认不再出现相关异常。
2026-02-20 21:15:47
365
原创 docker中nginx配置报错解决
Nginx容器启动失败的原因是配置错误:在nginx.conf第29行将Docker网络名"fresh"作为上游主机名,而实际应使用容器名称。解决方案是修改配置文件,将upstream中的"fresh"替换为实际容器名(如"material"),并确保容器在同一Docker网络内。修正后需重启Nginx容器,通过日志验证是否成功。关键点在于理解Docker网络内需通过容器名而非网络名进行服务访问。
2025-12-20 15:55:25
342
原创 Linux中的cd ~命令
本文详细解析了Linux中的cd ~命令,从四个维度帮助用户掌握这一常用操作。核心功能是快速切换至当前用户的家目录,~符号会自动解析为对应路径。文章介绍了完全等价的命令(如单独使用cd或cd $HOME),并拓展了结合子目录和其他用户家目录的用法。特别提醒注意~与-的区别、权限问题及~的符号性质。总结强调该命令是日常操作中最便捷的目录切换方式,能避免手动输入长路径。全文以通俗示例和对比说明,帮助用户彻底理解这一基础但高频使用的命令。
2025-12-19 22:31:41
487
原创 Linux的目录结构
Linux 是单根目录结构,所有文件都在下,遵循 FHS 标准,不同发行版目录结构一致;/etc存配置、/bin/sbin存命令、/var存动态数据、/usr存软件、/home/root存用户目录;新手重点掌握/etc/var/usr/home/tmp这5个目录,能解决80%的日常操作问题。记住:Linux 目录的设计逻辑是“让文件有固定位置”,比如无论你用 CentOS 还是 Ubuntu,Docker 的配置永远在,日志永远在,这也是 Linux 易管理的核心原因。
2025-12-19 22:30:16
947
原创 java中的浮点数基本操作
在计算机中,使用/运算符进行除法运算时,若结果包含小数则不是整除。整除需用特定运算符如Python的//或Java中的整数除法。Java的float和double主要区别在于精度和内存占用,double精度更高且是默认类型。保留两位小数可通过DecimalFormat或String.format实现格式化输出,而精确计算推荐使用BigDecimal。注意System.out.println不支持直接格式化输出,需改用printf或先格式化字符串。
2025-12-08 21:23:41
646
原创 HAVING过滤分组后的结果可以使用聚合函数,而WHERE不能使用
SQL语句错误分析及修正: 原SQL在WHERE子句错误使用COUNT()聚合函数,应改用HAVING子句过滤分组结果 修正方案: 将COUNT()移至HAVING子句 在GROUP BY中包含SELECT中的所有非聚合列(Manager.name) 补充说明: WHERE用于行过滤(分组前),HAVING用于组过滤(分组后) LEFT JOIN可能产生NULL值,建议改用INNER JOIN优化查询效率 优化版本使用INNER JOIN和COUNT(*),更高效且语义清晰
2025-12-01 13:48:17
261
原创 Java生成一个6位的随机数字验证码
这段Java代码生成一个6位随机数字验证码字符串。核心逻辑是:1)Math.random()生成0.0-1.0的随机数;2)乘以1000000后转为整数,得到0-999999的随机数;3)转为字符串。存在两个问题:1)结果可能是1-6位(如"123");2)Math.random()安全性不足。优化方案:1)使用String.format("%06d",...)补零确保6位;2)对安全性要求高时改用SecureRandom。适用于短信/邮件验证码等场景,需根据实际需求
2025-11-27 19:25:31
672
原创 Java中将整型数组全部填充为0的方法
Java中整型数组填充0的方法:1)Arrays.fill()最推荐,简洁高效;2)for循环适合自定义逻辑;3)新建数组自动初始化为0;4)Arrays.setAll()适用于复杂填充。新数组默认全0,二维数组需遍历填充。性能上Arrays.fill()和新建数组最优。建议优先使用Arrays.fill()或直接创建新数组。
2025-11-27 11:45:40
357
原创 Java中的队列的实现,常用方法,以及常见的问题
Java队列通过`Queue`接口及其实现类实现,核心包括`ArrayDeque`(循环数组,性能最优)、`LinkedList`(双向链表,支持null)、`PriorityQueue`(堆排序,带优先级)和`ConcurrentLinkedQueue`(CAS机制,线程安全)。`Queue`提供两套操作方法:**抛出异常**的`add`/`remove`/`element`与**返回特殊值**的`offer`/`poll`/`peek`(后者更安全)。队列判空和获取长度通过继承自`Collection`
2025-11-26 12:39:13
1063
原创 @PathVariable与@RequestParam
Spring MVC中@PathVariable和@RequestParam注解的区别: @PathVariable从URL路径获取参数(如/services/123),用于标识资源ID,默认必需 @RequestParam从查询字符串获取参数(如?price=99.99),用于传递操作数据,可设默认值 典型应用:@PathVariable定位资源,@RequestParam传递修改值 主要差异:参数位置、必需性、用途场景 两者常配合使用实现RESTful风格API,分别处理资源定位和参数传递。
2025-11-25 22:11:27
422
原创 批量新增操作为什么要加@Transactional注解
摘要:@Transactional注解确保batchAdd方法的原子性,使批量新增服务操作要么全部成功提交,要么在异常时完全回滚。它通过事务管理解决了多步写入时的数据一致性问题,避免因部分失败导致的数据残留,保证业务逻辑要求的"全有或全无"特性。该注解特别适用于包含循环插入、前置校验等需要整体性保证的场景,是防止并发冲突和脏数据的关键机制。
2025-11-25 21:15:20
916
原创 MyBatis 中的@Param注解
MyBatis中@Param注解的作用是为方法参数指定映射名称。在MyBatis 3.4.1+版本中,单个基本类型参数可省略该注解,系统会自动使用参数名。但在多参数、集合类型或动态SQL等场景下必须添加。虽然省略在某些情况下可行,但建议始终使用@Param以确保代码的兼容性、可读性和维护性,这是一种更安全的编程实践。
2025-11-24 22:34:17
390
原创 在Java 工程中,为什么将存放数据库表对应的对象的包命名为domain
在Java项目中,将数据库表对应的对象放在domain包下是一种行业惯例,体现了业务领域建模的思想。"domain"强调这些类是业务实体而非单纯的数据容器,与entity、pojo等技术术语形成区分。这种命名方式源于分层架构需求,其中domain对象专用于持久化,与接口专用的dto分离,避免数据库变更直接影响对外接口。MyBatis生态和领域驱动设计(DDD)的推广也强化了这一实践。实际开发中,domain类严格对应表结构,而dto则根据接口需求灵活调整,二者分工明确。只有在严格遵循JP
2025-11-24 21:50:41
315
原创 Mysql连表查询给表起了别名之后就不能使用之前的原名
SQL查询存在语法错误:混用了表名和别名。原查询中serve_item表已定义别名为item,但在ON条件和SELECT中仍使用了原表名serve_item。正确写法应统一使用别名(如item.name)或全部使用原表名。核心规则:一旦定义别名,整个查询必须一致使用该别名,否则会报错。修正方法:将serve_item.name改为item.name,serve_item.id改为item.id即可。
2025-11-24 21:15:10
266
原创 SQL聚合函数AVG()
SQL中的AVG()函数用于计算数值列的平均值,自动忽略NULL值。基本语法为AVG(column_name),通常与GROUP BY配合使用实现分组计算。示例显示:1)计算所有产品均价;2)按类别分组计算均价;3)通过JOIN计算各产品平均订单量。在时间差计算场景中,AVG()可对多任务处理时间求均值,配合GROUP BY实现按机器分组统计。该函数是处理数值数据聚合分析的核心工具。
2025-11-23 22:32:44
124
原创 SQL中AND和逗号,的区别
SQL中AND和逗号,的区别: AND是逻辑运算符,用于WHERE、ON、HAVING子句连接多个条件,表示"同时满足"; 逗号,是分隔符,用于: SELECT子句分隔多个列名或表达式 FROM子句连接多个表(等价CROSS JOIN,需手动加关联条件) 两者不可互换使用,FROM后不能用AND连接表,WHERE中不能用逗号分隔条件。
2025-11-23 22:30:15
151
原创 SQL中的四舍五入,ifnull(),子查询派生表别名
SQL查询解析:产品平均价格计算 这段SQL查询用于计算每个产品的平均销售价格,处理了可能出现的空值和除零情况。主要包含以下关键部分: 子查询构建临时表T: 通过LEFT JOIN连接prices和UnitsSold表 计算每个产品的销售额(sales = price × units) 确保销售日期在有效期内(purchase_date BETWEEN start_date AND end_date) 主查询计算平均价格: 按product_id分组 使用sum(sales)/sum(units)计算平均价
2025-11-23 21:52:11
1054
原创 RFC是什么
摘要:RFC是互联网技术规范的权威标准,定义了HTTP方法的语义。GET应为安全且幂等的只读操作,适合缓存;POST用于提交数据,非安全且非幂等。实际开发中常出现违背RFC的情况,如用GET提交表单或POST实现查询,主要由于历史遗留、便利性或认知偏差。RFC作为互联网的"技术宪法",虽要求严格遵循,但现实存在"方言"式变通使用。(149字)
2025-11-22 21:23:48
405
原创 JavaWeb服务器(undertow)
摘要:本文介绍了Spring Boot中Undertow服务器的配置方法,通过application.yml文件定制端口号、上下文路径和访问日志。配置内容包括:监听端口11509,设置上下文路径/foundations,启用访问日志并定义日志格式和存储路径。Undertow是一个轻量级、高性能的Java Web服务器,支持HTTP/2和Servlet 4.0,适用于高并发微服务场景。在Spring Boot中可通过排除Tomcat依赖并添加Undertow依赖来快速集成。
2025-11-22 21:17:29
578
原创 Maven中的属性占位符的用法
Maven项目中使用${servlet-api.version}作为版本占位符,通过<properties>标签统一管理依赖版本。这种方式能集中修改版本号,避免多处修改,提高维护性。实际值可在pom.xml的<properties>中定义或通过mvn help:effective-pom查看。常见约定如xxx.version用于依赖版本控制,典型示例包括Servlet API、JUnit等依赖的版本管理。
2025-11-22 21:12:37
317
原创 幂等是什么
摘要: 幂等指操作执行一次或多次对系统状态的影响相同。例如,查询余额、删除文件是幂等的,而转账、发送消息则不是。HTTP方法中,GET、PUT、DELETE是幂等的,POST通常不是。幂等性保障了安全重试、缓存和系统健壮性。GET请求因其幂等特性可被缓存、书签保存和重复刷新,核心在于"多次操作,一次影响"(150字)
2025-11-17 20:36:54
530
原创 哈希表中桶的概念
哈希表中"桶"是存储数据的基本单元,其实现方式因冲突解决方法而异。链地址法中,桶是链表头指针,存储相同哈希值的键值对;开放地址法中,桶直接存储键值对,冲突时通过探测寻找空位。通俗来说,桶就像图书馆书架:链地址法允许一个书架挂多本书,开放地址法则要求每本书独占一个位置。两种方法各有利弊:链地址法实现简单但需额外空间,开放地址法空间利用率高但探测复杂。桶的设计直接影响哈希表的性能和效率。
2025-11-11 23:14:48
593
原创 为什么使用Docker部署Redis集群,network模式必须采用host
Docker部署Redis集群为何推荐host网络模式? Redis集群需要两个端口(6379和16379)进行节点间通信。host模式直接使用宿主机网络,避免了bridge模式下容器内网IP不可达的问题,使节点注册的IP和端口真实有效。虽然非host模式可通过cluster-announce-ip等参数解决,但配置复杂。host模式的优势在于: 真实IP直接暴露,节点间通信无障碍 无需端口映射,避免NAT转换 部署简单,适合测试环境 生产环境建议使用bridge/overlay网络并配合参数指定通告IP,
2025-11-07 10:51:37
960
原创 监听某个端口是什么意思
摘要:网络监听并非接收所有端口数据,而是进程向系统登记特定端口(如7001),由内核匹配目标IP和端口后,将数据包复制到进程的socket缓冲区。监听时可指定协议、类型、本地地址等条件,仅接收符合条件的数据。与抓包工具不同,监听工作在传输层,仅获取内核判定归属的数据负载。本质上,监听是让系统筛选并交付特定目标端口和IP的匹配数据包,其余数据包将被直接丢弃。
2025-11-06 23:03:21
773
原创 redis中的offset是什么意思
SET k1 v1 → 占用 30 字节 master_repl_offset = 30。SET k2 v2 → 占用 30 字节 master_repl_offset = 60。从节点 A 之前复制到 60,现在网络断了 5 秒,主又写了 30 字节(offset 91‥120)。若从节点落后太多,要 offset 10,而 backlog 起始已涨到 50,则返回。,主节点检查发现 61 ≥ 1 且 61 < 120 → 还在窗口,直接发。
2025-11-06 22:31:14
530
原创 ps -ef | grep redis
就是“列出所有进程,再筛选出含 redis 字样的行”,用来快速确认 Redis 是否已启动、启动用户、PID、完整命令行参数;默认 bridge 模式时,Redis 进程在容器 PID 命名空间里,宿主机 ps 只能看到 docker-containerd-shim 等中间层;进程,启动参数、监听端口一目了然——这就是你引用那句话里“能直接在宿主机通过 ps 命令查看到 Redis 进程”的原因。这行命令几乎是 Linux 运维排查 Redis 是否启动、启动参数是什么时最先敲的一条指令。
2025-11-06 22:02:05
492
原创 Docker的host网络模式
使用 host 模式时,容器共享宿主机的网络,不需要端口映射,容器内的服务直接监听宿主机端口。因此,你在docker ps中看不到端口映射信息,但可以直接在宿主机上通过ps命令看到容器内运行的进程(如 Redis)。
2025-11-06 21:55:27
276
原创 @Configuration类中定义的@Bean方法
Spring Boot通过自动配置机制自动管理Bean生命周期。@Configuration类中的@Bean方法会在启动时被自动执行,返回对象将被注册为Spring容器管理的Bean。Spring AMQP的RabbitAdmin会自动扫描Queue、Exchange和Binding类型的Bean,并调用RabbitMQ API完成声明。整个过程无需手动调用,但需确保RabbitMQ连接配置正确,否则启动会失败。可通过RabbitMQ管理后台验证队列和交换机的创建情况。
2025-11-06 20:22:39
311
原创 docker exec命令为什么一般要接 -it
Docker中-it选项是-i和-t的组合:-i保持输入流开放确保能输入命令,-t分配伪终端使bash支持提示符、补全等功能。两者缺一不可,共同实现交互式终端体验。这组选项的本质是让容器进程像正常终端一样工作,而非后台管道。
2025-11-05 13:53:27
422
原创 不同配置名称(默认,dev,local,prod)的区别
Nacos配置文件的命名遵循[服务名]-[环境].[后缀]格式,其中dev代表开发环境。配置分为通用配置(如cart-service.yaml)和环境专属配置(如cart-service-dev.yaml),后者仅在指定环境时生效。加载优先级为:环境专属配置会覆盖通用配置中的相同项。例如启动时指定--spring.profiles.active=dev,则加载cart-service.yaml和cart-service-dev.yaml。这种机制实现了不同环境(开发/测试/生产)的配置隔离与共享。
2025-11-03 21:54:20
865
原创 nacos增加配置时报错
浏览器缓存或兼容性问题导致Nacos配置发布失败 问题现象: 在Nacos页面发布配置时失败,但服务端日志无记录 F12开发者工具未显示配置发布的PUT/POST请求 更换浏览器后问题解决 原因分析: 浏览器缓存干扰:旧浏览器可能缓存了错误请求或拦截了API调用 兼容性问题:某些浏览器插件(如广告拦截器)可能误拦截Nacos接口请求 前端脚本执行失败:原浏览器可能存在JavaScript执行异常 解决方案: 清除浏览器缓存或使用无痕模式访问Nacos 禁用可能干扰请求的浏览器插件 推荐使用Chrome/Fi
2025-11-03 19:23:21
1036
2
原创 Windows版Nginx常用命令
本文详细介绍了Windows版Nginx的实用操作指南。主要内容包括:三种启动方式(直接运行、命令行启动、注册服务);对应的关闭方法;常用命令如配置检查(-t)、热重载(-s reload);Windows特有的路径权限问题;以及信号参数(-s)的深度解析,说明其作为进程控制指令(quit/stop/reload/reopen)的工作原理。文章提供了从日常操作到故障处理的完整流程,并附快速查询表,帮助用户掌握Windows环境下Nginx的核心管理技巧,特别强调了"-s"参数在进程控制中
2025-10-31 22:37:54
1847
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅