
Spring
文章平均质量分 82
本专栏聚焦于Spring 框架及相关生态体系,旨在为 Java 开发者提供从基础入门到高级应用的全方位技术内容。通过系统化的知识梳理、实战案例解析和源码深度剖析,帮助读者掌握 Spring 技术栈的核心原理与开发技巧,解决实际项目中的常见问题,提升企业级应用开发能力。
shangjg3
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Nacos服务注册与发现原理
Nacos的服务注册与发现机制解析:阿里巴巴开源的Nacos组件通过NamingService接口实现服务注册与发现功能。服务注册流程包含实例注册、持久化存储和心跳维持;服务发现采用订阅-推送模式,配合本地缓存实现高效调用。核心源码展示了ClientWorker处理注册/发现逻辑,ServiceInfoHolder管理服务信息缓存,NamingProxy负责与服务器通信。该机制支持客户端心跳和服务端主动检查两种健康监测方式,通过长轮询+推送实现配置实时同步,为微服务架构提供可靠的注册发现解决方案。原创 2025-06-12 18:26:23 · 572 阅读 · 0 评论 -
Eureka 心跳续约机制
摘要: Eureka的心跳续约机制是微服务架构中保障服务可用性的核心机制,通过客户端定时(默认30秒)向服务端发送续约请求,维护服务实例的存活状态。服务端基于续约情况触发自我保护模式(15分钟内续约成功率低于85%时)或剔除故障服务(默认90秒未续约)。关键参数包括续约间隔(leaseRenewalIntervalInSeconds)和服务过期时间(leaseExpirationDurationInSeconds),需根据场景调优。对比Consul、Nacos,Eureka依赖HTTP协议且具备自我保护特性原创 2025-06-12 17:13:10 · 1016 阅读 · 0 评论 -
Eureka 服务注册与发现原理和使用
多个 Eureka Server 互相注册,形成集群(如 Server A 注册到 Server B,Server B 注册到 Server A)。:分为服务提供者(Producer)和服务消费者(Consumer),负责与 Server 交互。服务启动时,Client 向 Server 发送注册请求,携带服务元数据(如服务名、IP、端口)。Client 定期(默认 30 秒)向 Server 发送心跳请求(续约),表明服务存活。Server 接收请求后,将服务信息存入注册表,并返回注册成功响应。原创 2025-06-12 14:00:06 · 905 阅读 · 0 评论 -
Spring容器概念、原理与应用实践
Spring容器是Spring框架的核心,负责创建、管理和装配对象(Bean),并提供依赖注入、生命周期管理、AOP等服务。其核心接口包括BeanFactory和ApplicationContext,后者扩展了企业级功能。容器通过加载配置元数据、解析配置信息、实例化和初始化Bean来启动。BeanDefinition是容器内部表示Bean配置的核心数据结构。Spring容器支持多种依赖注入方式、Bean作用域和生命周期回调,并提供了基于注解的配置、条件化Bean注册和Bean后处理器等高级特性。Spring原创 2025-05-25 05:00:00 · 26 阅读 · 0 评论 -
Spring Bean 的定义与管理、配置方式详解
Spring框架中的Bean是应用程序的核心组件,负责承载业务逻辑与功能实现。Spring IoC容器负责Bean的实例化、配置和管理,处理其生命周期和依赖关系。Bean的生命周期包括实例化、属性注入、初始化、使用和销毁等阶段。Spring提供了多种作用域,如单例(singleton)、原型(prototype)、请求(request)和会话(session),以适应不同场景的需求。Bean的配置方式包括传统的XML配置、注解配置和Java配置类方式。XML配置清晰直观,适合复杂场景;注解配置简化了开发流程原创 2025-05-22 15:49:18 · 130 阅读 · 0 评论 -
Spring DI(依赖注入)的概念、原理与应用场景
依赖注入(DI)是Spring框架的核心特性,属于控制反转(IoC)的一种实现方式。其核心思想是将对象之间的依赖关系从代码内部解耦,通过外部配置或容器来管理对象的创建和依赖关系注入。DI的关键术语包括依赖和注入,依赖指的是一个对象需要使用另一个对象的功能,而注入则是在创建对象时通过外部将其依赖的对象传入。DI的实现原理是通过Spring容器管理所有对象的生命周期,并在需要时将依赖对象注入到目标对象中。DI的应用场景包括解耦业务层与数据层、跨层依赖管理、复杂依赖关系管理以及模块化开发与组件复用。DI的优势在于原创 2025-05-23 06:00:00 · 26 阅读 · 0 评论 -
Spring IOC(控制反转)的概念、原理与应用场景
通过 Spring IOC,我们可以将这些服务的创建和注入交给 Spring 容器管理,使得订单服务无需关心其他服务的具体实现和创建过程,降低了系统的耦合度,提高了系统的可维护性和可扩展性。在实际开发中,我们应根据项目的具体需求,合理运用 Spring IOC,充分发挥 Spring 框架的优势,打造出高质量、可维护的应用程序。通过 Spring IOC,我们可以将插件定义为 Bean,在系统启动时由 Spring 容器加载和管理这些插件,并根据配置将插件注入到相应的模块中,实现插件的动态加载和使用。原创 2025-05-23 05:45:00 · 131 阅读 · 0 评论 -
Spring AOP(1)—— Spring AOP的基本概念、增强类型、切点类型与切面类型
Spring AOP(面向切面编程)是Spring框架的核心模块之一,旨在通过分离横切关注点(如日志记录、事务管理等)来提高代码的模块化和可维护性。本文详细介绍了Spring AOP的基本概念,包括切面、连接点、切点、增强和织入,并探讨了其实现原理,主要基于JDK动态代理和CGLIB代理。文章还深入分析了Spring AOP的五种增强类型:前置增强、后置增强、返回后增强、抛出异常后增强和环绕增强,以及多种切点表达式类型,如execution、within、this、target和args。此外,文章介绍了基原创 2024-07-11 11:50:26 · 700 阅读 · 0 评论 -
Spring AOP(2)—— Spring AOP的实现原理
它可以实现不用写代理类的实现就可以创建代理类对象;通过代理类对象执行目标接口中的方法,会把方法的调用分派给调用处理器(InvocationHandler)的实现类,执行实现类中的invoke()方法,我们需要把在该invoke()方法中实现调用目标类的目标方法;2.代理角色(连接真实角色的桥梁):实现抽象角色,是真实角色的代理,通过真实角色的角色业务逻辑方法,来实现抽象方法,附加自己的操作。3.真实角色(需要被代理的对象):实现抽象角色,定义真实的角色所要实现的业务逻辑,提供代理角色调用。原创 2024-06-28 17:16:12 · 824 阅读 · 0 评论 -
Spring AOP(3)—— 使用Spring代理工厂实现AOP 切面
这里有个值得注意的问题:从容器中获得proxy对象时应该是org.springframework.aop.framework.ProxyFactoryBean类型的对象(如下代码所示),但这里直接就转换成IMath类型了,这是因为:ProxyFactoryBean本质上是一个用来生产Proxy的FactoryBean。如果容器中的某个对象持有某个FactoryBean的引用它取得的不是FactoryBean本身而是 FactoryBean的getObject()方法所返回的对象。即,它是类中的一个方法。原创 2024-07-15 16:45:14 · 453 阅读 · 0 评论 -
Spring AOP(4)—— 使用 AspectJ实现AOP 切面
上面的代码中我们就是在@Before()中直接指定使用当前类定义的beforeAdd()方法对应的Pointcut的表达式,如果我们需要指定的Pointcut定义不是在当前类中的,我们需要加上类名称,如下面这个示例中引用的就是定义在MyService中的add()方法上的Pointcut的表达式。标准的Aspectj Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是10种类型的表达式,分别如下。原创 2024-07-15 16:48:39 · 529 阅读 · 0 评论 -
Spring的启动过程
在实例化 Bean 的过程中,Spring 容器会解析 Bean 之间的依赖关系,并将依赖的 Bean 注入到需要它们的 Bean 中。如果应用程序中使用了 AOP(面向切面编程),Spring 将会应用切面逻辑,为 Bean 动态生成代理,并将切面逻辑织入到相应的 Bean 中。Spring 容器会根据配置文件中的定义,实例化所有的 Bean。一旦所有的 Bean 实例化、依赖注入和初始化工作完成,Spring 容器就会完成启动过程,应用程序就可以开始处理请求和响应了。原创 2024-07-16 04:15:00 · 430 阅读 · 0 评论 -
Spring是如何解决循环依赖的
通过这种方式,Spring可以确保在需要时提供正确的对象实例,无论是原始对象还是其代理对象,从而解决了循环依赖的问题。:在某些情况下,二级缓存用于存储Bean的代理对象或原始实例,以避免重复创建。然而,在处理循环依赖时,二级缓存不足以解决问题,因为它不能确保在需要时总是提供正确的对象实例。当其他Bean依赖这个Bean时,可以直接从缓存中获取实例,避免重复创建。通过上面的图,仔细分析一下,其实把二级缓存拿掉,在 B 尝试获取 A 的时候直接返回 A 的实例,是不是也是可以的?原创 2024-07-18 17:11:10 · 2257 阅读 · 0 评论 -
Spring 依赖注入源码深度剖析
通过对 Spring 依赖注入源码的深入分析,我们了解了 Spring 如何加载和解析 Bean 定义,如何创建 Bean 实例并进行依赖注入,以及自动装配功能的实现原理。在 populateBean 方法中,会根据 BeanDefinition 中的信息,使用不同的注入方式(如按名称注入、按类型注入)将依赖对象注入到目标对象中。在 autowireByType 方法中,会遍历目标对象的属性,根据属性的类型从 BeanFactory 中查找匹配的 Bean 实例,并将其注入到属性中。原创 2025-05-09 05:00:00 · 48 阅读 · 0 评论 -
Spring 框架线程安全的五大保障策略解析
在高并发互联网应用中,线程安全是系统稳定运行的关键。Spring框架通过多种技术手段为开发者提供了全面的线程安全支持。首先,Spring采用线程安全的数据结构如ConcurrentHashMap,通过分段锁机制提升并发性能并保证数据正确性。其次,Spring利用对象锁定机制,如synchronized关键字,确保多线程环境下对象的操作安全。第三,Spring通过线程池管理线程,减少资源消耗,提高系统稳定性和响应速度。第四,Spring的事务管理功能保障数据一致性,自动回滚异常操作。最后,Spring默认采用原创 2025-05-18 06:30:00 · 49 阅读 · 0 评论 -
Spring 框架中的经典设计模式
Spring框架在Java开发中广泛应用,其成功得益于多种经典设计模式的巧妙运用。单例模式通过减少对象创建和销毁的开销,提升了系统性能;工厂模式通过IoC容器管理Bean,降低了代码耦合度;代理模式通过AOP实现功能增强,如日志记录和事务管理;模板方法模式简化了重复代码,提高了代码复用性;观察者模式通过事件驱动模型实现模块解耦;适配器模式解决了接口不兼容问题;策略模式则提供了灵活多变的算法选择。这些设计模式不仅增强了Spring框架的功能和灵活性,也为开发者提供了高效的开发范式,有助于编写结构清晰、可维护性原创 2025-05-19 06:00:00 · 38 阅读 · 0 评论 -
Spring 事务(1)—— Spring 事务管理完全解析
摘要: Spring事务管理通过抽象数据库事务操作,提供统一接口确保数据一致性。核心概念包括事务的ACID特性(原子性、一致性、隔离性、持久性)及三大组件:事务管理器(PlatformTransactionManager)、事务定义(TransactionDefinition)和事务状态(TransactionStatus)。Spring支持两种事务管理方式: 编程式事务:通过TransactionTemplate手动控制事务边界,灵活性高但代码耦合性强,适用于复杂动态场景。 声明式事务:基于AOP(@Tr原创 2024-07-16 03:00:00 · 253 阅读 · 0 评论 -
Spring 事务(2)—— Spring 事务隔离级别与使用方式
在 Spring 框架的企业级开发中,事务管理是保证数据一致性和完整性的核心机制,而事务隔离级别则是控制并发事务之间相互影响的关键要素。Spring 事务隔离级别是应对并发事务问题的重要手段,通过@Transactional注解、XML 配置或编程式事务管理等方式,能灵活设置隔离级别。开发者需深入理解各隔离级别的特性,结合业务场景合理选择,在保障数据一致性的同时,兼顾系统并发性能,从而打造出稳定可靠的企业级应用。:事务 A 读取到事务 B 未提交的数据,若事务 B 回滚,事务 A 读取的数据则为无效数据。原创 2024-06-29 03:00:00 · 533 阅读 · 0 评论 -
Spring 事务(3)—— Spring 事务传播行为详解
事务传播行为决定了在嵌套事务调用时,新事务如何与现有事务关联。例如,当一个带事务的方法调用另一个带事务的方法时,Spring 需要明确如何管理这些事务的边界。通过本文的介绍和示例代码,能够深入理解 Spring 事务传播行为的原理和使用方法,在实际开发中灵活运用,解决复杂业务场景下的事务管理问题。:无论当前是否存在事务,都会创建一个新事务,并挂起当前事务(如果存在)。如果没有事务,则抛出异常。:查询操作,不需要事务保证,但在事务中执行时需要参与事务。:以非事务方式执行,如果当前存在事务,则挂起该事务。原创 2024-06-29 03:30:00 · 1616 阅读 · 0 评论 -
Spring 事务(4)—— Spring 事务失效的 8 种场景
submitOrder()方法和updateProductStockCountById()方法都在OrderService类中,submitOrder()方法上没有标注事务注解,updateProductStockCountById()方法上标注了事务注解,submitOrder()方法调用了updateProductStockCountById()方法,此时,updateProductStockCountById()方法的事务在Spring中会失效。例如,如下代码所示。原创 2024-06-28 17:31:43 · 804 阅读 · 0 评论 -
Spring 事务(5)—— SpringBoot启用事务
在SpringBoot中开启事务管理主要依赖于Spring的声明式事务机制,配置简单且高效。首先,在主应用类上添加@EnableTransactionManagement注解以启用事务管理功能。其次,通过添加JDBC或JPA依赖,SpringBoot会自动配置数据源和事务管理器。接着,在服务层方法上使用@Transactional注解来标记需要事务管理的方法,可以自定义传播行为、隔离级别、超时时间等参数。需要注意的是,@Transactional注解通过Spring AOP代理生效,因此同一类内部的方法调用原创 2025-05-17 06:00:00 · 286 阅读 · 0 评论 -
Ribbon的9种负载均衡策略
它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。原创 2024-06-30 03:00:00 · 1401 阅读 · 0 评论 -
Eureka-Serve的探活机制,是如何判断一个服务不可用的?
Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务,如果在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等!实际,心跳检测机制有一定的不确定行,比如服务提供者可能是正常的,但是由于网络通信的问题,导致在90s内没有收到心跳请求,那将会导致健康的服务被误杀。服务端维护了每个实例的最后一次心跳时间,客户端发送心跳包过来后,会更新这个心跳时间。原创 2024-06-28 18:25:23 · 998 阅读 · 0 评论 -
SpringBoot自动装配的过程和源码分析
Spring Boot的自动装配是其核心特性之一,它能够根据类路径中的依赖、配置和环境条件,自动配置Spring应用程序。这种机制使得Spring Boot应用能够根据类路径中的依赖自动配置所需的组件,大大减少了开发者的配置工作。:从META-INF/spring.factories加载候选配置类。:通过@SpringBootApplication启用自动装配。2. 从spring.factories加载配置类。:将最终筛选后的配置类加载到Spring容器中。原创 2023-08-08 11:32:32 · 104 阅读 · 0 评论 -
SpringCloud Feign-声明性Http请求以及Hystrix-Http请求的熔断配置
1.1 概述– Feign是一个声明性web服务客户机。它使编写web服务客户机变得更容易。– 它的使用方法是定义一个服务接口并在上面添加注解。– Feign支持可插拔编码器和解码器。– Spring Cloud对Feign进行了封装,使其支持SpringMVC标准注解和。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。1.2 Feign的作用Feign旨在使编写Java Http客户端变得更容易。前面在使用时,利用。原创 2024-01-03 14:17:13 · 1140 阅读 · 0 评论 -
Feign、Ribbon、Hystrix 超时配置与源码解析
在微服务架构中,Feign、Ribbon、Hystrix 是常用的组件组合,用于服务间调用、负载均衡和熔断降级。Feign 的超时由底层的 HTTP 客户端控制,默认使用 Client.Default,也可集成 OkHttp 或 Apache HttpClient。Hystrix 超时 < Ribbon 总超时,导致重试机制被 Hystrix 中断。:Hystrix 超时 > Ribbon 总超时,避免重试机制失效。1. Ribbon 的超时配置会覆盖 Feign 的超时配置。原创 2024-05-11 11:15:00 · 621 阅读 · 0 评论