自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring是如何实现无代理对象的循环依赖

摘要:Spring通过二级缓存机制解决无代理对象的循环依赖问题,在Bean实例化后提前暴露到缓存中,避免属性注入时的死循环。但对于被AOP代理的Bean,二级缓存保存的原始对象与最终代理对象不一致会导致注入失败。测试验证显示,未代理的循环依赖可以正确处理,但引入代理后会因对象不一致而引发问题。源码示例展示了二级缓存的实现方式及测试案例。

2025-06-09 16:13:11 778

原创 Spring类型转换融入IOC生命周期

本文介绍了如何在Spring IoC容器中集成类型转换功能,主要应用于处理@Value注解的属性赋值和Bean属性填充场景。通过ConversionService实现源类型到目标类型的转换,并说明将转换器注册到容器的具体流程。文章详细解析了在ApplicationContext阶段如何检测并注入转换器,以及DefaultConversionService如何内置基础转换器(如字符串到数字)以支持常见类型转换需求,同时保留扩展性允许开发者添加自定义转换逻辑。该机制确保了Spring依赖注入过程中的类型兼容性。

2025-06-09 16:12:26 938

原创 Spring通用类型转换的实现原理

Spring类型转换系统通过统一管理入口ConversionService实现多种转换器的适配,核心设计思路是将Converter、ConverterFactory和GenericConverter三种转换器适配为统一的GenericConverter形式存储在Map<ConvertiblePair, GenericConverter>容器中。GenericConversionService作为实现类,提供了类型转换判断(canConvert)、转换执行(convert)、转换器匹配(getCo

2025-06-08 16:17:56 686

原创 Spring类型转换器相关接口和实现原理

Spring类型转换框架提供了统一机制处理类型转换问题,核心包括三种转换接口:1) Converter处理简单类型转换;2) ConverterFactory通过工厂模式支持同一源类型到多种目标类型的转换;3) GenericConverter处理复杂场景如集合转换。这些组件通过ConversionService统一管理,支持字符串转数字/日期/枚举等常见转换场景,解决了表单提交、配置加载、属性注入等开发中的类型匹配问题。框架采用分层设计,从简单到复杂满足不同转换需求。

2025-06-08 16:16:51 886

原创 Spring @Autowired自动装配的实现机制

本文详解了Spring框架中@Autowired注解的实现机制。首先介绍了@Autowired与@Value的区别,指出前者注入的是Bean实例而非常量值。随后分析了@Autowired的注解定义及其默认按类型(byType)注入的特性,并说明可通过@Qualifier指定具体Bean名称。文章重点阐述了实现原理:通过BeanFactory接口扩展按类型获取Bean的方法,并利用BeanPostProcessor的postProcessPropertyValues方法完成字段注入逻辑,其中涉及反射机制处理字

2025-06-03 21:06:54 1166

原创 Spring @Value注解的依赖注入实现原理

摘要: Spring的@Value注解通过依赖注入实现属性赋值,支持静态值和配置文件占位符(如${key})。其核心原理是通过InstantiationAwareBeanPostProcessor在Bean实例化前处理注解,解析字段的@Value标记,动态替换占位符并生成PropertyValues。实现分为四步:1)定义注解;2)扩展处理器接口;3)实现解析逻辑(扫描字段、处理占位符);4)集成到Bean生命周期(通过AbstractAutowireCapableBeanFactory调用)。代码示例展示

2025-06-03 21:06:01 1031

原创 Spring如何实现组件扫描与@Component注解原理

本文介绍了Spring框架如何通过注解配置与包扫描实现组件自动注册。核心机制包括扫描指定包路径下的类,识别@Component等注解,并生成对应的BeanDefinition。作者详细解析了处理流程:从确定扫描路径、筛选目标类到注册BeanDefinition。关键实现包含ClassPathScanningCandidateComponentProvider(负责扫描注解类)和ClassPathBeanDefinitionScanner(处理作用域和名称解析)。源码可见于mini-spring项目,展示了如

2025-06-01 19:46:56 1045

原创 Spring是如何实现属性占位符解析

本文介绍了Spring框架中属性占位符解析的核心实现。通过继承BeanFactoryPostProcessor接口,在postProcessBeanFactory方法中完成对${xxx}格式占位符的动态替换。主要包括:1) 定义占位符处理器类;2) 遍历处理所有BeanDefinition的属性;3) 实现具体的占位符替换逻辑;4) 加载外部配置文件为Properties对象。该机制为Spring提供了配置外部化的能力,使得属性值可以在运行时动态注入。完整代码已开源在mini-spring项目中。

2025-06-01 19:45:48 666

原创 Spring生命周期中织入代理逻辑

摘要:本文探讨了Spring AOP自动代理的实现机制,重点分析代理对象在Bean生命周期的创建时机。核心是通过AbstractAdvisorAutoProxyCreator在postProcessAfterInitialization阶段完成代理创建,确保不影响Bean的常规初始化流程。文章详细介绍了判断Bean是否需要代理的条件(基于Advisor匹配)、自动代理的核心接口设计(InstantiationAwareBeanPostProcessor)以及wrapIfNecessary方法的关键实现逻辑,

2025-05-30 13:15:58 873

原创 Spring Advisor增强规则实现原理介绍

一、什么是 Advisor?1. Advisor 的定义与本质2. Advisor 的核心作用统一封装切点与通知构建拦截器链的基础实现增强逻辑的灵活组合二. Sprin当中的实现逻辑1 `Advisor` 接口定义2 `PointcutAdvisor` 接口定义3 `AspectJExpressionPointcutAdvisor` 实现类AOP相关核心概念与作用说明(补充)AdvisorAdvice:增强逻辑,即实际执行的横切代码。Pointcut:切点逻辑,定义增强逻辑在哪些连接点(方法)生效。

2025-05-30 13:14:39 954

原创 Spring Advice横切关注点的逻辑实现

AOP中的Advice(通知)是实现横切关注点的核心机制,可在方法执行前后或异常时插入辅助逻辑。Spring通过不同接口区分通知类型,如前置通知(MethodBeforeAdvice)在方法执行前触发。MethodBeforeAdviceInterceptor将前置通知封装为拦截器,实现统一调用流程。测试案例展示了如何通过动态代理将通知逻辑织入目标方法,实现了业务逻辑与横切关注点的解耦。这种设计使日志记录、权限校验等公共功能能够灵活地切入业务流程,提升代码复用性和可维护性。

2025-05-29 14:31:05 358

原创 Spring代理工厂类ProxyFactory作用以及实现原理

在 AOP(面向切面编程)中,Spring 支持两种常见的代理机制:基于接口的 JDK 动态代理 和 基于字节码生成的 CGLIB 动态代理。这个字段是判断使用 JDK 还是 CGLIB 的关键标识。,通过统一的封装,自动选择最合适的代理实现方式。否则 ⇒ 使用 JDK 动态代理(基于接口)⇒ 使用 CGLIB(代理目标类本身)封装了代理选择逻辑,避免手动。是代理配置的核心容器。

2025-05-29 14:29:31 346

原创 Spring框架之AOP动态代理底层实现原理

本文摘要: 本章介绍了AOP的基础实现,重点讲解了JDK动态代理在Spring中的应用。内容包括: AOP概念与实现方式对比:Spring AOP采用动态代理,而AspectJ基于编译期增强 JDK动态代理核心机制:通过Proxy.newProxyInstance创建代理对象,InvocationHandler实现方法增强 示例代码展示:演示了如何创建代理对象并实现前置/后置增强逻辑 Spring的扩展实现:介绍了ReflectiveMethodInvocation类,该类封装方法调用信息,为拦截器链式调用

2025-05-26 18:37:25 1108

原创 Spring框架之AOP PointCut切入点底层实现原理

Spring的PointCut切入点以及相关切点表达式的解析逻辑实际上不是在Spring当中自己实现的,而是调用了AspectJ的相关接口,这也是为什么在Spring AOP当中会大量出现AspectJ相关注解如,@Aspect,@Before等等。

2025-05-26 18:34:55 437

原创 Spring容器事件与监听器的作用以及实现原理

Spring框架中的容器事件与监听器机制基于观察者模式,用于在容器生命周期或应用状态变化时进行通知和处理。容器事件如ContextRefreshedEvent、ContextClosedEvent等,用于通知容器的初始化、刷新、关闭等关键阶段。事件监听器通过实现ApplicationListener接口或使用@EventListener注解,响应特定事件并执行相应业务逻辑,实现组件解耦和功能扩展。事件发布通过ApplicationEventPublisher接口实现,事件广播器ApplicationEven

2025-05-21 12:45:00 758

原创 Spring FactoryBean是什么,Spring如何实现FactoryBean的?

FactoryBean 是 Spring 框架中的一个特殊接口,用于自定义 Bean 的实例化逻辑,替代传统的 @Bean 或 XML 配置中的 <bean> 标签。它通过实现 getObject()、getObjectType() 和 isSingleton() 方法,允许开发者控制复杂对象的创建过程。与普通 Bean 不同,FactoryBean 适合处理动态、复杂或第三方对象的创建。通过 & 前缀,可以获取 FactoryBean 实例本身,而非其生产的对象。典型应用包括 MyBa

2025-05-20 20:28:20 703

原创 Spring是如何实现scope作用域支持

在Spring框架中,Bean的作用域主要分为单例模式(Singleton)和多例模式(Prototype)。单例模式的Bean在Spring容器中只会创建一次,并且会被缓存,后续请求都会返回同一个实例。而多例模式的Bean每次请求时都会创建一个新的实例。通过scope属性可以指定Bean的作用域,如<bean scope="prototype">。在Spring的实现中,BeanDefinition类用于定义Bean的作用域,默认情况下为单例模式。在XML配置解析过程中,X

2025-05-20 20:27:01 213

原创 Spring是如何实现Aware接口

在说Aware之前我们需要先明白Aware是做什么的,Aware有感知意识到的意思,简单来说就是我们如果想要让我们的Bean能够“感知”到我们的容器,这里不仅仅可以是容器还可能包含其他东西。举个例子,我们定义一个Book的Bean,我们需要在这个Bean当中调用BeanFactory进行某些操作,那么该如何实现呢上面只是一个对应实现的演示,那么在获得到beanFactory之后可以做什么,也就不言而喻了。下面我们来看一下具体的实现逻辑。

2025-05-07 08:31:07 233

原创 Spring是如何实现Bean的初始化和销毁

在前面的章节当中介绍完毕了ApplicationContext,也就是应用上下文。我们说BeanFactory是面向开发者的,ApplicationContext才是面向使用者的,实际上也是如此。在ApplicationContest当中我们对BeanFactory进行了进一步的集成,实现了自动化的XML文件读取,注册BeanFacoryPostProcess,注册BeanPostProcess,以及提前初始化单列Bean。

2025-05-07 08:30:21 525

原创 Spring是如何实现ApplicationContext应用上下文

但是只做到这一步还是不够的,我们需要解析XML文件就需要获取到文件的路径,这个路径的获取通过上面的示例也能看出来,是通过构造方法创建的,那我我们就还需要一个用于获取路径的类实现AbstractXmlApplicationContext同时实现获取路径的方法。当中调用的都是抽象方法,在这里我们实际上就只是定义一个模版,规范解析的步骤,至于具体如何实现就需要根据我们的需求了。也就是初始化Bean的方法当中有些逻辑是共通的,不管我们定义何种解析方法都需要用到这些东西,那么我们就可以在这里进行进一步的抽取。

2025-04-29 10:22:09 775

原创 Spring是如何实现PostProcess容器扩展机制

BeanPostProcessor的实现包括两个部分,分别为前置增强与后置增强二者来实现的。至于BeanPostProcessor的前置/后置增强是在哪里实现的呢,我们可以看一下下面的代码// 通过反射创建对象try {// 通过InstantiationStrategy实例化Bean// 为Bean的属性进行赋值// 执行bean的初始化方法和BeanPostProcessor的前置和后置处理方法// 创建完毕后加入缓存。

2025-04-22 15:15:00 1025

原创 Spring如何通过XML注册Bean

在上一篇当中我们完成了对三种资源文件的读写对于单一的资源文件我们要想将其中的配置解析为Bean需要经过以上几步。

2025-04-21 14:21:06 578

原创 Spring是如何实现资源文件的加载

其中Resource是所有资源类型的父类,可以通过继承该类实现其getInputStream方法,获取资源文件的输入流,之后用过该输入流对象就可以实现对文件内容的读取。在此之后,再次定义一个默认的资源文件加载器实现ResourceLoader,在getResource方法当中会根据传入的location格式动态匹配对应的解析方法。在Bean实例化之后需要对其中的属性进行注入,如下我们定义了一个People,现在需要将其加入到Spring容器当中,其中还包含了两个属性。无法实现,我们需要一个列表来储存。

2025-04-21 14:18:57 900

原创 Spring是如何通过BeanDefinition定义Bean

之后我们就可以对进行扩展,在单例池当中不存在的时候创建 Bean,那么由于创建 Bean 的逻辑需要获取到 BeanDefinition,那么 AbstractBeanFactory 就应该有 getBeanDefinition 的方法来获取到 BeanDefinition。@Override// 尝试从缓存当中获取Beanif (bean!= null){// 如果没有尝试创建Bean,Bean的创建需要通过BeanDefinition// 创建Bean。

2025-04-15 10:03:16 660

原创 Spring -- 如何实现一个简单的IOC容器

说起Spring其核心也就是在IOC容器当中,那么什么是IOC容器,简单来说就是用来保存已创建好的Bean的地方,那么在这个过程当中就又会涉及到Bean的创建,Bean的保存等等,那么现在我们就来尝试实现一个最简单的容器。这样一个简单的容器就实现了,当然Spring不可能通过如此简单的逻辑实现的IOC容器,在Spring当中还对其进行了拓展包括。就是单列Bean的一个注册表,这是一个接口,提供单列Bean的获取与添加方法。既然是接口,那我我们就可以提供一个默认的实现类来实现它。的默认实现,就可以通过集成。

2025-04-15 10:00:07 505

原创 面试官:哪些地方用到了MQ,为什么选择RabbitMQ

支付网关商户配置更新在项目当中分为管理端与支付网关,为在网关当中会对商户的配置信息进行缓存,当商户在管理平台当中修改了其配置信息,我们需要异步通知支付网关对缓存信息进行修改。支付结果异步回调商户支付/退款等成功后需要回调网关向外暴露的接口,同时更新B端的订单信息。对于订单信息的更新,需要通过RabbitMQ异步通知服务端。

2025-03-13 17:20:10 261

原创 QingluoPay支付宝支付对接流程

支付宝的对接流程非常简单只需要关注官方提供的SDK与文档即可 -->先来看一下支付宝官方提供的实例代码,在这里参数部分已经省略,我们只关注逻辑的实现在其中有三个非常重要的部分AlipayClient是支付宝支付的一个核心接口,用于调用其各种APIAlipayTradeWapPayRequest是一个用于请求的类其继承与AlipayRequest,主要用于处理不同业务逻辑的请求AlipayTradeWapPayModel用于对相关参数的配置如标题,支付金额等。

2025-03-13 17:18:02 933

原创 springboot项目中如何优雅的实现异常处理

通过逐行解析自定义异常类和全局异常处理器,我们深入理解了 Spring Boot 中异常处理的实现细节。这种机制不仅提高了代码的可维护性,还为用户提供了友好的错误提示。希望本文对您有所帮助!

2025-01-19 13:00:00 1720

原创 springboot基于RBAC模型的权限管理实现详解

在现代企业级应用中,权限管理是确保系统安全性和数据完整性的核心模块之一。通过权限管理,系统可以为不同的用户分配不同的权限,从而实现对系统资源的精细控制。本文将详细介绍一个基于Spring Boot和RBAC(Role-Based Access Control,基于角色的访问控制)模型的权限管理模块的实现过程,涵盖用户、角色、权限的管理以及它们之间的关系。RBAC(Role-Based Access Control)是一种常见的权限管理模型,它将权限分配给角色,然后将角色分配给用户。

2025-01-18 12:30:00 985

原创 基于RBAC权限模型的权限管理模块实现详解

权限管理是企业级应用中的核心模块之一,它确保系统中的不同用户能够访问和操作与其角色相匹配的资源。通过权限管理,系统可以实现对资源的精细控制,防止未授权访问和操作。本文将详细介绍一个基于Spring Boot的权限管理模块的实现过程,涵盖权限的增删改查、权限分配等功能,并详细介绍每个接口的访问路径、入参、出参以及具体实现。通过本文的详细解析,我们深入探讨了一个基于Spring Boot的权限管理模块的实现过程。该模块涵盖了权限的增删改查、权限分配等功能,并通过Sa-Token实现了权限控制。

2025-01-17 11:00:00 1036

原创 基于RBAC权限模型的角色管理模块实现详解

在现代企业级应用中,角色管理是权限控制的核心模块之一。通过角色管理,系统可以为不同的用户分配不同的权限,从而实现对系统资源的精细化管理。本文将详细介绍一个基于Spring Boot的角色管理模块的实现过程,涵盖角色的增删改查、权限分配等功能,并详细介绍每个接口的访问路径、入参、出参以及具体实现。

2025-01-16 13:00:00 884

原创 基于RBAC权限模型的系统用户管理模块实现

在现代企业级应用中,用户管理模块是系统的基础功能之一。它通常包括用户的增删改查、登录认证、权限管理等功能。本文将详细解析一个基于Spring Boot的系统用户管理模块的实现流程。该模块使用了MyBatis Plus作为ORM框架,结合Redis进行验证码的存储与验证,同时通过Sa-Token进行权限控制。

2025-01-15 14:30:00 1243

原创 Day2 -- QingLuoPay基础功能搭建

springboot从零开始自建项目 Day2 -- QingLuoPay基础功能搭建一,基础功能包含哪些部分?二,功能实现1. Http状态码定义2. 自定义异常3. 序列化返回数据4. 数据校验

2025-01-04 11:30:00 634

原创 从零开始自搭SpringBoot项目 -- Qingluopay项目工程介绍

该项目主要由运营平台服务端,商户系统服务端组成,通过抽取微信/支付宝等支付接口,实现支付功能的轻量化对接,用户只需通过在平台注册相关信息就可轻松实现支付。

2025-01-03 18:47:14 1045 2

原创 Spring如何实现XML文件的验证模式的读取?

首先在我们的spring当中我们可以通过不同格式的文件实现对Bean的配置,在spring当中首先会对我们的配置文件进行解析 --》 ClassPathResource/FileSystemResource等 , 该类适用于对不同文件进行读取然后转化为Resource对象,Resource的父接口继承于InputStream,并重写了getInputStream方法实现获取流对象的功能在本文我们以XMLBeanFactory为切入点debug一下实现流程。

2024-12-30 10:45:00 441

原创 ClassPathResource工作原理

Spring的资源文件读取是通过ClasspathResource这个类来实现的,我们来简单看一下该类的实现流程。

2024-12-29 10:00:00 250

原创 spring循环依赖深度源码解析

三级缓存是咋spring的DefaultSingletenBeanRegister这个类当中// 一级缓存// 三级缓存// 二级缓存在这里最值得注意的是三级缓存,我们看一下它的类型Map,我们进入源码来看一下这是个什么东西// 函数式接口 --》 只有当调用getObject时候才会真正执行代码/***/

2024-12-17 20:47:17 890

原创 synchronized 锁升级实现原理

当一个对象刚被创建其状态必然是无锁状态,在对象头的Mark Word当中就会有个所表示用来表示当前状态,无锁为00.当一个线程尝试获取锁时,就会检查Mark Word当中的信息判断其状态,如果为无锁状态就会尝试通过CAS的方式去修改锁表示,在CAS执行成功后同时还会在Mark Word当中储存当前线程的线程ID,之后会在锁的内存当中创建一条所记录用于备份对象头当中的Mark Word信息。在很多的情况下,在Java程序运行时,同步块中的代码都是不存在竞争的,不同的线程交替的执行同步块中的代码。

2024-12-15 14:52:42 1257

原创 多线程高频基础面试题

一. 线程与进程的区别二. 并发与并行的区别三. 创建线程的方式有哪些四. Runnable和Callable有什么区别五. 线程包括哪些状态,状态之间是如何变化的六. 在Java中wait和sleep方法的不同七. 新建三个线程,如何保证它们按顺序执行八. notify()和notifyAll()有什么区别九. 线程的run()和start()有什么区别十. 如何停止一个正在运行的线程

2024-12-11 15:37:01 1066

原创 HashMap实现原理 , put方法的具体流程及其扩容机制

对于没有普通节点通过寻址算法重新定位新的存储节点 , 如果是红黑树则走红黑树的方法 , 前两种都不是那只有可能是链表 , 对于链表的移动也采取了特殊的算法 , 先会循环链表 , 对链表中的元素的哈希值与旧数组长度做与运算结果如果非零则移动到原数组下标+扩容长度位置。HashMap通过hash算法与重写equals方法对插入key进行判断 , 以保证key的唯一性 , 但是在hash算法当中也无可避免出现hash碰撞的情况 , HashMap通过链表与红黑树将相同hash值的元素存于同一下标。

2024-12-10 22:21:55 867

springboot项目sql初始化资料

springboot项目sql初始化资料

2024-09-22

springboot项目今日指数前端资料

今日指数项目前端资料

2024-09-22

基于Django+uwsgi+nginx+MySQL+redis+linux+requests开发的电商购物系统

基于Django+uwsgi+nginx+MySQL+redis+linux+requests开发的电商购物系统, 以及使用爬虫技术批量获取商品数据. 实现客户端:注册 , 登录 , 浏览记录保存, 购物车 , 订单等功能实现 管理端: 商品添加 , 用户管理等功能

2024-06-15

哈工大 ,百度等停用词表

哈工大 ,百度等停用词表

2024-05-29

电商购物商城开发文档以及前端资料

该项目是基于Django的购物商城系统开发文档 , 包含前端资料 , mysql数据库 , 图形验证码制作 , 响应编码

2024-05-02

携程旅行parmas参数testab逆向

携程旅行parmas参数testab逆向

2024-05-02

空空如也

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

TA关注的人

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