- 博客(72)
- 资源 (7)
- 收藏
- 关注
原创 Spring源码阅读(六)-AOP
一、AnnotationAwareAspectJAutoProxyCreator1、先看下继承关系:2、AnnotationAwareAspectJAutoProxyCreator分别继承了BeanPostProcessor、InstantiationAwareBeanPostProcessor,所以AnnotationAwareAspectJAutoProxyCreator会有postProcessAfterInitialization()、postProcessBeforeInstantiatio
2021-01-16 17:20:27
223
原创 Spring源码阅读(五)-IOC
一、三级缓存1、单例bean在三级缓存中查找顺序如下:从DefaultSingletonBeanRegistry#getSingleton()源码中也可以看出:protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null
2021-01-16 15:04:50
121
原创 Spring源码阅读(四)-注册BeanDefinition-ConfigurationClassPostProcessor
一、ConfigurationClassPostProcessor以零配置方式(即AnnotationConfigApplicationContext)启动的Spring,会注册一个ConfigurationClassPostProcessor,它的postProcessBeanDefinitionRegistry()方法就是通过解析配置类,注册BeanDefinition的!下面通过调用链和代码片段来看下这个BeanFactoryPostProcessor注册的地方。AnnotationConfigA
2021-01-11 19:37:27
238
原创 Spring源码阅读(三)-AbstractApplicationContext#invokeBeanFactoryPostProcessors
一、BeanFactoryPostProcessor1、BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,SpringIoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。2、BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,比BeanFactoryPostP
2021-01-11 15:50:01
209
原创 Spring源码阅读(二)-BeanFactory
一、AnnotationConfigApplicationContext和DefaultListableBeanFactory的关系AnnotationConfigApplicationContext的父类GenericApplicationContext包含了DefaultListableBeanFactory,如下图:后续ApplicationContext涉及到对Bean工厂的操作,其实操作的都是DefaultListableBeanFactory这个Bean工厂实现类。二、Defaul
2021-01-11 11:22:23
196
原创 Zookeeper源码分析
一、ZK集群间通信类型zookeeper集群间通信大体可分为四类:数据同步型,服务器初始化型,请求处理型,会话管理型。数据同步型:(leader和flower通信的端口号: 2888)服务器初始化型(leader和flower通信的端口号: 2888)请求处理型(client的端口号: 2181,NIO/Netty)会话管理型(leader和flower通信的端口号: 2888)二、ZK常用的几个常用端口号:接收客户请求的端口号: 2181(NIO/Netty)leader和
2021-01-09 17:51:13
338
原创 分布式事务:XA(2PC、3PC)和TCC
一、XA协议 XA是X/Open组织 提出的分布式事务处理规范。XA则规范了TM(事务管理器)与RM(资源管理器)之间的通信接口,在TM与多个RM之间形成一个双向通信桥梁,从而在多个数据库资源下保证ACID四个特性。目前知名的数据库,如Oracle, DB2,mysql等,都是实现了XA接口的,都可以作为RM。所以说XA是数据库的分布式事务,强一致性,在整个分布式事务过程中,TM一直把持折数据库的锁,存在长事务风险!XA协议有2PC、3PC。 1、2PC阶
2021-01-07 16:57:34
1987
原创 BIO、NIO、多路复用(select、poll、epoll)
一、BIO二、NIO由NIO的调用图可知,轮询发生在用户空间,联想一下工作中的开发场景:业务系统A需要调用业务系统B的基础服务来查询单个用户的信息;随着业务的发展,A的逻辑变复杂了,需要查100个用户的信息。显然,A希望B提供一个批量查询的接口,用集合作为入参,一次性把数据传递过去就省去了频繁的系统间调用。因此多路复用也是基本按照这个思路进行优化的——将轮询操作放到内核空间!三、多路复用多路复用在Linux内核代码迭代过程中依次支持了三种调用,即select、poll、epoll三种多路
2020-12-30 16:45:11
371
原创 Tomcat源码阅读-tomcat是如何打破双亲委派的?
一、为什么要打破双亲委派Tomcat中会部署多个应用,每个应用可能会出现相同的类名,或者引用相同的jar包但版本不同,若使用双亲委派,一个类只会加载一次,项目就互相之间有冲突,若打破双亲委派,可以实现各自的应用加载自己应用的类,互不影响。二、如何打破双亲委派原理:自定义类加载器,然后重写loadClass,不先由父类加载。Tomcat中的自定义的类加载器就是WebappClassLoaderBase,先看下loadClass方法的流程图:所以又上面的流程图可知,正常情况下(没有设置代理的情况下),
2020-12-21 15:57:32
1938
原创 Spring MVC源码阅读(一)-父子容器的加载
Spring父子容器在spring和springmvc进行整合的时候,需要加载父子容器:springIOC容器和springmvc容器,如下图:而这两个父子容器的加载则是从web.xml这个配置文件开始,web.xml文件中有两个重要的组件:ContextLoaderListener、DispatcherServlet。二、ContextLoaderListener加载父容器先看下其类的继承关系:而当Servlet容器(如Tomcat)在启动的时候会加载ServletContextListen
2020-12-21 14:17:04
296
原创 Tomcat源码阅读—如何启动SpringWeb项目
Tomcat调用ServletContainerInitializer的实现类的onStartup()方法之前的一篇文章《SpringBoot如何省去Web.xml?》中介绍了Servlet3.0之后,Servlet容器(如Tomcat)在启动之后,会调用jar包META-INF/services/javax.servlet.ServletContainerInitializer中指定的类的实现,并且SpringWeb的类SpringServletContainerInitializer实现了这个接口,
2020-12-17 14:51:14
368
原创 Spring源码阅读(一)-核心要点
一、BeanFactory和ApplicationContext的关系首先看下类图:由上图可知,BeanFactory是ApplicationContex的接口,主要是生成、获取bean;而ApplicationContex又拓展了许多高级特性,比如国际化、访问资源文件、事件发布、AOP等。二、Spring解决循环依赖的代码位置org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitia
2020-12-08 14:07:00
551
原创 如何去除if else
如何去除if else?策略模式+工厂模式+Map事例入下代码片段:其中ShareItem 是 Link、Image、Text、ImageText的抽象类。工厂类 ShareItemFactorypublic class ShareItemFactory{ private Map<Integer, Class<? extends ShareItem>> map = new HashMap<>(); private void init() { map
2020-12-04 16:49:10
203
原创 Mybatis插件开发
一、Mybatis插件介绍: Mybatis插件又称拦截器,Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的)。Mybatis的插件是采用对四大接口的对象生成动态代理对象的方法来实现的。那么现在我们看下Mybatis是怎么创建这四大接口对象的。public Executor newExecutor(Transaction transaction, ExecutorType executorType) { //
2020-12-04 16:21:48
411
1
原创 Disruptor引发的OOM
一、OOM原因分析:Disruptor的队列深度过长,同时队列中元素过大,会导致堆内存一直不停堆积无法释放,最终导致OOM二、MAT工具分析定位:1、查看堆中较大的对象有哪些?个event大小100多K ,如果队列里全是这种报错异常的event,也有50M大小RingBuffer中元素 event 中保存了外部接口报错的堆栈信息。而该异常信息并不需要保存2、定位查看使用Disruptor的代码队列深度event实体类成员变量中有保存异常信息接口报错,将异常堆栈保存到event中...
2020-12-04 15:52:18
694
原创 SpringBoot如何省去Web.xml?
1、Web.xml 是Spring应用和Servlet联系的中介Servlet容器启动后,Servlet容器会根据web.xml中的配置初始化Spring容器。2、Servlet3.0奠定了SpringBoot 零xml配置的基础在Servlet3.0容器初始化时会调用jar包META-INF/services/javax.servlet.ServletContainerInitializer中指定的类的实现(javax.servlet.ServletContainerInitializer中的实现替
2020-05-16 11:14:03
795
1
原创 Spring MVC—web.xml 小结
web.xml组件结构1、listener:(springIOC_Context-父容器创建,再将其set进 servletContext)ContextLoaderListener -> ServletContextListener.contextInitialized(ServletContextEvent event)-> org.springframework.web....
2020-04-27 20:48:34
143
原创 事务隔离级别
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: 一 • 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.二 • 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之...
2019-10-10 10:45:19
134
转载 ThreadLocal数据结构
1、ThreadLocal类用于存储以线程为作用域的数据,线程之间数据隔离。2、ThreadLocalMap类是ThreadLocal的静态内部类,通过操作Entry来存储数据。3、Thread类比较常用,线程类内部维持一个ThreadLocalMap类实例(threadLocals)。...
2019-10-08 11:06:27
689
原创 多线程-AQS和锁笔记
这里写自定义目录标题多线程-AQS和锁多线程-AQS和锁AQS 队列同步器 三要素 :CAS 通过此竞争来锁资源LockSurpport.park/unpark 线程阻塞和释放CLH 双向链表 存放被阻塞的线程Synchronized、ReentrantLock都是可重入锁 可重入锁的意义就是防止死锁公平锁和非公平锁的区别在于是否可以插队...
2019-09-30 16:04:46
277
原创 大学分享的课程
大学分享的课程“北大图书馆”Github 传送门: https://github.com/lib-pku/libpku浙大项目传送门:https://github.com/QSCTech/zju-icicles清华大学共享了计算机系课程资源:https://github.com/Trinkle23897/thu-cst-cracker 中科大共享了计算机学院的课程资源:https:/...
2019-04-09 17:57:39
322
转载 Spring中同一个service类中方法相互调用事务不生效问题解决方案
此处的this指向目标对象,因此调用this.b()将不会执行b事务切面,即不会执行事务增强,因此b方法的事务定义@Transactional(propagation = Propagation.REQUIRES_NEW)将不会实施.在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务.是因为spring采用动态代理机制来实现事务控制,而动态代...
2019-03-11 21:06:03
5890
1
转载 Kafka 数据丢失和重复消费问题
首先介绍下 producer与consumer有可能的delivery guarantee:At most once 消息可能会丢,但绝不会重复传输At least one 消息绝不会丢,但可能会重复传输Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的一、数据丢失问题:生产方:producer 的deliver guarantee 可以通过re...
2019-03-08 11:19:48
1870
转载 如何在mysql中查询每个分组的前几名
#问题# 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等。 在orcale等数据库中可以使用partition 语句来解决,但在mysql中就比较麻烦了。这次翻译的文章就是专门解决这个问题的在使用SQL的过程中,我们经常遇到这样一类问题:如何找出每个程序最近的日志条目?如何找出每个用户的最高分?在每个分类中最受欢迎的商品是什么?通常这类“找出每个分组中最高分的条目”...
2019-03-05 20:53:35
526
转载 分布式理论(二)——Base 理论
前言在前文 分布式理论(一) —— CAP 定理 中,我们说,CAP 不可能同时满足,而分区容错是对于分布式系统而言,是必须的。最后,我们说,如果系统能够同时实现 CAP 是再好不过的了,所以出现了 BASE 理论,今天就来讲讲 Base 理论。什么是 Base 理论BASE:全称:Basically Available(基本可用),Soft state(软状态),和 Eventuall...
2019-02-18 20:12:10
182
转载 Kafka 设计详解之网络通信
转载:https://www.jianshu.com/p/eab8f15880b5前言Kafka 是 LinkedIn 开发的一个分布式的消息中间件。由于其高吞吐量、可水平扩展等特性,目前被广泛使用,已经是目前大数据生态系统中不可或缺的一环,有关其详细介绍可以查看官方的文档。Kafka 的流行源于他优秀的设计,如依靠磁盘(以及操作系统的 Page Cache)而不是内存来存储队列数据、充分使用...
2019-02-18 12:03:31
388
原创 I/O多路复用
Linux 5种网络I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O、异步I/OI/O多路复用:多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次...
2019-02-18 11:45:19
178
原创 JVM垃圾回收算法小结
对象生存判断算法1、引用计数法给对象中添加一个引用计数器,每当一个地方引用到这个对象的时候,计数器值就加1,当引用失效时,计数器的值就减1,当计数器值变为0时,便说明该对象不可能再被使用了。优点:实现简单,判定效率较高。缺点:当出现对象之间的相互循环引用时,即两个类中都存在引用字段分别引用着对方的时候,在回收过程中这时该算法无效。2、可达性分析算法为了克服引用计数法的弊端,现在比较主流...
2019-02-18 11:14:47
163
原创 Kafka参数调优(一)-生产者Producer
Producer参数一、request.required.acksKafka producer的ack有3中机制,初始化producer时的producerconfig可以通过配置request.required.acks不同的值来实现。0:这意味着生产者producer不等待来自broker同步完成的确认继续发送下一条(批)消息。此选项提供最低的延迟但最弱的耐久性保证(当服务器发生故障...
2019-02-18 10:26:49
5287
2
转载 java多线程 ThreadPoolExecutor 策略的坑
无论是使用jdk的线程池ThreadPoolExecutor 还是spring的线程池ThreadPoolTaskExecutor 都会使用到一个阻塞队列来进行存储线程任务。当线程不够用时,则将后续的任务暂存到 阻塞队列中,等待有空闲线程来进行。当这个阻塞队列满了的时候,会出现两种情况正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;正在运行的线程数量...
2019-02-18 09:47:04
505
转载 如何合理地估算线程池大小?
如何合理地估算线程池大小?如何合理地估算线程池大小?链接地址:http://www.importnew.com/17384.html这个问题虽然看起来很小,却并不那么容易回答。大家如果有更好的方法欢迎赐教,先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完...
2019-02-18 09:38:57
179
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅