自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1221)
  • 资源 (1)
  • 收藏
  • 关注

原创 Spring生态的缓存方案:多级缓存架构实现(Caffeine + Redis)

摘要:Spring生态中的多级缓存架构(Caffeine+Redis)实现方案分析。Spring Cache作为抽象层,提供统一缓存API,支持@Cacheable等注解简化开发。本地缓存首选Caffeine(基于W-TinyLFU算法),性能优于Guava;Redis则适用于分布式缓存场景。建议组合使用Caffeine(本地高频访问)和Redis(跨节点共享),通过@CacheEvict实现缓存一致性控制。高级技巧包括:复合键生成策略、条件缓存控制、批量缓存清理及事务性缓存处理。多级缓存架构能有效平衡性能

2025-11-09 05:15:00 1297

原创 什么是Spring的循环依赖

摘要:Spring循环依赖是指多个Bean相互依赖导致初始化失败的问题,常见于构造函数或setter注入场景。文章通过ServiceA和ServiceB相互依赖的示例,分析了循环依赖的形成过程及Spring容器的死锁问题,并提供了两种解决方案:优先推荐使用setter方法注入避免循环依赖,或使用@Lazy注解延迟初始化来解决构造函数注入的循环依赖问题。这些方法是掌握Spring高级特性的重要知识点。(148字)

2025-11-07 05:15:00 298

原创 spring三级缓存以及如何解决循环依赖

Spring 三级缓存机制通过三个层级(singletonObjects、earlySingletonObjects、singletonFactories)解决循环依赖问题。核心思路是:当实例化Bean时,先创建对象并放入三级缓存;在依赖注入阶段,若发现循环依赖,可以从二级缓存获取未完全初始化的Bean;最终完成初始化后移入一级缓存。这种机制允许Spring在Bean未完全初始化时就提供引用,从而打破循环依赖链。需要注意的是,这种方式仅适用于单例Bean且不支持构造函数注入的循环依赖场景。

2025-11-06 05:15:00 588

原创 Spring事务失效的原因

Spring事务失效常见原因包括:1)非事务方法直接调用事务方法导致代理失效;2)事务传播行为设置不当,如使用PROPAGATION_SUPPORTS可能不会开启新事务;3)异常处理不当,捕获异常未重新抛出导致事务无法回滚;4)事务管理器配置错误,如未正确设置数据源。解决方法包括通过代理调用事务方法、选择合适的传播行为、正确处理异常以及正确配置事务管理器。这些问题的本质在于对Spring事务代理机制和工作原理理解不足。

2025-11-05 05:15:00 847

原创 spring bean是否为线程安全的?

Spring Bean线程安全性分析 Spring Bean的线程安全性取决于其作用域和状态设计: 单例Bean(默认):线程不安全,需通过同步机制(synchronized/Lock)、原子类(AtomicInteger)或无状态设计保证安全 无状态Bean:不包含可变共享状态时线程安全 原型Bean(prototype):每次请求新实例,天然线程安全 典型问题:单例Bean中的可变状态(如计数器)在多线程环境下需特殊处理。解决方案包括使用同步方法、线程安全集合或改为原型作用域。 关键点:合理选择作用域,

2025-11-04 05:15:00 537

原创 Spring中用到的设计模式

Spring框架广泛应用了多种设计模式,包括工厂模式(BeanFactory)、单例模式(Bean管理)、代理模式(AOP)、模板方法模式(JdbcTemplate)、观察者模式(事件机制)和适配器模式(HandlerAdapter)。这些模式使Spring具备松耦合、易扩展的特性,如工厂模式统一创建对象、代理模式实现事务管理、观察者模式处理事件监听。理解这些模式有助于深入掌握Spring的设计思想和工作原理。

2025-11-03 05:15:00 1650

原创 Spring启动过程中做缓存预热

文章摘要:本文介绍了在Spring启动过程中实现缓存预热的5种方法:1) 使用ApplicationListener监听ContextRefreshedEvent或ApplicationReadyEvent事件;2) 通过@PostConstruct注解在Bean初始化后执行;3) 实现CommandLineRunner或ApplicationRunner接口;4) 使用@Scheduled注解定时执行;5) 实现InitializingBean接口。每种方法都提供了代码示例,开发者可根据实际场景选择合适的

2025-11-02 05:15:00 227

原创 spring中常用注解

Spring框架提供了多种常用注解来简化开发,主要包括: 组件注解:@Component(通用)、@Service(业务层)、@Controller(控制层)、@Repository(数据层)和@RestController(REST API) 依赖注入:@Autowired自动装配,@Qualifier指定具体Bean 配置相关:@Configuration声明配置类,@Bean定义Bean 其他重要注解:@Primary指定优先Bean,@Scope定义Bean作用域 这些注解通过声明式配置大大简化了S

2025-11-01 05:15:00 1223

原创 SpringMVC的执行流程

SpringMVC执行流程摘要 Spring MVC的执行流程主要包含6个关键步骤:1) DispatcherServlet作为前端控制器拦截所有请求;2) HandlerMapping查找匹配的控制器;3) HandlerAdapter调用控制器方法;4) Controller处理业务并返回视图名;5) ViewResolver解析视图路径;6) View渲染返回响应。整个过程通过组件协作完成请求处理,开发者只需关注Controller和View的开发,其他组件由框架自动管理,这种分层设计简化了Web开发

2025-10-31 05:15:00 732

原创 Spring事务的隔离级别

摘要:Spring事务的隔离级别定义了事务间的隔离程度,防止并发问题。主要包含五种级别:DEFAULT(使用数据库默认)、READ_UNCOMMITTED(允许脏读)、READ_COMMITTED(防止脏读)、REPEATABLE_READ(防止不可重复读)和SERIALIZABLE(最高级别,防止所有并发问题)。通过@Transactional注解设置隔离级别,开发者可根据业务需求选择合适级别,在数据一致性和性能之间取得平衡。代码示例展示了不同级别在实际场景中的应用方式。

2025-10-30 05:15:00 1515

原创 Spring事务的实现方式和原理

摘要:Spring事务管理通过AOP和事务管理器实现,核心是事务管理器(如DataSourceTransactionManager)负责事务的生命周期管理。使用@Transactional注解配置事务属性(传播行为、隔离级别等),Spring通过AOP代理在方法调用前后插入事务逻辑。事务同步机制确保资源正确同步。示例展示了JPA事务管理器的配置和事务代理的实现原理,体现了Spring事务的声明式管理特点。

2025-10-29 05:15:00 579

原创 JDK动态代理和CGLIB动态代理的区别

摘要:JDK动态代理和CGLIB动态代理是两种常用代理技术。JDK代理基于反射机制,仅能代理实现接口的类;CGLIB通过生成子类实现代理,可代理无接口类。JDK代理性能较好,适用于接口实现类;CGLIB适用于无接口类或需代理类方法的情况。代码示例展示了两种代理的具体实现方式:JDK需实现InvocationHandler,CGLIB需实现MethodInterceptor。选择代理方式应根据业务需求决定,有接口优先JDK,无接口则用CGLIB。

2025-10-28 10:27:19 392

原创 说下Spring事务传播机制

Spring事务传播机制定义了方法调用时事务的处理方式,主要包括7种行为:REQUIRED(默认,存在加入/不存在新建)、SUPPORTS(存在加入/不存在非事务)、MANDATORY(存在加入/不存在抛异常)、REQUIRES_NEW(总是新建事务)、NOT_SUPPORTED(非事务执行)、NEVER(非事务且存在事务抛异常)、NESTED(嵌套事务)。通过@Transactional注解可指定传播行为,如REQUIRES_NEW会开启独立事务,失败不影响原事务。合理选用传播机制能确保事务正确性和数据一

2025-10-27 05:15:00 544

原创 Spring AOP在项目中的应用场景

Spring AOP在项目中主要应用于横切关注点的管理,常见场景包括: 日志记录:通过切面统一记录方法调用、参数和返回值,无需修改业务代码 事务管理:集中处理事务的开启、提交和回滚,避免重复代码 性能监控:使用环绕通知测量方法执行时间 这些AOP应用通过将横切逻辑与业务逻辑分离,提高了代码的可维护性和复用性,同时保持了业务代码的简洁性。示例展示了如何通过定义切点和通知来拦截特定方法执行,实现日志、事务和性能监控等通用功能。

2025-10-26 05:15:00 393

原创 谈谈你对AOP的理解

AOP(面向切面编程)是Spring框架的重要特性,通过将横切关注点(如日志、事务)从业务逻辑中分离,提高代码模块化和可维护性。文中以UserService为例,展示了如何通过定义切面(@Aspect)和切入点(@Pointcut)实现方法执行前后的日志记录,而无需修改业务代码。AOP的核心优势在于解耦代码、提升可维护性和扩展性,使开发者能集中管理横切关注点。通过@EnableAspectJAutoProxy启用AOP支持,Spring实现了这一编程范式。

2025-10-25 05:15:00 656

原创 谈谈你对Spring IOC的理解

Spring IoC(控制反转)是Spring框架的核心,通过反转对象控制权来降低代码耦合度。传统方式中类直接创建依赖对象,而IoC由Spring容器管理依赖注入。示例展示了UserService通过@Autowired自动注入Logger依赖,由Spring容器配置Bean。IoC的优势包括解耦、可扩展(如更换Logger实现)和生命周期管理。Spring IoC使系统更灵活、可维护,是构建现代应用的重要设计原则。

2025-10-24 05:15:00 900

原创 SpringBean的初始化过程

Spring Bean的初始化过程是Spring框架中的一个重要环节。文章通过UserService示例展示了三种初始化方式:1)通过@Bean的initMethod属性指定初始化方法;2)实现InitializingBean接口重写afterPropertiesSet方法;3)使用@PostConstruct注解标记初始化方法。初始化过程包括实例化Bean、依赖注入和调用初始化方法三个主要步骤,其中初始化方法适合执行加载配置等准备工作。这三种方式都能确保Bean在使用前处于正确状态,开发者可根据项目需求选

2025-10-23 05:15:00 796

原创 MySQL数据库为何逐渐黯淡,PostgreSQL为何能新王登基

摘要: PostgreSQL近年来超越MySQL成为最受欢迎的数据库,其亮点功能包括: 面向对象支持:支持自定义类型、表继承等特性,更符合编程思维; 丰富字段类型:内置CIDR(网络地址)、几何图形等特殊类型,满足多样化需求; 强大JSON处理:提供->、->>等操作符及GIN索引,高效查询JSON数据; 灵活继承机制:通过表继承实现数据隔离与扩展,支持ONLY关键字过滤查询。 相比之下,MySQL在复杂类型和高级功能上略显不足,促使开发者转向功能更全面的PostgreSQL。

2025-10-22 05:15:00 1027

原创 SpringBean的生命周期

文章摘要: Spring Bean的生命周期包括实例化、属性赋值、初始化、使用和销毁五个阶段。通过一个用户服务类(UserService)的代码示例,展示了Spring如何管理Bean的创建、依赖注入(@Autowired)、初始化(init方法)和销毁(destroy方法)过程。理解这些生命周期阶段有助于更好地掌握Spring框架的工作机制,提高代码的可维护性。文章最后总结了各阶段的作用及合理利用这些阶段的重要性。

2025-10-22 05:15:00 548

原创 你们公司的 QPS 是怎么统计出来的?这 5 种常见方法我踩过一半的坑

这篇文章总结了5种常见的QPS统计方法及其典型应用场景和注意事项: 网关层统计(Nginx/Spring Cloud Gateway) 适合微服务分布式项目 注意过滤健康检查请求 分布式环境需汇总数据 应用层埋点(Spring AOP) 适合单服务接口级统计 可精确到方法级别 示例展示了拦截Controller的切面实现 日志分析(ELK/Flume) 适合离线容量评估 依赖完整日志收集 监控系统(Prometheus) 适合实时可视化 需要埋点暴露指标 中间件统计(Redis/MQ) 适合特定组件压力评估

2025-10-21 05:15:00 1642

原创 SpringCloud组件整体串讲,开发中常用组件重点讲解

Spring Cloud是基于Spring Boot的微服务架构开发框架,提供分布式系统常见问题的解决方案。核心组件包括:Eureka(服务注册与发现,通过注册中心实现服务间调用)、Ribbon(负载均衡,支持多实例服务调用)、Feign(声明式服务调用,简化接口开发)和Hystrix(断路器,防止服务雪崩)。以电商系统为例,展示了各组件的配置代码和实际应用场景,如订单服务调用商品服务、用户服务调用支付服务等。这些组件协同工作,可构建高可用、高性能的分布式系统。

2025-10-20 05:45:00 1416

原创 Java 要变天了,新提案将支持类型类 type classes

Java即将迎来重大变革,新提案将引入类型类(type classes)机制,旨在提升语言的可扩展性。类型类允许在不修改现有类继承关系的情况下,为任何封闭数据类型添加新行为。这一特性将解决传统接口的局限性,如为现有类型添加新行为、抽象类型本身的行为、为同一类型提供多种行为实例等。关键实现包括"见证"(Witness)机制,通过静态字段或方法发布行为证明,编译器在编译时自动查找合适见证。该特性将带来隐式类型转换、运算符重载(仅限于值类型)、集合字面量等实用功能,显著增强Java的表达能力,

2025-10-19 05:15:00 717

原创 java项目怎么封装异常,会将哪些异常归于一类

异常封装是为了隐藏底层细节、统一处理策略和提高可读性。通常将异常分为系统级异常(如数据库、网络问题)、业务逻辑异常(如用户不存在)和第三方异常封装。自定义异常类可按业务模块定义,继承自基础异常类。实际应用中,底层异常应转换为业务相关异常,并保留原始异常信息。系统异常需要详细记录日志,而业务异常可简要记录。通过统一异常处理和分层设计,能提高代码的可维护性和扩展性。

2025-10-18 05:45:00 314

原创 怎么部署高可用的redis集群模式

Redis集群模式通过多节点部署实现高可用,支持数据分片和自动故障转移。部署步骤包括:1)准备6个节点(3主3从);2)配置cluster-enabled参数;3)启动所有节点;4)使用redis-cli创建集群并设置主从关系。集群通过哈希槽(16384个)自动路由请求,主节点故障时从节点会自动提升。客户端需支持集群协议(如JedisCluster),实现自动重定向和分片访问。生产环境建议多机部署,并配置持久化与监控。

2025-10-17 05:45:00 1243

原创 支付的时候第三方回调不及时或者失败怎么处理

支付系统回调失败或延迟是常见问题。本文提出5种解决方案:1)幂等处理防止重复回调;2)确认机制确保第三方知晓回调结果;3)主动轮询查询支付状态;4)消息队列+重试机制保证最终一致性;5)日志监控及时发现异常。关键措施包括:回调接口设计幂等性、定时补偿查询、异步处理回调消息。通过代码示例展示了回调接口实现和定时任务查询支付状态的方法,建议结合业务场景设计超时重试和补偿机制,确保支付状态最终一致。

2025-10-16 09:30:16 423

原创 redis的哨兵模式是什么

Redis哨兵模式是一种高可用解决方案,用于监控Redis主从集群的运行状态,实现自动故障转移和通知报警。它通过持续监控主从节点,在主节点故障时自动选举新主节点并通知客户端,确保服务不中断。典型架构包含多个哨兵节点、主节点和从节点,核心功能包括监控、通知、自动故障转移和配置提供。客户端需支持哨兵协议以获取主节点地址,适用于关键业务缓存等高可用场景。哨兵模式能有效避免Redis单点故障,是Redis高可用架构的重要组成部分。

2025-10-14 05:15:00 673

原创 缓存和数据库一致性中,延迟双删和监听binlog两个方案的过程及在极端情况下会出现的问题

文章摘要:本文对比了两种保障缓存一致性的方案。延迟双删通过先删缓存、更新数据库、再延迟删缓存的方式减少脏数据问题,但存在并发边界情况无法完全解决。监听Binlog方案(如Canal)异步处理数据库变更事件,实现业务解耦,但对日志同步链路稳定性要求高。实际应用中,电商商品等弱一致性场景适合Binlog方案,余额/库存等强一致性需求可采用延迟双删+兜底策略。两种方案各有优劣,需根据业务特点选择。 (149字)

2025-10-13 05:15:00 374

原创 JDK动态代理与CGLIB实现区别

JDK动态代理与CGLIB代理的主要区别:1)JDK基于接口,要求目标类实现接口,通过反射机制创建代理;CGLIB通过子类继承方式实现,无需接口。2)JDK性能较低(反射调用),CGLIB性能较好(直接调用)。3)JDK适用于有接口的场景,是Java原生支持;CGLIB适用于无接口的类,需要额外依赖库。4)JDK代理对象创建简单,CGLIB生成字节码时开销较大但后续调用高效。选择依据主要是目标类是否实现接口及对性能的要求。

2025-10-12 05:15:00 919

原创 什么是反射,谈谈你对他的理解

Java反射机制允许程序在运行时动态查询和操作类、接口、字段及方法等信息,实现动态加载类、创建对象、调用方法和访问字段等功能。其核心优势在于灵活性和扩展性,常用于插件式架构、框架开发等场景。但反射存在性能开销和安全风险,需谨慎使用。典型应用包括Spring框架的依赖注入和JDK动态代理等。

2025-10-11 05:15:00 444

原创 反射为什么会慢

反射操作比直接调用方法慢,主要由于运行时需动态解析类、方法及字段信息,并进行类型检查。具体原因包括:动态解析涉及类加载和字节码解析,类型检查增加额外开销,缓存机制虽优化但仍需时间。性能对比显示,反射调用耗时明显高于直接调用。优化建议:减少反射次数、缓存反射对象、使用MethodHandles替代。尽管反射有性能损耗,但在框架开发等场景仍不可或缺,合理优化可降低开销。

2025-10-10 05:15:00 454

原创 什么是浅拷贝和深拷贝,以及它们之间的区别

浅拷贝和深拷贝是对象复制的两种方式。浅拷贝只复制对象的值类型字段和引用类型字段的引用,原始对象和副本会共享引用对象。深拷贝则会完全复制所有字段,包括引用类型字段指向的对象,使副本完全独立。在Java示例中,修改浅拷贝对象的地址会影响原对象,而深拷贝则不会。浅拷贝适用于字段多为值类型或不需要独立引用对象的情况,深拷贝则适用于需要完全独立副本的场景。

2025-10-09 05:15:00 293

原创 Java中线程安全集合

本文介绍了Java中线程安全集合的概念和常见实现。主要内容包括:1)线程安全集合的基本定义;2)六大常见线程安全集合类(Vector、Stack、Hashtable、ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet)及其特性;3)在线教育平台的两个实际应用场景分析;4)代码示例展示不同集合类的使用方式;5)总结各集合类的优缺点,指出Vector和Hashtable线程安全但性能较低,CopyOnWrite系列读快写慢,ConcurrentH

2025-10-08 09:17:55 279

原创 “热点数据永不过期”方案

摘要: 针对电商秒杀活动等高频访问、极少变更的热点数据,采用“Redis永不过期缓存”方案可避免缓存击穿。核心流程:1)系统启动或定时任务主动加载数据至Redis(不设TTL);2)用户请求直接读取缓存;3)数据变更时由后台手动更新缓存与数据库。此方案通过确保缓存持续可用,防止瞬时高并发请求压垮数据库。适用场景:极高频访问且几乎不变的数据(如首页推荐商品),需配合后台主动更新机制保障一致性。 (字数:149)

2025-09-13 05:15:00 447

原创 为什么复杂的架构一定要做分层设计?

摘要:分层设计是复杂系统架构的重要原则,通过职责分离提升可维护性、可扩展性和安全性。它遵循单一职责和开闭原则,支持独立修改和优化各层功能,提高代码复用性和团队协作效率。实际案例如电商系统和社交平台证明,分层设计能有效管理复杂性,支持功能扩展和性能优化,是构建高质量系统的关键方法。

2025-09-12 05:15:00 1004

原创 【办公自动化】如何使用Python库高效自动化处理图像?

本文介绍了如何使用Python库实现办公自动化中的图像处理任务。通过Pillow和OpenCV两个强大的库,可以高效完成批量缩放、裁剪、水印添加和格式转换等操作。文章重点讲解了Pillow的基本使用方法,包括图像打开/保存、尺寸调整(含等比例缩放)、裁剪、旋转、格式转换以及添加文字水印等常见功能,并提供了详细的代码示例。这些自动化方法能显著提升办公效率,减少重复性工作,特别适合需要处理大量图像文件的场景。

2025-09-11 05:15:00 675

原创 vue3高德地图api整合封装(自定义撒点、轨迹等)

本文总结了Vue3项目中高德地图API的封装实现,主要包含地图初始化、交通图层控制、自定义撒点标记和轨迹回放等功能。通过自定义DOM元素实现不同状态的撒点样式(在线/充电/停车),并支持聚合显示。文章提供了核心代码片段,包括地图初始化配置、交通图层管理以及自定义标记DOM构建方法,重点解决了不同类型点位显示和聚合交互问题。实现过程中通过插件注入方式集成了地图缩放、工具条、地理编码等常用功能,为类似地图应用开发提供了参考方案。

2025-09-10 05:15:00 819

原创 Elasticsearch有哪几种分页方式?该如何选择?

Elasticsearch 提供四种主要分页方式:1) from/size 简单易用但深页性能差,适合浅分页;2) search_after 高效处理深页但需维护状态,适合连续数据流;3) Scroll API 适合批量处理大数据但资源消耗大;4) Point in Time 保证数据一致性,适合结合 search_after 使用。选择时应考虑分页深度、数据一致性要求和资源限制,浅页用 from/size,深页用 search_after,批量处理用 Scroll,一致性要求高则用 PIT。

2025-09-09 05:15:00 1042

原创 博彦科技真实面试问题

这是一篇关于技术面试的对话记录,主要围绕高并发系统设计展开讨论。内容包括:自我介绍、项目功能讲解、线程接入框架方式、系统流量和TPS数据、幼儿园系统并发支撑方案、数据库优化(分库分表)、Redis分布式锁实现、MySQL索引结构等核心技术问题。同时涉及研发流程(编码、自测、联调)、工作强度等常规面试问题,最后包含异地工作等生活问题。对话展现了典型的技术面试场景,全面考察候选人的系统设计能力、技术深度和工作适应性。

2025-09-08 10:47:49 180

原创 揭秘Webpack:从零实现一个简易JavaScript打包器

本文介绍了如何实现一个简易JavaScript模块打包器,核心流程包括:1)解析入口文件生成AST并收集依赖;2)递归构建完整依赖图;3)将依赖图转换为可执行代码。通过@babel相关工具实现代码解析、依赖分析和ES6转ES5,最终生成一个立即执行函数(IIFE)打包结果。该实现模拟了Webpack等现代打包工具的核心功能,展示了模块化代码如何被转换为浏览器可执行的单一文件。关键点包含:依赖图构建、模块隔离处理、require/exports机制模拟等,为理解前端工程化工具原理提供了实践参考。

2025-09-07 05:15:00 635

原创 vue实现甘特图效果

本文介绍了使用Vue实现甘特图效果的关键技术方案。主要内容包括: 数据结构设计:定义父子任务的数据结构,包含任务ID、名称、时间戳、状态、进度等字段,支持层级任务树结构。 时间轴算法:实现本周/本月/本季三种时间周期视图,包含日期范围计算和时间线日期生成逻辑。 核心定位算法:详细说明了任务条在时间轴上的精确定位方法,包括时间标准化、有效范围计算和位置百分比转换。 组件结构:采用分层设计,包含筛选区、时间轴头部和任务行主体,支持父子任务的展开/折叠功能。 该方案通过合理的数据结构和精确的定位算法,实现了专业级

2025-09-06 05:15:00 1495

day01_项目介绍和工程搭建.md

day01_项目介绍和工程搭建.md

2021-09-04

空空如也

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

TA关注的人

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