自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【开源设计】京东慢SQL组件:sql-analysis

sql-analysis是京东的一个开源慢SQL组件,它让开发人员在开发中就可以进行慢SQL的预防了,而无需等到上线预警时去定位和解决;该组件的实现思想主要就是Mybatis的插件机制对语法解析的拦截,随后进行对应 SQL 的分析 + 规则引擎的匹配和打分,最后去输出获取采集符合慢SQL条件的结果集。

2024-05-01 18:17:39 1408

原创 【Spring源码分析】透过源码看透Spring事务

考虑到Spring搞了个事务传播机制,那就需要考虑传播机制带来的影响咯,默认是 Require 传播机制,理解为正常事务就好了.........................

2024-03-31 15:42:56 696

原创 【源码分析】一文看透集合容器

本篇主要是对集合容器List、Set、Queue、Map常用实现类、常用方法进行个源码分析,看透内部设计。如:LinkedBlockingQueue分队列头、队列尾用不同的锁保障线程安全,这种分段的思想在其他一些集合也有出现,如ConcurrentHashMap,学习集合源码除了使用更自由之外,了解到之前不知道的思想也是很有帮助的,希望可以帮助到大家梳理知识.....

2024-03-28 19:17:59 645

原创 【Spring源码分析】Spring之AOP底层源码解析和@Async源码解析

Spring AOP 本质是通过CGLIB动态代理去实现的,它内部是使用的 ProxyFactory 去获取的代理对象,ProxyFactory 支持 JDK 和 CGLIB 动态代理,但是 Spring AOP 在实例化 ProxyFactory 的时候,是使用的 CGLIB 动态代理去获取的代理对象。当代理对象执行方法的时候,首先是去找到ProxyFactory中符合的Advisor,通过里面的Pointcut去筛选,然后将里面的Advice封装成MethodInterceptor对象,最后行成

2024-02-27 13:36:01 1137 1

原创 【Spring源码分析】解析配置类-ConfigurationClassPostProcessor源码分析

通过 ConfigurationClassPostProcessor 把配置类取出来进行解析;配置类只要是被 @Configuration、@Component、@ComponentScan、@Import、@ImportResource 修饰的就算是配置类; 如果配置类上存在 @Component 注解,那就会解析内部类上的配置;如果配置类上存在 @PropertySource 注解,那就会把里面修饰的配置里的k-v放入到Environment中;如果配置类上存在 @ComponentScan 注解,那就

2024-02-15 10:00:00 847

原创 【Spring源码分析】Spring的启动流程源码解析

1构建个DefaultBeanFactory注入进去;2构建环境:reader、scanner、一些BeanPostProcessor这些;3通过 ConfigurationClassPostProcessor 去扫描配置类;4然后去实例化容器里的 BeanPostProcessor 到 beanPostProcessors 集合中;5构建事件传播器;6 实例化非懒加载单例Bean到单例池中。

2024-02-10 22:12:10 1469 2

原创 【Spring源码分析】推断构造方法

当有多个构造 @Autowired 注解,但是 required 都为 false 的话,考虑 autowireConstructor 的逻辑。先是将所候选的构造参数个数降序排序,然后逐个去匹配,看看参数是否都能在容器中找到,找不到就换下一个,找到就用该构造

2024-02-03 01:03:10 1108

原创 【Spring源码分析】循环依赖的底层源码剖析

singletonObjects:缓存所有经过完成整个生命周期的单例Bean。earlySingletonObjects:缓存未经过完整生命周期的Bean,如果某个Bean出现了循环依赖,就会提前把这个暂时未经过完整生命周期的Bean放入 earlySingletonObjects 中,这个 Bean 如果要经过 AOP,那么就会把代理对象放入到 earlySingletonObjects 中,否则就是把原始对象放入 earlySingletonObjects,但是不管怎样,就算是代理对象,代理对象所代理

2024-01-30 15:12:07 1086

原创 【Spring源码分析】@Resource注入的源码解析

若 @Resource 中name没有赋值的话,那么就是咱们常说的:先根据属性名或者参数名进行注入,再根据类型进行注入,就是那个 BeanFactory#resolveDependency 那个方法。@Resource 注解是 jdk 中的,不是 Spring 的;@Resource 和 @Autowire 代码性能上大差不差;@Resource 中的name要是赋值了就只以 name 去查询对应的Bean,不会再根据类型去找了。@Resource 中的 name 要是赋值了,那么会经过一次解析,也就是na

2024-01-26 00:37:06 761

原创 【Spring源码分析】从源码角度去熟悉依赖注入(二)

筛选6步记住:@Value ---- autowireCandidate 元数据属性要为 true ----- @Qualifier 限定符若有需匹配 ------- 多Bean的话 @Primary --------@Priority ------属性名或者参数名匹配

2024-01-24 11:00:00 1344 1

原创 【Spring源码分析】扫描并注册BeanDefinition逻辑

扫描源码一般是接触Spring源码时大家首先去接触的,因为它是去扫描且过滤出符合的条件的Bean的元数据的(注意这里说的是Bean的元数据,并非全是类的元数据,在此过程中用了ASM技术去提取类的元数据进行操作),比如满足includefilter,不是接口,抽象类等等才会被加入候选…

2024-01-20 19:32:44 971

原创 【MySQL自身的性能优化】InnoDB 的 Buffer Pool

InnoDB 通过三种链表来管理缓冲页: Free List(空闲页链表),管理空闲页; Flush List(脏页链表),管理脏页; LRU List(淘汰链表),管理脏页+干净页,将最近且经常查询的数据缓存在其中,而不常查询的数据就淘汰出去。InnoDB 对 LRU 做了一些优化,我们熟悉的 LRU 算法通常是将最近查询的数据放到 LRU 链表的头部,而 InnoDB 做了以下俩点优化(当然还有很多优化点,这里阐述的是重要的俩个):将 LRU 链表分为了 You

2024-01-19 20:03:48 1155

原创 【Spring源码分析】从源码角度去熟悉依赖注入(一)

咱说的依赖注入在生命周期就是对应着属性注入的阶段,其中有在自定义MergedBeanDefinitionPostProcessor中手动设置属性值,和设置对应的是BYTYPE还是BYNAME,还有种就是注解的解析了。前俩者就是去找对应的setter方法,后面注解的形式是通过反射的注入..................

2024-01-18 17:07:52 950

原创 【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑

本文阐述了 getBean 的主要流程,Bean的生命周期主要呈现在 createBean中,实例化前->加载类->实例化->实例化后->属性填充->初始化前->初始化->初始化后,当然每个阶段前后可能还有一些操作,比如一些解决循环依赖啊,用父工厂去进行操作等等等本篇博客没有提及,后续会进行对应的源码分析

2024-01-13 11:46:09 1053

原创 【Spring源码分析】BeanFactory系列接口解读

BeanFactory:顶层接口,提供了最基础的方法,譬如:getBean、containBean,HierarchicalBeanFactory,子接口,拓展了 层次关系,ListableBeanFactory,子接口,拓展了 枚举 能力AutowireCapableBeanFactory,子接口,拓展了 自动装配 能力ConfigurableBeanFactory,子接口,拓展了相关组件 可配置化 的能力ConfigurableListableBeanFactory,集大成者

2023-11-05 13:51:53 311

原创 【ReentrantLock源码分析】非公平锁的加锁和解锁

非公平锁去加锁的时候会尝试去抢俩次,也可以说三次,因为第三次抢锁条件是当当前节点的前一个节点是头节点的时候,即是空的时候,这个时候才会去再次尝试抢锁,也就是后面前面没人排队购票了,然后我正好去购票了。前俩次抢锁一个是在加锁的时候就会进行抢锁,没成功的话,调用 tryAcquire 的时候又会去进行一次抢锁,这里还包括了可重入操作,即更新 state+=1(arg)否则最后进入队列然后将线程挂起。

2023-11-04 11:51:46 219

原创 【Apifox新支持】如何管理与调试 Dubbo 项目?

新版 Apifox 对管理和调试Dubbo项目提供支持了,该学习咯!!!

2023-11-03 01:12:33 993 4

原创 从字节码层面分析Lambda

从这字节码解析后的数据可以看出呢,我们写的Lambda表达式最后成了一个局部方法,有自己的寄存器、局部变量表、操作数栈....这也是为什么我们平时在方法中使用Lambda时访问不了方法定义的变量的原因,原因就是定义的变量在其本身的局部变量表里,而不是在我们写的Lambda的局部变量表里,每个栈帧之间是独立的,所以访问不了

2023-10-27 17:18:08 155

原创 【Spring源码分析】Bean的元数据和一些Spring的工具

BeanDefinition 为我们统一了 bean 的元数据,bean 的元数据就是指我们使用 xml 或者注解进行配置的数据,我们的 spring 容器启动之前的第一步就是加载配置数据,这些元数据会被加载到内存中以一个个 beanDefinition 的形式保存在一个 map 中。

2023-10-13 15:50:08 346

原创 【B+树索引】索引的使用和注意事项

B+ 树索引在空间和时间上都有代价,所以没事儿别瞎建立索引。空间:B+ 树索引的建立,占内存的。时间:当执行增删操作的时候生成执行计划,而且还要给相关的二级索引进行增删,时间上也得付出代价滴。各人认为更好的使用索引就三点:1. 按需求为列前缀进行建立索引;2. 查询时尽量往覆盖索引上查;3. 主键最好是递增形式存在的。

2023-09-22 13:43:19 145

原创 【B+树索引】索引页的结构含有可以快速查询的秘密

在使用二级索引进行查找数据时,如果查询的数据能在二级索引找到,那么就是「索引覆盖」操作,如果查询的数据不在二级索引里,就需要先在二级索引找到主键值,需要去聚簇索引中获得数据行,这个过程就叫作「回表」。还有就是索引就是按说到的B+树,其各个节点对应各个页对应有着各个记录。

2023-09-17 11:47:57 144

原创 【Mybatis源码分析】插件机制和Pagehelper插件源码分析

在分页之前,会先去执行查询所有记录条数的sql,然后再判断给的分页参数是否合理什么的;执行查询所有记录的sql,首先是去看看你有没有设有自己的MappedStatement,其id是id+_COUNT,比如我执行的分页方法是query,那就判断你有没有query_COUNT方法。否则的话Mybatis会为你创一个MappedStatement,这个MappedStatement大部分参数是继承这个查询对应的MappedStatement的参数,比如是否开启二级缓存,那么它会与那个查询对应的Mappe

2023-09-15 21:49:10 176

原创 【即使通信 IM】如何保障消息的实时性、可靠性、有序性、幂等性

通信服务和业务处理服务一般是分开的,通信服务一般拿到消息都是交给业务服务进行处理。为提升用户体验,可以把验证消息放在通信服务层进行处理,然后失败了即时响应,成功了再去业务层处理剩余的业务。消息验证是放在业务层处理的,因为它与业务层的一些类有关联。如何处理呢?使用 Open Feign 去处理远程调用。利用线程池去处理校验后的处理,因为这些操作是串行的,而且不影响原本程序,所以交给其他后台线程处理在合适不过了也是一种优化。

2023-09-13 09:00:00 605

原创 【Mybatis源码分析】动态代理的使用(Javassist、CGLIB、JDK动态代理)

在使用执行器准备执行对应 SQL 时——会调用 MappedStatement.getBoundSql(param) 也就是调用 SqlSource.getBoundSql(param)——我们所说的${}在解析动态SQL的时候其实它对应的就是 TextSqlNode,在getBoundSql执行中就会把 ${} 替换成对应的参数值,#{} 会用 ? 去替换,这个时候就得到真正的sql片段

2023-09-07 22:03:14 402

原创 【Mybatis源码分析】Mybatis查询流程(一级、二级缓存、懒加载原理)

个人觉得一级缓存就是去针对嵌套查询的,因为在实际开发中 SqlSession 的生命周期很短,那么一级缓存可以说就是针对 SqlSession 这个会话域中的在内存中的一个缓存,虽然在查询的过程也会去从一级缓存中取,但是最实用的地方还是在属性映射的时候遇到嵌套查询,然后去一级缓存看看有没有存在结果集。二级缓存的话我觉得是一个全局的缓存,需自己在Mapper中配置cache标签表示使用二级缓存,且要在对应的语句标签上写上 useCache 属性为 true,表示这个语句使用二级缓存,然后会在对应的 Map

2023-09-05 23:53:40 391

原创 线程池也就那么一回事嘛!

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们所知的实现了 Runnable 或 Callable 接口的实例对象。

2023-08-26 09:00:00 154

原创 【Mybatis源码分析】Mybatis 是如何实现预编译的?

Mybatis 实现预编译主要是在执行 sql 前,会调用一个 prepareStatement 方法进行预处理,会传一个 StatementHandler 对象进去,本质是一个 RoutingStatementHandler,但其构造方法其实就是一个路由的作用,内部封装了一个委托者才是真正的执行者。其委托者实现了 instantiateStatement (实例化 Statement) 方法。该方法就是 Mybatis 实现预编译的关键。prepareStatement方法会调用 BaseStatem

2023-08-25 08:15:00 597

原创 【Mybatis源码分析】解析语句标签_Select|Update|Insert|Delete

解析语句标签的核心内容在 XMLStatementBuilder.parseStatementNode 方法中,解析完标签内容然后将其通过 MapperBuilderAssistant 对象映射成 MapperStatement 然后封装到 Configuration 中的 mappedStatements 中。

2023-08-21 15:01:42 249 2

原创 【使用Zookeeper当作注册中心】自己定制负载均衡常见策略

Hash 策略一般指的是一次性 Hash 算法实现的策略。传统的 hash 在添加或删除一个节点的时候,会出现缓存失效,失效缓存比例为:m/(m+1);传统hash一般是将资源的 hashcode % table.size()(服务数)得到节点索引然后将访问服务,这样的话当增加一个节点的时候,除了hashcode为1的时候其对应的服务不变其他都缓存失效(0就不算它了,近似的一个值吧)也就是近于缓存失效比例为 m/m+1。传统的hash造成的缓存失效很容易就把服务给搞蹦了,因为有大量资源访问不到的请求嘛。

2023-08-17 23:40:49 1254

原创 【网络编程(三)】Netty入门到实战这一篇就够了

向ServerBootstrap传递俩个EventLoopGroup,第一个称为BoosGroup用来处理新用户的连接请求,而第二个称为WorkerGroup,用来处理读写操作和业务逻辑,也是为什么一般给BoosGroup线程数设置为1就够用的原因,因为它只处理连接请求

2023-08-12 12:12:55 740 5

原创 【网络编程(二)】NIO快速入门

Java NIO 三大核心组件Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读写。 Selector(选择器):一个选择器对应多个通道,用于监听多个通道的事件。Selector可以监听所有的channel是否有数据要读取,当某个channel有数据时,就去处理,所有channel都没有数据时,线程可以去执行其他任务。

2023-08-11 23:12:37 889

原创 【IDEA问题】下载不了源代码

之所以会出现那个问题,是因为项目构建工具 Maven 的主路径消失了,或者说被 IDEA 改了,然后的话匹配不到下载的执行文件吧。这边的话得把Maven主路径重新设置一下。构建成如下即可解决。

2023-08-10 20:50:29 1258 3

原创 【网络编程(一)】Socket入门实操与BIO详讲

Java BIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。

2023-08-09 08:30:00 152

原创 【入门SpringCloud(一)】什么是SpringCloud?

微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器(有点像将应用程序强遵循单一职责原则的感觉)。各个微服务之间的关联通过暴露 api 来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。Spring Cloud 就是用来处理微服务架构中可能会出现的问题的,它内部有各种各样的组件,各个组件就是用来处理这些问题的。所以可以说Spring Cloud是一种处理微服务架构应用的工具(框架)。

2023-08-01 12:57:55 312 2

原创 【RabbitMQ(day4)】SpringBoot整合RabbitMQ与MQ应用场景说明

秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。可以控制活动人数,超过此一定阀值的订单直接丢弃。可以缓解时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)

2023-08-01 11:37:25 1086

原创 【RabbitMQ(day3)】扇形交换机和主题交换机的应用

扇型交换机将消息路由给绑定到它身上的所有队列,而不会理会绑定的路由键。如果 N 个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的 N 个队列。扇型用来交换机处理消息的广播路由。

2023-07-31 09:00:00 1030

原创 【RabbitMQ(day2)】默认(直连)交换机的应用

使用默认交换机时,队列是在消费者端创建的(可以说是用户本身吧),而不是生产者去创建的。当生产者发送一条消息到 RabbitMQ 时,RabbitMQ 会根据消息的路由键(在使用默认交换机的情况下,路由键即为队列名称)来查找是否已经存在该队列,如果队列不存在,则会丢弃该消息。

2023-07-29 22:48:40 1484

原创 【线程安全的讨论(一)】CPU多核缓存架构和JMM

Java 虚拟机规范中曾经试图定义一种Java内存模型,来屏蔽各种硬件和操作系统的内存访问之间的差异,以实现让Java程序在各种平台上都能达到一致的内存访问效果。在此之前,主流程序语言直接使用物理内存和操作系统的内存模型,会由于不同平台的内存模型差异,可能导致程序在一套平台上发挥完全正常,在另一台就可能发生错误,所以在某种常见的场景下,必须针对平台来进行代码的编写。

2023-07-28 18:00:47 970

原创 【RabbitMQ(day1)】RabbitMQ的概述和安装

RabbitMQ:RabbitMQ 是使用 Erlang 语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求更高的场景,对性能和吞吐量的要求还在其次。RabbitMQ的四大核心:生产者、消费者、队列、交换机。

2023-07-24 08:00:00 653

原创 【MySQL进阶(三)】 InnoDB体系架构之内存池(buffer pool)

InnoDB 存储引擎是基于磁盘进行存储的,并将其中的记录按照页的方式进行管理。由于【磁盘速度】和【内存速度】相比根本不值一提,所以一般基于磁盘的数据库系统通常使用缓冲技术来提高数据库的整体性能。缓冲池简单来说就是一块内存区域。在数据库中进行读取页的操作,首先将磁盘中读到的页存放到缓冲池中,这个过程称为将页【FIX】在缓冲池中。下一次再读相同的页时,首先判断是否在缓冲池中,不再的话再读取磁盘中的页。

2023-07-23 08:00:00 960 2

空空如也

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

TA关注的人

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