- 博客(119)
- 收藏
- 关注
原创 redisson分布式锁原理
Redisson分布式锁实现原理分析:通过RLock接口实现加锁解锁,核心流程包括:1)执行Lua脚本(检查锁状态、处理可重入、返回TTL);2)未获取锁时订阅Redis通道并循环重试;3)自动续约机制(默认30秒过期,通过时间轮每10秒续期)。关键特性包含可重入支持、看门狗续约、信号量通知等,底层基于Redis哈希结构和Netty时间轮实现。
2025-10-28 17:54:50
345
原创 Druid连接池原理
SpringBoot集成Druid连接池后,主要实现四个核心功能:1)启动时同步创建初始连接;2)启动日志监控线程;3)创建连接的线程动态维护连接池;4)销毁线程清理超时连接。关键逻辑包括:使用connections数组存储连接,通过createPhysicalConnection()建立物理连接;创建线程会检查连接数上限,避免超过maxActive;销毁线程会遍历活跃连接,关闭超时未使用的连接。获取连接时支持设置超时等待,未设置则持续等待。整个过程通过ReentrantLock保证线程安全,确保连接池高效
2025-09-20 12:47:44
207
原创 事务管理与连接池
Spring事务管理机制下,Mapper方法执行时的事务处理流程如下:当存在事务时,Spring通过Hikari连接池获取数据库连接,并用ConnectionHolder封装后绑定到线程变量;MyBatis执行时先从线程上下文中获取SqlSessionHolder,若不存在则创建并注册到ThreadLocal中,同时维护引用计数。方法执行成功则提交事务,最后必须关闭会话。整个过程通过ThreadLocal实现资源隔离,确保事务的正确性。
2025-09-18 20:20:31
309
原创 Hikari连接池原理
摘要:Spring Boot默认使用HikariCP作为数据库连接池,通过DataSourceConfiguration.Hikari类在启动时创建HikariDataSource实例。该过程会从属性源读取配置,通过DataSourceBuilder反射构建对象,并注入相关属性。获取连接时先检查线程缓存,再到连接池查找可用连接,最后通过队列轮询等待。连接采用代理模式,关闭时自动回收到连接池。HikariCP通过高效的连接管理策略(如线程局部缓存、CAS操作)实现高性能连接池。
2025-09-16 19:56:44
340
原创 springboot自动装配原理
通过@SpringBootApplication注解触发自动配置流程,其核心是AutoConfigurationImportSelector组件。该组件在Spring启动时通过ConfigurationClassPostProcessor处理,采用延迟加载策略处理DeferredImportSelector。系统会从缓存中读取spring.factories文件中的配置类,经过AutoConfigurationImportFilter条件过滤后,最终将符合条件的自动配置类通过processImports导入
2025-09-10 21:46:43
349
原创 spirng事务原理
spring用代理拦截方法调用,配合 ThreadLocal 保存事务上下文,按照传播规则决定是否开启/挂起事务,在方法结束时根据执行结果去调用数据库的 commit / rollback,更多请关注微信公众号 葡萄开源
2025-09-09 19:56:52
391
原创 aop实现原理
通过@EnableAspectJAutoProxy注解启用AOP功能,该注解会注册AnnotationAwareAspectJAutoProxyCreator组件。该组件在Bean实例化时创建代理对象,核心流程包括:1)扫描容器中所有带@Aspect注解的类;2)解析类中的通知方法(@Around/@Before等),按声明顺序排序;3)构建Pointcut表达式,生成对应的Advisor通知;4)根据注解类型选择不同的Advice实现(如AspectJAroundAdvice)。
2025-09-07 20:51:35
377
原创 Bean的初始化原理
Spring提供了三种bean初始化方式:1)使用@PostConstruct注解标注方法;2)实现InitializingBean接口的afterPropertiesSet方法;3)通过@Bean的initMethod属性指定方法。初始化过程分为两个阶段:先执行BeanPostProcessor的postProcessBeforeInitialization方法,再调用invokeInitMethods方法。
2025-09-06 21:39:00
269
原创 @Resource依赖注入原理
Spring中@Resource注解的依赖注入原理是:首先检查容器中是否存在指定名称和类型的bean实例。若不存在则按@Autowired方式处理;若存在则直接通过名称和类型获取bean实例。获取依赖后,通过反射机制将其注入字段。相比@Autowired,@Resource的注入逻辑更简单直接,效率更高但灵活性稍低。核心代码通过resolveBeanByName方法获取bean实例,再通过反射完成字段注入。
2025-09-04 22:13:10
329
原创 windows添加类似linux系统的cron定时任务
win+R执行taskschd.msc,创建任务即可。电脑解锁时运行-将开始任务设置为工作站解锁时;电脑锁屏时运行-将开始任务设置为工作站锁定时;
2025-09-03 16:10:40
246
原创 @Qualifier依赖注入原理
摘要:Spring通过@Autowired注入多个实现时,需用@Qualifier、@Primary或@Priority区分。注入过程先检查类型匹配,再验证@Qualifier标注:若依赖本身有@Qualifier则优先注入;若无则比较依赖名与注解属性值是否相同。核心逻辑通过checkQualifier()方法实现,最终确保精准注入指定依赖。
2025-09-03 10:11:28
171
原创 @Autowired依赖注入原理
Spring框架通过@Autowired注解实现依赖注入,其核心处理逻辑由AutowiredAnnotationBeanPostProcessor完成。该处理器会扫描带有@Autowired或@Value注解的字段(排除static字段),并根据required属性判断是否必须注入。注入过程分为多种情况:对于普通bean直接查找并注入;对于Optional类型会进行封装;ObjectFactory/ObjectProvider类型会生成代理对象;当存在多个同类型bean时,会通过determineAutow
2025-09-01 17:40:06
482
原创 一文看懂Bean实例化的过程
Spring在实例化Bean时,首先会合并Bean定义(处理父Bean定义),然后根据是否为FactoryBean进行不同处理。对于普通单例Bean会直接实例化,而FactoryBean默认不会立即创建目标对象,除非实现SmartFactoryBean并设置eagerInit为true。getBean()方法会处理Bean名称、检查缓存、解决依赖关系,最终通过createBean完成实例化。该过程还涉及循环依赖检查、原型模式验证等机制,确保Bean的正确创建和管理。
2025-08-31 21:22:47
398
原创 @ComponentScan注解的原理
Spring的@ComponentScan注解通过ClassPathBeanDefinitionScanner实现组件扫描,默认识别@Component、@ManagedBean等注解的类。其核心流程包括:1)配置扫描过滤器(包含/排除规则);2)解析@Scope代理模式;3)确定扫描路径(默认为主类所在包);4)执行扫描生成Bean定义。在注册过程中会检查同名Bean,若已存在非扫描生成的Bean定义则不会覆盖。整个过程通过doScan()方法完成组件到Bean定义的转换,最终注册到Spring容器中。
2025-08-27 22:41:47
307
原创 一文看懂@Bean注解的原理
Spring通过@Bean注解创建bean的流程包括:1)使用反射和ASM技术获取并排序bean方法,确保条件注解的处理顺序;2)通过条件注解判断是否跳过处理;3)处理同名bean方法冲突;4)创建bean定义并设置调用方式(静态方法直接调用类,实例方法通过工厂bean调用)。此外还会处理@Lazy、@Primary等注解属性,最终将bean定义注册到容器中。关键点在于通过反射和字节码技术保证方法顺序,以及区分静态/实例方法的调用方式。
2025-08-26 22:54:30
373
原创 @PropertySource属性源注解的原理
本文介绍了Spring通过@PropertySource注解加载自定义配置文件的原理。在Bean扫描阶段,Spring会处理该注解,读取指定路径的配置文件并生成属性源。核心逻辑包括:解析属性文件路径、创建属性源工厂、将属性源添加到环境配置中。当遇到同名属性源时,会进行合并处理;新加载的属性源会被优先处理以满足最新配置的读取需求。整个过程确保了自定义配置能够正确集成到Spring环境中。
2025-08-25 22:08:39
177
原创 @Conditional条件注解的原理
Spring提供了丰富的条件注解来动态控制Bean的创建,主要包括核心的@Conditional注解和Spring Boot扩展的一系列条件注解。这些注解可以基于Bean存在性、类加载情况、配置属性、资源文件等多种条件进行判断。实现原理是通过Condition接口的matches方法进行条件匹配,在shouldSkip方法中决定是否跳过Bean创建。例如@ConditionalOnClass会检查指定类是否存在,@ConditionalOnBean会检查容器中是否存在指定Bean。
2025-08-24 21:55:33
760
原创 一文看懂spring处理@Component的原理
文章摘要:Spring通过@Component注解实例化Bean并将其托管到容器中。处理内部类时,会检查是否存在@Component等注解,并使用栈结构防止循环依赖(但Spring不处理业务代码层面的循环依赖问题)。配置类解析过程中会跳过不符合条件的Bean,并递归处理其父类层次结构。最后将符合条件的Bean定义注册到容器中,完成实例化和管理。
2025-08-22 20:59:38
347
原创 一文看懂spring解析bean的过程
上文提到spring中容器在refresh阶段会执行容器的后置处理器,此时会扫描bean,之前已经讲过spring扫描bean的流程,那么从后置处理器到扫描bean,这中间spring在干嘛,又做了哪些预处理,现在可以看下,话不多说,直接看源码。首先,通过校验容器的id,保证每个容器只会扫描一次。遍历spring内置配置类和已经加载的main配置类,首先使用BeanDefinitionHolder包装bean定义,然后循环解析,解析过程中发现了新的bean,则需要重复解析,直到解析完所有bean为止。
2025-08-21 20:41:02
400
原创 一文看懂spring的容器原理
使用spring的日常开发过程就是声明bean到容器,再注入给其他bean,大家想过没有,容器到底是什么东东,spring如何实现的,今天我们就来看下spring的容器原理。接下来是容器初始化阶段,还记得之前spring启动时从spring.factories中读取的初始化器吗,现在排上用场了,其中。,接下来一步非常重要,就是往容器中注册main类的bean定义,注册后后续的才会按main类上的注解扫描代码中定义的bean。spring启动过程中创建应用上下文时,会以反射方式构造应用上下文实例对象。
2025-08-19 22:20:44
491
原创 一文看懂spring扫描bean的过程
Spring容器通过递归扫描处理注解来创建Bean:首先通过@ComponentScan读取包路径并扫描,对发现的Bean继续解析(若含@ComponentScan则递归扫描);然后依次处理@Component、@Import和@Bean注解。关键代码展示了如何解析@ComponentScan属性(如basePackages)并深度扫描,最终构建完整的Bean定义体系。@SpringBootApplication能启动应用正是基于这套机制,通过注解扫描自动装配所需组件。
2025-08-18 22:25:14
620
原创 一文看懂spring配置原理
一路看到底吧,以properties文件为例,读取时其实就是字符串处理,读取key时读取到’=‘或’:'为止,读取value时读取到空格符、制表符、换行符为止,然后读取完配置文件中所有配置,至此读取完配置文件,读取完用。读取环境配置时,首先添加null,意思是没有任何环境后缀的配置文件,然后从已有的属性源即Java属性和环境变量中获取。读取到环境配置后,要加载配置文件了,此时从保存环境Profile的队列中取出来,再进行加载,可以看到null的环境配置加载了两次,由于存在。读取配置文件,现在看下这个过程。
2025-08-17 22:12:48
463
原创 一文看懂spring事件监听器
run方法运行容器时会发布各种事件,首先跟读取监听器的方式类似,获取事件发布器,用于发布各阶段事件,此时会将从spring.factories中读取的事件监听器加入事件发布器,让支持的事件监听器去处理,接下来我们看spring启动过程中发布的第一个事件ApplicationStartingEvent启动事件。获取支持处理ApplicationStartingEvent事件的监听器,然后处理,接下来重点分析这个过程。中,用于快速检索,发现没获取到就会按事件过滤。还是一样的,先根据事件。事件的监听器,这里的。
2025-08-14 23:31:10
347
原创 一文看懂springboot启动过程
没做特殊处理,就是记住main方法类,这一步很关键,后面扫描bean时就是根据main类所在的包进行扫描的。spring的源码代码量非常大,我们看的时候能看懂框架设计就行,能看到具体功能的时候再去详细讲解,主要看懂配置加载、bean实例化、aop、事务、mvc这些就够了,后面我会细讲。这是我们创建springboot应用时写的代码,是不是很熟悉,但是这行代码背后的逻辑,springboot如何启动,spring应用上下文如何创建,今天我们一探究竟。
2025-08-14 09:49:09
216
原创 一文看懂ThreadLocal内存泄漏
这样就把哈希冲突的问题解决掉了,但是会有个致命问题:ThreadLocal3和ThreadLocal4对线程1和线程2都可见,线程1调用set()设置过ThreadLocal3的值,用完之后将ThreadLocal3=null了,此时线程2设置ThreadLocal4的值时,就会发现根据hash值计算得到的索引处的Entry内置的ThreadLocal为null,即。,就从Entry5处向后移动,找到下一个空的Entry6处保存,最终实现去掉需要被gc的Entry,同时将存在哈希碰撞的Entry前移。
2025-08-11 19:19:45
942
原创 Java压缩jpg图片失败问题
Java中自带的`ImageIO`默认处理jpg格式图片时像素深度为8,read生成的处理器是由图片定义的,如果超过8就无法处理,故需要使用new出来的。
2024-10-23 18:08:51
403
原创 tomcat-valve通过servlet处理请求
上一节说到请求url定位servlet的过程,tomcat会把请求url和容器的映射关系保存到MappingData中,org.apache.catalina.connector.Request类实现了HttpServletRequest,其中定义了属性mappingData。还是慢慢看吧,首先在Wrapper容器中取出Servlet,然后创建用来处理请求的servlet过滤器链。方法,就是根据请求方式处理请求啦,也就是我们写的过滤器中处理请求的方法。定位servlet对请求进行处理的入口是。
2024-06-03 23:08:18
474
原创 tomcat-根据请求url映射servlet
之前说到对请求行和请求头进行解析,获取到请求信息,现在我们有了请求信息,就要根据请求url映射到servlet进行处理,接下来开始看这个过程。tomcat处理请求的线程中。其实这样看,根据请求url映射servlet相关容器的过程并不复杂,本质就是字符串处理的过程。方法根据请求url映射相关容器,映射容器的过程是在。
2024-05-31 22:41:43
785
原创 easyexcel解析excel文件原理解析
easyexcel解析excel文件,先初始化用来解析excel文件用到的参数,比如文件路径、表头行、行数据class等,然后使用poi基于事件的机制进行解析。获取到数据后会把列索引和cell数据保存到map,然后调用每个监听器的invoke方法进行处理
2024-04-23 19:30:26
2665
原创 xxl-job调度任务原理解析
xxljob可以对定时任务进行调度,现在看下定时任务调度的过程。实现了InitializingBean接口,spring会调用进行初始化。
2024-04-13 22:43:01
1611
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1