- 博客(143)
- 收藏
- 关注
原创 springboot中Bean的销毁流程
本文详解Spring Bean的销毁阶段,重点阐述Destruction回调的注册机制与销毁触发流程。核心在于:单例Bean在创建时通过registerDisposableBeanIfNecessary()将需销毁的Bean封装为DisposableBeanAdapter并存入disposableBeans Map,为销毁做准备。销毁回调支持三种方式:@PreDestroy、DisposableBean接口、destroyMethod配置,仅对singleton生效,且需容器正常关闭(如context.cl
2026-10-16 14:27:36
181
原创 计算机网络基础
路由(Routing)= 路由器根据目标 IP 地址,决定把数据包下一跳发往哪里。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;你的电脑北京路由器1路由器2运营商路由器3目标服务器上海每一跳路由器查自己的路由表,决定往哪个方向转发。
2026-07-12 09:58:54
363
原创 HTTP协议基础总结
HTTP(HyperText Transfer Protocol,超文本传输协议)是 客户端与服务器之间通信的应用层协议。它基于请求-响应模型,默认使用TCP作为传输层。一次完整的请求流程浏览器解析出请求的域名。通过DNS(域名系统)获取服务器的IP地址。与服务器建立TCP连接(如果是HTTPS,还需进行TLS握手)。构建并发送HTTP请求报文。服务器接收、解析并处理请求,然后返回HTTP响应报文。浏览器解析响应,并关闭或复用TCP连接。
2026-07-10 17:32:18
311
原创 Java是值传递还是引用传递
开发了一个功能,远程调用其他系统,获取其他系统返回参数解析,根据解析的字段值记录远程调用信息,主要记录了三个关键信息,第一是调用成功失败状态,第二个是入参,第三个是返参,经过运行一段时间后发现,记录的全部是失败状态,但是记录的远程系统的返参是成功。Java对象的传递,是通过复制引用关系并传递,因为有复制的过程,所以是值传递,只不过对于Java对象的传递,传递的内容是对象的引用。值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来,如果是传递副本,那就是值传递,否则就是引用传递。
2025-10-16 11:43:16
286
原创 spring 第三级缓存singletonFactories的作用及@Async造成循环依赖报错原因分析
第三级缓存singletonFactories,解决不了@Async注解生成的代理类造成的循环依赖的问题。
2025-09-26 14:15:51
1112
原创 springboot 启动流程及 ConfigurationClassPostProcessor解析
咱们重点看的就是上图圈出来的两个方法,一个是创建ApplicationContext,ApplicationContext 是Spring Framework的核心接口,作为IoC(控制反转)容器的核心实现,负责管理应用中所有Bean的创建、依赖注入及生命周期,并提供国际化支持、资源加载、事件发布等企业级功能,我理解就是创建了IOC容器上下文。这确保了自动配置可以在用户自定义的 Bean 被注册之后再进行,从而能够根据完整的上下文(如有无用户自定义的 DataSource Bean)做出正确的条件判断。
2025-09-11 17:36:22
967
原创 Spring和mybatis整合后事务拦截器TransactionInterceptor开启提交事务流程
本文主要分析了SpringBoot声明式事务与MyBatis结合使用时,数据库连接绑定和SQL执行的过程。首先,TransactionInterceptor通过拦截方法开启事务,将数据库连接绑定到当前线程的ThreadLocal中。接着,MyBatis执行SQL操作时,从ThreadLocal中获取连接执行SQL,最后拦截器根据事务状态提交或回滚事务。文章详细解析了事务开启、连接绑定以及MyBatis获取连接的源码实现过程,帮助理解Spring事务管理机制与MyBatis的协同工作原理。
2025-08-30 12:34:38
1062
原创 SpringBoot 声明式事务 源码解析
摘要:本文分析了Spring Boot事务自动配置机制。重点介绍了TransactionAutoConfiguration配置类的生效条件,解析了@EnableTransactionManagement注解的作用,包括引入TransactionManagementConfigurationSelector组件并默认添加AutoProxyRegistrar和ProxyTransactionManagementConfiguration两个组件。详细说明了AutoProxyRegistrar组件如何通过实现Im
2025-08-29 12:06:31
924
原创 mybatisplus oracle 数据库OracleKeyGenerator使用序列生成主键原理
摘要:本文分析了MyBatis-Plus的启动流程,重点介绍了Oracle主键生成器的集成方式。在MyBatisPlusAutoConfiguration中会自动收集IKeyGenerator实现类,通过配置@Bean将OracleKeyGenerator加入IOC容器,并在实体类使用@KeySequence指定序列。文章详细追踪了SQL注入过程,从SqlSessionFactory构建到Mapper接口解析,重点说明了DefaultSqlInjector如何为Mapper接口注入基础CRUD方法,以及自定
2025-08-18 13:45:17
1065
原创 若依框架中@EnableAspectJAutoProxy注解配置proxyTargetClass为false失效问题
EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass=false),其中proxyTargetClass=false后,service实现类仍然使用的cglib代理的。AspectJAutoProxyRegistrar中的registerBeanDefinitions进入断点两次,第一次proxyTargetClass=false,第二次为true,第二次覆盖了第一次的值,我猜想第一次是我配置的,第二次应该有自动配置类默认是true.
2025-06-27 10:54:30
999
原创 HashMap动态扩容解析
因为hashCode是int类型,虽然能映射40亿左右的空间,但是,HashMap的table.length毕竟不可能有那么大,所以为了使hash%table.length之后,分布的尽可能均匀,避免哈希冲突,就需要对实例的hashCode的值进行扰动,就是将hashCode的高16和低16位,进行异或,使得hashCode的值更加分散一点。(2)、当数组容量大于64时,hash冲突链表大于8时,会把链表转成红黑树,如果数组容量小于等于64时,hash冲突时链表大于8时,会先扩容数据,每次扩容为2的倍数。
2024-08-29 15:09:09
965
原创 redisson watchdog 原理
1、reddison中维护了一个ConcurrentHashMap EXPIRATION_RENEWAL_MAP,key是uuid+锁名。value是ExpirationEntry对象,其中threadIds是Map,key是线程号,value是线程获取锁的次数。如果是重入锁value会大于1。会有延迟任务开新线程获取threadIds中线程,判断锁有没有释放,没有释放则重置有效时间,继续调用延迟任务,如果释放了则不会执行延迟任务。
2024-08-26 17:11:18
1044
原创 ArrayList 动态扩容
1、创建ArrayList集合时,可以设置默认长度,如果不设置默认长度为10。2、ArrayList扩容时,会以原数组长度的1.5倍进行扩容,当扩容后的长度大于Integer.MAX_VALUE - 8时,会判断数组中已有元素的长度,当已有元素长度大于Integer.MAX_VALUE - 8时,扩容后的数组长度为Integer.MAX_VALUE,否则是Integer.MAX_VALUE - 8。3、使用Arrays.copyOf把原数组拷贝到扩容后的新数组。
2024-08-13 14:03:02
644
原创 spring事务失效原因
②、protected方法到是可以被代理,但是CGLIB是基于继承关系来实现的,生成的代理类中对于protected的代理方法,也是protected的,访问范围受限制。,调用目标方法时,会先执行代理方法,代理类方法对方法增强然后使用子类调用父类的方式调用目标类方法。④、调用static方法,因为这类方法是属于这个类的,并不是对象的,所以无法被AOP。③、final修饰的方法不能被代理,因为final修饰的方法不能被子类重写,会报错。③、调用目标方法时,先执行代理类C中方法用于增强目标方法,再使用。
2024-07-26 18:25:37
776
原创 Spring如何管理Mapper
在Controller中使用Service,一般是实现Service接口类上添加@Service注解,让实现类注入到SpringIoc容器中,Controller通过@Autowired 从容器中获取,但是在Service实现类中使用@AutoWired 获取Mapper的时候,没有看到Mapper的实现类,带着疑问查看Spring是如何把Mapper接口类型的类注入到Ioc容器中。把生成的bean实例放入Spring容器中由此步骤可见,要想生成bean对象,首先需要有BeanDefinition。
2024-07-18 17:53:34
1150
原创 springboot2.x AOP 默认使用Cglib 源码
在 SpringBoot 2.x AOP中会默认使用Cglib来实现,但是Spring5中默认还是使用jdk动态代理。Spring AOP 默认使用 JDK 动态代理,如果对象没有实现接口,则使用 CGLIB 代理。也可以强制使用 CGLIB 代理。springboot默认使用cglib实现代码逻辑来记录一下。
2024-07-17 18:05:25
1116
原创 一棵B+树可以存放多少行数据
非叶子节点内可以存放多少指针呢?假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,所以就是一个键值指针占用8+6=14字节,一个内部节点中存储的指针个数为 16KB/14B = 16 * 1024B / 14B = 1170。同理一棵高度为3的B+树,能存放 1170 *1170 *16 = 21902400,大概两千万左右的记录。如果B+树的高度为2,即有一个根节点和若干个叶子节点,则这棵B+树的存放总记录数为:根节点指针数 * 单个叶子节点记录行数。
2024-07-01 14:45:58
576
1
原创 springboot中抽象类无法注入到ioc容器
在写代码时,发现service接口有两个实现类,并且两个实现类中没有对类名重命名,属性注入的时候也没有使用byName或@Qualifier,正确情况下会。
2024-05-31 10:43:54
762
原创 spring 使用多线程,保证事务一致性
大体思路,就是所有子线程在各自线程内开启事务,执行业务逻辑后,判断是否抛错,一旦抛错,会把全局AtomicBoolean置为false,因为其具有原子性所以不会有线程不安全问题。所有子线程完业务代码会等待主线程,全部子线程执行业务结束后,主线程等待结束,判断AtomicBoolean是什么状态,一旦false,所有子线程回滚,否则提交。
2024-05-30 18:12:52
1042
2
原创 shiro Filter加载和执行 源码解析
在使用若依框架(前后端不分离包含shiro安全框架)时,发现作者添加了验证码、登录帐号控制等自定义过滤器,于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例,对源码解析。
2023-12-10 00:35:29
1542
1
原创 mybatis和mybatisplus中对 同namespace 中id重复处理逻辑源码解析
同事在同一个mapper.xml (namespace相同),复制了一个sql没有修改id,正常启动项目。但是我以前使用mybatis的时候如果在namespace相同情况下,id重复,项目会报错无法正常启动,后来看代码发现,是mybatisplus处理了id重复,项目也能正常启动。
2023-12-08 18:08:30
1572
原创 spring @Autowired 和 @Qualifier 配合使用实现按名称属性赋值源码
(1)、接着上篇博客AutowiredAnnotationBeanPostProcessor中postProcessPropertyValues -> metadata.inject -> element.inject -> beanFactory.resolveDependency -> doResolveDependency -> findAutowireCandidates -> isAutowireCandidate,
2023-12-01 17:26:33
783
原创 mybatis 使用if 判断数值型
mybatis 中 动态if 使用ognl表达式判断。当对象是Number类型,当传值为0时会被解析成false,否则为true
2023-06-16 11:16:14
2371
原创 RocketMq 同组消费者 自动设置InstanceName
此方法的切入点是DefaultRocketMQListenerContainer类创建过程中,使用后置处理器设置instanceName。
2023-06-13 14:50:50
2156
原创 Spring 循环依赖代码分析
一、说明:1、当组件是单例并使用setter给属性赋值时不会出现循环依赖。如果组件不是单例或用构造器赋值都会出现循环依赖错误。2、一级缓存:singletonObjects二级缓存:earlySingletonObjects三级缓存:singletonFactories二、代码:代码执行流程:contextLoader->configureAndRefreshWebApplicationContext->wac.refresh();->finishBeanFactory
2021-04-23 17:26:21
366
原创 git 从远程分支下载到本地分支
以从http://git.xxx.com/test.git上拉去fast分支为例:1、新建空文件夹2、初始化gitgit init3、与远程仓库建立连接命令:git remote add origin <远程git地址>例如:git remote add origin http://git.xxx.com/test.git4、把远程分支拉去到本地命令:git fetch origin <分支名称>例如:git fetch origin fast5、在本地建立
2021-03-17 09:57:49
9567
原创 vue 路由跳转到同一个页面,页面刷新问题
问题:在当前页面,添加参数再次跳转当前页,两个**不同参数**的请求,跳转到同一个页面,第二次请求出的数据不刷新,还是显示第一次的数据。解决办法:在页面中添加 watch :{ '$route': function (to, from) { this.loadData(); } },...
2021-03-11 17:32:03
2924
原创 mybatis 在增量热加载
application.yml中mybatis: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: mybatis/**/*Mapper.xml typeAliasesPackage:**.domain mapper: reload: true本例子是在springboo
2021-03-05 09:32:50
465
3
原创 vue 子组件dialog如何每次打开的时候都重新create
一、问题描述父组件中包含dialog子组件,每次刷新父组件时,子组件create都会执行,当dialog弹出时,dialog中create不再执行。想达到的效果是,父组件刷新不影响子组件,当dialog弹出时,dialog中的create才执行。二、问题解决办法添加v-if如下所示:<image-dialog :imageSelectVisible.sync="imageSelectVisible" v-if="imageSelectVisible"></image-dialog&
2021-03-05 09:28:47
5187
4
原创 常用postProcessor及执行顺序
一、常用postProcessor1、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor例子:MapperScannerConfigurer作用:扫描配置路径下bean,添加到IOC容器。invokeBeanFactoryPostProcessors执行 BeanDefinitionRegistryPostProcessor->postProcessBeanDefinitionRegistryMapp
2021-02-01 10:07:24
2592
原创 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for
1、出错内容开发时,遇到返回给前台一个JSON报错的问题。com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class xxx and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (th
2021-01-12 16:47:08
9208
原创 java8对 List集合常用处理方法
1.for循环list.forEach(item -> {list中的每个item元素做指定的操作//item.setState(0);//item.setRemark("");});2.去重List list = Arrays.asList(“AA”, “BB”, “CC”, “BB”, “CC”, “AA”, “AA”);long l = list.stream().distinct().count();// 3List newList = list.stream().disti
2021-01-08 10:15:25
1090
原创 springboot中DispatcherServlet实例化
1.问题开发中我在找DispatcherServlet 中initStrategies里面initHandlerMappings执行时机,在spring+springMvc框架中时,发现在web容器启动的时候,DispatcherServlet中的initHandlerMappings 就会执行,但是在springboot中发现,在第一次请求的时候initHandlerMappings 才会执行,经过查阅发现,这与servlet配置有关。2.结论1.DispatcherServlet 看继承关系可以发
2021-01-08 09:25:18
1127
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅