- 博客(135)
- 资源 (2)
- 收藏
- 关注
原创 Kafka消息持久化机制全解析:存储原理与实战场景
Kafka的消息持久化机制通过日志分段、索引文件和批量写入技术,实现了高可靠性、高效性和消息可追溯性。默认配置下采用7天保留期和1GB日志段大小,平衡了性能与存储效率。典型应用场景包括电商流量削峰、金融审计追溯和IoT数据分层存储。常见误区包括过度分区和过大日志段设置,正确实践需结合业务需求调整参数。掌握Kafka存储机制对构建高性能分布式系统至关重要,适用于不同职业阶段的技术人员深入学习和应用。
2025-08-21 12:11:29
801
原创 Kafka如何保证消费确认与顺序消费?
《Kafka核心机制实践:消费确认与顺序消费详解》深入解析了Kafka的两个关键特性:消费确认机制通过自动/手动提交位移确保消息可靠处理,电商订单处理案例展示了手动提交如何避免数据丢失;顺序消费需保证单分区内消息顺序,通过分区策略和消费者设计实现,金融交易系统案例展示了强顺序场景的实现方案。文章还总结了常见误区,如自动提交更安全、增加分区数提高顺序性等错误认知,并给出最佳实践建议,包括手动提交+异常重试、单分区/同Key聚合等。掌握这些技能能有效提升分布式系统开发能力。
2025-08-20 21:54:42
1170
原创 Spring AOP的实现原理
本文深入解析Spring AOP的核心原理与应用场景,通过五大典型案例展示其在日志记录、权限校验、事务管理等企业级开发中的实战价值。文章首先剖析AOP如何解决OOP的代码冗余问题,详解关键概念如Pointcut、Advice等组件,并对比JDK动态代理与CGLIB代理的差异。随后通过完整流程揭秘AOP工作机理,重点给出日志记录、缓存优化等场景的代码实现方案,最后提供生产环境中的表达式规范、性能优化等最佳实践。AOP能显著提升代码复用率、降低耦合度,是Java开发者必备的高级技能。
2025-08-18 13:44:15
953
原创 深入浅出Seata分布式事务:核心原理与实战场景
《Seata分布式事务核心原理与模式解析》摘要:Seata是解决微服务数据一致性的分布式事务框架,包含TC协调器、TM管理器和RM资源管理器三大角色。提供四种主要模式:1)XA模式强一致但性能差;2)AT模式通过自动生成回滚日志实现无侵入事务;3)TCC模式分Try/Confirm/Cancel三阶段实现精细控制;4)SAGA模式通过补偿机制处理长事务。实际应用需根据场景选择:电商下单适用AT,金融交易推荐XA,长流程业务适合SAGA。关键考点包括事务传播、幂等处理和性能对比等。
2025-07-21 14:41:32
753
原创 单体VS微服务:如何选择最适合的架构?
本文对比分析了Java开发中的单体架构与微服务架构。单体架构将所有功能模块打包成一个应用,部署简单但扩展性差;微服务架构将应用拆分为独立服务,灵活可扩展但复杂度高。单体适合小型项目或快速迭代,微服务适用于大型复杂系统。实际案例显示,早期Uber采用单体,而亚马逊、Netflix则采用微服务。文章建议根据项目规模、团队能力和业务需求选择架构,并指出随着云原生技术发展,微服务渐成主流,但单体仍有其价值。开发者需权衡二者优劣,做出合理的技术选型。
2025-07-21 14:08:56
1078
原创 Java中的值传递 vs 引用传递本质区别
【摘要】Java参数传递机制本质上是值传递,而非引用传递。对于基本类型直接传递值副本,对象类型传递引用副本。关键点:1) 修改对象属性会影响原对象;2) 重新赋值引用副本不会改变原引用;3) 数组/集合元素修改会同步,但重新赋值引用无效。常见误区包括混淆对象属性修改与引用赋值,以及误判String的特殊性。实际开发中90%场景可归为三类:对象属性修改、集合操作和数组处理。Java选择值传递是为了保证安全性和简化内存管理。面试时应明确:Java只有值传递,所谓"引用传递"实为引用副本的值传
2025-07-17 12:13:14
1457
原创 在Java中String类为什么不可以修改?
Java中String类的不可变性是其核心设计,通过final修饰和私有字符数组确保内容不可修改。这种设计支持字符串常量池优化、哈希码缓存和线程安全。虽然可通过反射强制修改,但会破坏设计原则。频繁修改字符串应使用StringBuilder/StringBuffer。不可变性在性能、安全和内存管理方面提供了关键优势,是Java语言的主动选择。
2025-07-17 11:40:28
1486
原创 Spring声明式事务原理?哪些场景事务会失效?
摘要:Spring声明式事务通过AOP动态代理实现,核心包括事务属性配置和代理机制。事务失效的常见原因包括:1)方法未被Spring管理;2)非public方法;3)同类自调用;4)异常被捕获;5)数据库引擎不支持;6)传播行为错误;7)final/static方法;8)多线程隔离。解决方案包括正确配置注解、调整方法权限、避免自调用、重新抛出异常等。确保代理生效和事务属性正确配置是保证事务有效的关键。(150字)
2025-07-14 13:32:19
647
原创 Netty入门:手把手实现Echo Server/Client(附完整代码)
Netty作为Java高性能NIO框架,是实现网络编程的关键技术。本文通过Echo模式案例详细讲解Netty开发流程:从环境搭建(Maven配置)到实现服务器端(EchoServer)和客户端(EchoClient),重点解析了核心组件(EventLoopGroup、ChannelPipeline等)的作用。案例展示了消息收发机制,并提供了常见问题排查方法和扩展思考方向(如改造聊天室、WebSocket实现等)。该教程不仅帮助初学者掌握Netty基础开发,也为后续高并发系统设计打下基础。
2025-07-03 15:39:15
876
原创 接口限流算法解决方案详解:计数器、滑动窗口、令牌桶(Guava RateLimiter)、漏桶
本文介绍了四种主流限流算法及其应用场景。计数器算法(固定窗口)实现简单但存在临界问题;滑动窗口算法统计更精准但内存消耗高;漏桶算法能稳定输出流量但不适合突发场景;令牌桶算法(如Guava RateLimiter)支持突发流量且灵活可控。文章还提供了Java代码示例,并对比了各算法优缺点,建议根据业务需求选择合适方案(如API网关首选令牌桶,后台任务适用漏桶)。最后提出分布式限流的Redis实现方案,强调合理限流是保障系统稳定性的关键。
2025-07-03 07:00:00
1021
原创 Redis缓存穿透、击穿、雪崩解决方案详解
本文系统介绍了Redis缓存使用中的三大典型问题及其解决方案:1. 缓存穿透(查询不存在数据)建议采用布隆过滤器、空值缓存和参数校验;2. 缓存击穿(热点数据过期)推荐使用互斥锁、逻辑过期和缓存预热;3. 缓存雪崩(集体失效)应对方案包括随机过期、熔断限流和高可用集群。文章通过电商库存、热点新闻等实际案例,说明了组合使用多种技术手段(如布隆过滤器+互斥锁+随机过期)的有效性,并强调监控预警、多级缓存和压力测试等综合防范措施的重要性。
2025-07-02 07:51:43
1723
原创 Redis分布式锁实战:从入门到生产级方案
Redis分布式锁实现方案解析 在分布式系统中,Redis分布式锁是解决资源竞争的关键技术。本文介绍了四种主流实现方案:1)基础版SETNX+EXPIRE,简单易用但需处理锁误删问题;2)Redisson框架推荐方案,提供自动续期、可重入等高级特性;3)RedLock算法适用于集群环境,确保强一致性;4)Lua脚本实现原子操作。同时分析了锁误删、主从一致性等常见问题及解决方案,建议生产环境优先采用Redisson,集群场景使用RedLock,并注意锁粒度、超时设置等优化细节。
2025-07-02 07:43:39
1002
原创 Redis 常用数据类型操作详解(Jedis版本)
本文介绍了Redis主要数据类型及其Java操作实践。涵盖String、Hash、List、Set和ZSet五种核心数据类型,详细说明每种类型的使用场景和Jedis客户端操作方法,包括缓存设置、计数器、消息队列等典型应用。文章还提供了环境配置指南、完整代码示例和性能优化建议,强调合理选择数据类型对Redis应用开发的重要性,并对比了Jedis与Lettuce客户端的差异。通过本文,开发者可以快速掌握Redis数据结构的实际应用技巧。
2025-07-01 08:14:41
766
原创 Spring事务传播行为(@Transactional(propagation=...))案例详解
摘要:本文系统解析Spring事务传播行为的7种类型及其应用场景。主要内容包括:1)事务传播行为的概念与核心作用,解决嵌套调用时的事务控制问题;2)7种传播行为的详细对比,从默认的REQUIRED到强制事务的MANDATORY;3)典型应用案例解析,如订单处理(REQUIRED)、独立日志(REQUIRES_NEW)和部分回滚(NESTED);4)常见误区与解决方案,强调同类内调用失效问题和行为选择原则。最佳实践建议优先使用REQUIRED,独立操作用REQUIRES_NEW,查询方法用SUPPORTS。正
2025-07-01 08:03:06
812
原创 Spring AOP 实现日志记录案例详解
摘要:本文介绍了使用Spring AOP实现日志记录的技术方案。首先分析了传统日志代码的三大痛点:冗余、耦合度高、功能单一,提出AOP解决方案。通过核心概念讲解(切面、切入点、通知)和基础案例演示(自定义注解+环绕通知),展示了方法级日志的实现。进阶案例扩展了动态参数和异常处理功能,高级应用则实现数据库持久化。文章总结了AOP日志的优势(解耦、扩展性、统一管理)和使用注意事项(性能影响、代理模式、异常处理),最后提出扩展思考方向。全文通过递进式案例,系统性地展示了Spring AOP在日志记录中的实践应用。
2025-06-30 15:08:25
840
原创 设计模式:代理模式 (静态代理、JDK动态代理、CGLib动态代理) 案例详解
代理模式通过引入"中间人"解决对象直接访问的耦合度高、功能冗余和安全风险问题。核心角色包括抽象主题(Subject)、真实主题(RealSubject)、代理(Proxy)和客户端(Client)。实现方式有三种:静态代理需手动编写代理类,简单直观但代码冗余;JDK动态代理基于接口动态生成代理类,耦合度低但仅支持接口;CGLib动态代理通过生成子类实现,支持普通类但性能稍逊。实际应用广泛,如Spring AOP、MyBatis插件等,选择时需根据场景(有无接口、性能要求等)权衡。建议结合
2025-06-30 07:15:00
911
原创 设计模式:观察者模式 (Observer) 案例详解
《观察者模式解耦实践》摘要(150字) 观察者模式通过解耦主题与观察者,解决对象间一对多依赖问题。核心原理是:主题维护观察者列表,状态变化时自动通知所有订阅者;观察者实现统一更新接口,响应主题变化。典型应用场景包括:GUI事件处理(如按钮点击触发多操作)、数据同步(如股票价格通知投资者)和MVC架构(模型数据变更更新视图)。Java提供了Observable/Observer接口但灵活性不足,建议自定义实现。该模式优势在于动态扩展性,但需注意避免循环依赖和同步阻塞问题。开发中建议从天气监测等基础案例入手,逐
2025-06-29 15:55:56
1082
原创 设计模式:工厂模式 (简单工厂、工厂方法、抽象工厂) 案例详解
提供一个抽象工厂接口,用于创建一组相关或依赖的对象(产品族)。例如,创建不同风格的 UI 组件(按钮、文本框)时,保证它们风格一致。工厂模式是 Java 开发的基石技能,掌握其核心逻辑和差异能帮助你写出更优雅、可维护的代码。初学者可从简单工厂入手,逐步理解工厂方法和抽象工厂的设计理念。在实际项目中,根据需求选择合适的模式,避免过度设计!
2025-06-29 07:00:00
1315
原创 设计模式:单例模式 (饿汉、懒汉、DCL、静态内部类、枚举) 实现与对比
摘要:单例模式确保类仅有一个实例,适用于配置中心、日志管理等需全局唯一对象的场景。Java实现方式有五种:1)饿汉式(线程安全但内存占用高);2)懒汉式(延迟加载但线程不安全);3)双重检查锁定(兼顾性能与安全);4)静态内部类(天然线程安全);5)枚举(最简洁安全但扩展性差)。选择建议:简单场景用枚举,高并发选DCL或静态内部类,资源紧张用饿汉式。需注意反射和反序列化的防护。单例模式是优化资源利用的关键设计模式。
2025-06-28 08:00:00
1037
原创 Java线程池(ThreadPoolExecutor)原理、参数配置与使用案例
Java线程池核心原理与实践指南 线程池通过复用线程降低创建/销毁开销,提升并发性能。其核心流程为:任务优先由核心线程处理,队列缓冲后动态扩展非核心线程,超限则触发拒绝策略。关键参数包括核心线程数(CPU密集型建议核数+1,IO密集型建议核数*2)、有界队列(防OOM)及拒绝策略(如CallerRunsPolicy)。推荐使用自定义ThreadPoolExecutor,避免无界队列,合理配置线程数,并优雅关闭(shutdown→shutdownNow)。典型场景:固定线程池适用于稳定流量,缓存线程池适合短时
2025-06-28 07:45:00
989
原创 volatile关键字的最佳实践实例
摘要:本文深入探讨了volatile关键字的最佳实践与典型应用场景。在最佳实践部分,强调了避免过度使用volatile、与synchronized配合使用、优先选择Atomic类等原则。通过双重检查锁定、中断机制、并发容器等案例展示了volatile的实际应用。同时介绍了使用AtomicInteger替代volatile的优势,以及利用AtomicStampedReference解决ABA问题的方法。文章指出,volatile虽可确保可见性和有序性,但不保证原子性,需要根据场景合理搭配synchronize
2025-06-27 08:00:00
894
原创 volatile关键字原理的使用介绍、底层原理解析
这种直接从主内存读取的方式,极大地保证了不同线程对该变量操作的可见性,让各个线程都能及时获取到最新的数据。这就像是在数据流通的道路上设置了关卡,确保数据的读写都严格按照规定的顺序和方式进行,防止了数据的不一致和混乱。volatile关键字就像一道“禁令”,告诉编译器不要对这段代码进行不合理的优化,从而避免了一些可能引发错误的优化操作,确保程序在多线程环境下的正确性。volatile关键字的主要作用在于保证可见性、有序性以及禁止编译器优化,犹如一位严谨的指挥官,确保多线程环境下的变量操作有条不紊。
2025-06-27 07:30:00
472
原创 【Java并发编程】 synchronized 与 ReentrantLock 的性能、场景与避坑指南
StampedLock:JDK8+提供的乐观读锁,适合读多写少场景ReadWriteLock:区分读写锁,提升并发读性能原子类:在能用AtomicInteger等类时,优先用无锁方案。
2025-06-26 08:40:26
1060
原创 CAS原理与AtomicInteger使用详解
摘要:本文解析Java中CAS机制及AtomicInteger的实现原理与应用。CAS通过无锁原子操作实现线程安全,包含读取、比较和交换三个步骤,具有高性能但存在ABA问题和自旋开销。AtomicInteger利用CAS提供原子操作方法,适用于计数器等简单场景。文章对比了CAS与传统锁的差异,指出CAS在低竞争时性能更优,并给出使用建议:优先选用AtomicInteger处理简单原子操作,警惕ABA问题,复杂场景考虑其他并发工具。通过代码示例展示了AtomicInteger在计数器和信号量中的实践应用。
2025-06-26 08:31:57
721
原创 如何保证MySQL与Redis数据一致性方案详解
本文探讨了MySQL与Redis数据一致性问题及解决方案。在互联网高并发场景下,数据库与缓存的数据不一致主要源于更新顺序、并发竞争和主从同步延迟。文章分析了三种解决方案:1)基础策略如更新时序选择和延时双删;2)进阶方案包括Binlog同步和消息队列异步更新;3)强一致性方案使用分布式锁和事务补偿。针对不同业务场景,提出了技术选型建议和配套措施,并提供了代码级优化示例。最终强调应根据业务特点在性能与一致性间寻找平衡,合理选择最终一致性或强一致性方案。
2025-06-19 15:37:09
2658
原创 Java文件读写的5大核心技巧,告别IO流困扰
【Java文件IO操作指南】字节流(FileInputStream/OutputStream)用于处理图片等二进制文件,字符流(FileReader/Writer)适合文本文件且需指定编码。缓冲流(BufferedXXX)可提升性能,减少IO操作。常见错误包括:未关闭流导致资源泄漏、编码混乱产生乱码、混淆read()与readLine()方法。建议使用try-with-resources自动关闭流,明确指定UTF-8编码,并根据场景选择合适流类型:文本处理用字符流+缓冲,二进制文件用字节流。特别注意文件操作
2025-06-07 16:44:40
804
原创 Java 8 Stream API 入门到实践详解
Java8的Stream API革新了集合操作,用函数式编程替代传统for循环。核心操作包括:过滤(filter)、映射(map)和归约(reduce),具有简洁链式调用、惰性计算和并行处理优势。典型应用场景包括统计词频、大数据并行处理和多级排序。需注意流只能使用一次,避免Prev并行陷阱,且并行流在小数据量时可能效率更低。相比Prev传统方式,Stream代码量可减半,如过滤偶数从5行缩减到1行,大幅提升开发效率和代码可读性。
2025-06-07 16:30:08
1076
原创 在java中不同数据类型的运算与内存占用分析
等基本数据类型及其包装类的运算行为和内存占用,帮助开发者理解数据类型的特性,并掌握内存优化技巧。通过本案例,开发者可直观理解数据类型的内存特性,为高性能、低内存占用的代码设计提供依据。在Java开发中,合理选择数据类型直接影响程序的内存占用和运算效率。
2025-06-04 13:05:08
425
原创 Java 8 新特性全解析:提升代码效率与可读性
Java8的发布标志着Java编程语言的一次重大革新,引入了Lambda表达式和Stream API,极大地提升了代码的简洁性和效率。通过Comparator、Consumer、Filter、Sorted、Map、Match、Count、Reduce和flatMap等核心特性,Java8使得函数式编程变得更加直观和强大。这些新特性不仅简化了代码,还提高了性能,特别是在处理集合数据时,Stream API的链式调用和并行处理能力使得代码更加高效和易于理解。Java8的这些改进,使得开发者能够以更少的代码实现更
2025-05-11 10:42:17
851
原创 说说在系统架构中,限流的主要目的是什么,有哪些常见的限流算法及优缺点?
在系统架构中,限流的主要目的是,常见的限流算法包括固定窗口计数器算法、滑动窗口算法、漏桶算法和令牌桶算法。
2025-05-10 08:15:00
463
原创 说说你对熔断、限流和降级的理解?在分布式系统中熔断、限流和降级的作用是什么?
熔断、限流和降级是现代分布式系统中常用的三种稳定性保障机制。它们分别通过不同的方式保护系统在高并发、高负载或部分服务故障的情况下,仍能提供基本的服务能力。以确保系统的整体稳定性和可用性。
2025-05-10 08:00:00
1459
原创 说说什么是服务雪崩,我们该如何避免
服务雪崩效应通常由单个服务的故障引发,通过调用链路迅速扩散,导致整个系统崩溃。其触发机制包括初始故障、调用链路阻塞、连锁反应和资源耗尽。典型场景如电商系统中订单服务因库存服务宕机而崩溃。核心防御策略包括熔断与降级、限流、超时控制、资源隔离、监控与告警、负载均衡与弹性伸缩以及分布式追踪。通过组合这些策略,如熔断+限流+降级、超时+异步调用、监控+自动扩容,以及混沌工程,可以有效降低雪崩效应的发生概率,提升微服务架构的高可用性。
2025-05-09 16:16:18
344
原创 手撕Spring Boot动态路由!注解+拦截器实现路径参数动态化,让你的API更灵活!
在日常开发中,动态路由技术能够有效解决多租户系统、版本控制、A/B测试和灰度发布等场景下的路径管理问题。通过自定义注解、配置WebMvcConfigurer和拦截器,可以实现路径的动态前缀添加和参数提取。这种方案不仅简化了代码结构,还提高了系统的灵活性和可维护性。此外,集成OpenAPI3文档可以方便前端开发者理解和使用API。动态路由技术特别适用于SaaS系统和多租户应用,能够显著提升开发效率和系统扩展性。
2025-05-09 16:14:02
1065
原创 什么是线程安全和非线程安全,它们有什么区别?
注意,如果锁的是类对象,尽管创建了多个实例对象,它们仍然属于同一个类,因此会被锁住,保证线程之间的同步关系。在多线程环境下,不提供数据访问保护,可能导致多个线程同时修改数据,从而产生脏数据或不一致的结果。HashMap是非线程安全的,采用异步处理,性能更高,在JDK1.2之后推出,使用更为广泛。HashTable是线程安全的,采用同步处理,性能较低,在JDK1.0时推出。StringBuffer是线程安全的,适用于多线程环境,但性能相对较低。Vector是线程安全的,适用于多线程环境,但性能相对较低。
2025-04-30 08:15:00
506
原创 SpringBoot中的bean是线程安全吗? 在实际工作中如何处理线程安全问题?
Singleton:需要特别注意线程安全问题,尤其是有可变状态的Bean。Prototype:通常是线程安全的,因为每次请求都创建新的实例。Request 和 Session:通常也是线程安全的,因为每个请求或会话都有独立的实例。Application:与Singleton相同,需要注意线程安全问题。通过合理设计Bean的作用域和使用适当的线程安全机制,可以确保Spring Boot应用中的Bean在多线程环境下正常工作。
2025-04-30 08:00:00
1002
原创 Springboot Dubbo迁移到SpringCloud Alibaba中的好处是什么?
例如,从Dubbo迁移到Spring Cloud Alibaba后,你可以继续使用Spring Boot和Spring Cloud的其他组件,如Spring Cloud Gateway、Spring Cloud Config等,实现全栈的统一管理。Spring Cloud Alibaba集成了多种阿里巴巴开源项目,如Nacos、Sentinel、RocketMQ等,这些项目提供了丰富的功能,如服务发现、配置管理、限流降级、消息驱动等。例如,Nacos提供了可视化的管理界面,方便监控和管理服务的状态;
2025-04-29 08:30:00
511
原创 为什么我使用了索引,有时发现查询还是会慢?
在线上系统运行时,有时发现查询SQL很慢,使用EXPLAIN把SQL提取下来,查看执行结果也使用了索引,查询仍然很慢,可能有多种原因。复杂的查询、过多的连接操作、不必要的子查询等都可能导致查询变慢。使用 EXPLAIN 或类似的命令查看查询的执行计划,了解数据库是如何执行查询的。重写查询,避免不必要的复杂操作,使用适当的索引提示(如 `USE INDEX`)。检查是否使用了复合索引(多列索引),并确保查询条件中的列顺序与索引定义一致。通过以上方法,你可以逐步找到查询慢的原因,并采取相应的措施进行优化。
2025-04-29 08:00:00
928
原创 说说你在项目中是如何优化代码性能的?
具体而言,系统可配置定时任务,按照预设的时间间隔扫描数据库中的待处理记录,并逐一执行数据处理逻辑;或者,通过MQ机制,将待处理记录封装成消息发布至消息队列,由独立的消费者服务订阅并消费这些消息,实现数据的异步处理。用户发起数据导入请求后,系统首先在后台数据库中生成一条待处理记录,该记录包含任务的详细信息及状态标识。使用HashMap<Integer, User>来存储用户信息,通过用户ID快速查找,时间复杂度为O(1)。通过以上这些措施,可以在不同的开发场景下有效提升Java应用的性能。
2025-04-28 08:30:00
1096
原创 如何优化提升接口性能的一点建议
通过使用Apache HttpClient的连接池,可以减少连接建立的时间,设置gzip压缩传输,提高请求效率。上面这个例子中,发邮件或短信通知功能,对实时性要求不高,即使晚点发通知,用户无非是晚点收到通知,对业务影响不大,所以完全可以异步处理,避免阻塞主线程。软件负载均衡:在一个云服务平台中,使用Nginx作为反向代理和负载均衡器,可以根据服务器的负载情况动态调整请求的分配,优化资源利用。如果我们将这些任务并行处理,那么接口的响应时间将取决于耗时最长的模块,而不是所有模块耗时的总和。
2025-04-28 08:00:00
802
原创 RocketMQ Broker中的消息被消费后会不会立即删除?
在RocketMQ的Broker中,消息一旦被发送到Broker并存储于CommitLog文件中,即使被消费者成功消费,这些消息也不会立即从CommitLog中删除。因此,默认情况下,RocketMQ采用延迟删除策略,即在消费者确认消费后,将消息标记为“已消费”,但并不立即删除,而是延迟一段时间后再进行实际删除。这意味着,即使消息已经被消费者成功消费,它们仍然会在Broker中保留72小时。:如果新的消费者订阅了之前已经发送过消息的主题,那么这些消息仍然可以被新的消费者消费到,前提是这些消息还没有被删除。
2025-04-27 08:15:00
538
基于Spring Security框架构建的统一身份认证体系,包含登录功能,登录成功或失败后自定义返回格式,用户权限功能,自定义登录页面,相关数据库脚本
2025-05-10
ubuntu安装mysql详情步骤.txt
2019-07-21
eclipse支持jdk1.7+tomcat6.0以上版本
2018-11-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅