摘要:
1. 简介 组合模式(Composite Pattern):将对象组合成树形结构以表示部分-整体的层次关系。 2. 示例 假设要设计一个文件系统的目录,需要灵活的在某个目录下添加、删除目录或文件,统计指定目录下的文件个数,计算指定目录下的文件大小。 设计类图如下: 抽象类Node package c 阅读全文
摘要:
1. 概述 上一篇抛出了一个缓存不一致问题,即多线程在多cpu执行过程中,各cpu高速缓存之间会出现数据不一致,或者cpu高速缓存与主内存数据不一致。从计算机的发展历史看,解决缓存数据不一致,先后出现了两种方案,一种是总线加锁,该方案现在基本不用了,主要原因是性能差。第二种是目前主流的缓存一致性协议 阅读全文
摘要:
1. 背景 现代计算机技术中,cpu的计算速度远远高于主内存的读写速度。为了解决速度不匹配问题,充分利用cpu的性能,在cpu与主内存之间加入了多级缓存,也叫高速缓存,cpu读取数据直接从高速缓存中读取,写数据也类似,最后将数据从高速缓存同步到主内存。 2. cpu多级缓存模型 现代cpu多采用多核 阅读全文
摘要:
希望之光永远向着目标清晰的人敞开。 1. 循环依赖概述 循环依赖通俗讲就是循环引用,指两个或两个以上对象的bean相互引用对方,A依赖于B,B依赖于A,最终形成一个闭环。 Spring循环依赖的场景有两种: 构造器的循环依赖 field 属性的循环依赖 对于构造器的循环依赖,Spring 是无法解决 阅读全文
摘要:
只要不放弃,希望迟早都会到来! 1. Bean的初始化 如果把bean的生命周期看作一个婴儿诞生过程的,那么创建实例相当于婴儿从母体出来,一丝不挂光秃秃;属性赋值相当于给宝宝的头带帽子,上身穿衣服、下神穿裤子、还有脚丫穿袜子;而初始化相当于教宝宝一些常规的动作,比如给宝宝吸奶,打嗝拍打,哄睡觉等,本 阅读全文
摘要:
每次进入源码的世界,就像完成一场奇妙的旅行! 1. 属性赋值概述 上一篇讲述了bean实例化中的创建实例过程,实例化后就需要对类中的属性进行依赖注入操作,本篇将重点分析属性赋值相关流程。其中属性赋值,体现在AbstractAutowireCapableBeanFactory类中的doCreateBe 阅读全文
摘要:
人生需要探索的热情、坚持的勇气以及热爱生活热爱自己的力量。 1. Bean的实例化 上一篇讲述了bean的生命周期,其中第一步就涉及到了bean的实例化,本文重点分析bean实例化,先进入源码中的AbstractAutowireCapableBeanFactory类中的createBeanInsta 阅读全文
摘要:
为源码付出的每一分努力都不会白费。 1. Bean的实例化概述 前一篇分析了BeanDefinition的封装过程,最终将beanName与BeanDefinition以一对一映射关系放到beanDefinitionMap容器中,这一篇重点分析如何利用bean的定义信息BeanDefinition实 阅读全文
摘要:
1. BeanDefinition简介 前面讲的解析bean标签,本质就是将bean的信息封装成BeanDefinition对象的过程,最后放入容器beanDefinitionMap中。spring 要根据 BeanDefinition对象来实例化bean,只要把解析的标签,扫描的注解类封装成Bea 阅读全文
摘要:
1. 读源码的方法 java程序员都知道读源码的重要性,尤其是spring的源码,代码设计不仅优雅,而且功能越来越强大,几乎可以与很多开源框架整合,让应用更易于专注业务领域开发。但是能把spring的源码吃透,不仅需要花费大量时间与精力,更需要需要掌握一些方法。下面结合自己读源码与走过的一些弯路,结 阅读全文