Java各种原理图
2021-07-30 10:45:08 0 举报
Java、Spring、mysql、redis等各种原理图
作者其他创作
大纲/内容
Entrykey、value、next
栈
@SpringBootConfiguration
@Import({Registrar.class})
对齐
@SpringBootApplicagtion
链表
AnnontationConfigApplicationContext
来自笔记有云公众号作者RickSun
该注解里有要给@Component注解,表示Spring配置类也是一个组件
key是否存在
运行时常量
否
BeanFactory
(n-1) & hash即(数组大小-1)&hash(key)
红黑树
tabele[i]是否为TreeNode
XML配置
程序计数器
获取包路径:例如:com.ifilldream
遍历链表准备插入
注解
HashMap原理
是
运行时常量池
Spring IOC原理
@Configuration
所有线程共享的数据区域
1、jdk8之前叫Entry数组,jdk8之后叫Node2、数组大小必须2的n次幂,这样计算出来的索引值分布更加均匀,减少hash冲突3、即使自定义的数组大小不为2的幂,底层方法也会将其转换为比自己大的且离2的幂接近的2的n次幂4、允许key和value值为null(默认hash算法的情况下,放在数据的0号位置)
将主配置类(即@SpringBootApplication标注的类)的font color=\"#d32f2f\
数组长度>=64且链表长度>=8转换成红黑树红黑树节点<6转换为链表
JavaConfig
5、transfer()将原数组数据转移到扩容后的数组,因为新数组的length变长了,所以需要重新计算数组位置,重新进行ReHash计算
tabele为空或 table大小为0
@EnableAuotConfiguration
BeanFactoryPostProcessor---->生产前修改Bean定义||BeanDefinitionRegistryPostProcessor----->创建一个Bean定义
resize()方法扩容
BeanDefinition
由对应的上下文的invokeBeanFactoryPostProcessors方法扫描成bean定义,以及调用Bean定义的前置操作BeanFactoryPostProcessor
get取值的方法,过程如下:①.指定key 通过hash函数得到key的hash值int hash=key.hashCode();②.调用内部方法getNode(),得到桶号(一般为hash值对桶数求模)int index =hash%Entry[].length;jdk1.6版本后使用位运算替代模运算,int index=hash&( Entry[].length - 1);③.比较桶的内部元素是否与key相等,若都不相等,则没有找到。相等,则取出相等记录的value。④.如果得到key所在的桶的头结点恰好是红黑树节点,就调用红黑树节点的getTreeNode()方法,否则就遍历链表节点。getTreeNode方法使通过调用树形节点的find()方法进行查找。由于之前添加时已经保证这个树是有序的,因此查找时基本就是折半查找,效率很高。⑤.如果对比节点的哈希值和要查找的哈希值相等,就会判断key是否相等,相等就直接返回;不相等就从子树中递归查找
实例数据
1.创建被代理的接口和类2.实现InvocationHandler接口,对目标接口中声明的所有方法进行统一处理3.调用Proxy的静态方法,创建代理类并生成相应的代理对象//主题(Subject)public interface SubjectService { void order();}//实现接口public class SubjectServiceImpl implements SubjectService { public void order() { System.out.println(\"我是静态代理的方法输出\
本地方法栈
链表插入,若Key存在则直接覆盖Value
直接插入
tabele[i]==null
转换红黑树,插入键值对
Tips:链表长度>=8且数组小于64不会转换红黑树而是扩容,这样效率高
扩容阈值=数组大小*0.75负载因子扩容大小=增加为原来的一倍
开始
静态代理
@Import({EnableAutoConfigurationImportSelector.class})
JVM运行时内存结构
直接覆盖Value
font color=\"#d32f2f\
对象头
1、创建一个抽象类,即被代理的对象。2、写一个抽象类的实现类A3、写一个抽象类的实现类B,然后将A作为B的成员变量进行代理,然后写一个构造器,再复写抽象类并调用代理类的方法,如需要也可进行扩展缺点就是每一个代理类都必须实现一遍委托类(也就是realsubject)的接口,如果接口增加方法,则代理类也必须跟着修改。其次,代理类每一个接口对象对应一个委托对象,如果委托对象非常多,则静态代理类就非常臃肿,难以胜任。//主题(Subject)public interface SubjectService { void order();}//实现接口public class SubjectServiceImpl implements SubjectService { public void order() { System.out.println(\"我是静态代理的方法输出\"); }}//代理类public class SubjectServiceProxy implements SubjectService { //代理对象 private SubjectService proxiedSubjectService; public SubjectServiceProxy(SubjectService subjectService) { this.proxiedSubjectService=subjectService; } public void order() { System.out.println(\"日志收集开始..\"); proxiedSubjectService.order(); System.out.println(\"日志收集结束..\"); }}
Bean前置处理器操作BeanDefiniton
扩容
各个线程独享的数据区域
链表长度是否>=8
数组
Spring自动装配原理
根据Key的hash计算值获取数组的位置i
JDK动态代理
方法区(元空间)
类
conpomnent-scan扫描成一个bean定义
逻 辑 判 断
来自公众号笔记有云作者RickSun
Put完成
@AutoConfigurationPackage
堆
BeanPostProcessor知识点:AOP是在初始化之后创建对象的
table为Node数组用于存放key、value、next
红黑树直接插入键值对
>=1.8尾插法,其他头插法
键值对数量+1>threshoId扩容阈值
Bean后置处理器操作Bean
ClassPathXmlApplicationContext
0 条评论
回复 删除
下一页