spring
[x] Spring IoC 原理
inversion of control 控制反转,将原来调用者创建对象并管理对象生命周期的操作交给 spring ioc容器,通过xml、注解声明bean,构造函数注入bean
通过反射获取对象信息:属性、成员、方法,通过注解或xml方式说明对象依赖关系,通过构造或注解的方式将对象注入到调用者中
[x]Spring AOP 原理和使用
JDKProxy与cglib动态代理,
默认策略:如果目标类是接口则采用jdkproxy,否则采用cglib。
相同点:为目标对象生成代理对象类。
不同点:jdk使用反射机制实现的,通过invocationHandler.invoke实现;cglib是通过对代理对象类的字节码进行操作的
使用场景:日志处理、权限认证
[x]bean生命周期
bean实例化->属性赋值->beanpostprocesser前置处理->初始化bean->初始化init-method->beanpostprocesser后置处理->销毁注册的接口回调->调用destory-method销毁bean
[x] MyBatis 的核心流程
1.读取mybatis-config配置文件,连接数据库
2.读取mapper.xml映射文件,
3.创建sqlSessionFactory
4.创建sqlSession,封装了对数据库的操作
5.sqlSession中委托Executor操作数据库,将动态参数拼接到sql语句中,
6.Executor中有一个属性是mappendStatement,主要对映射信息的封装,用于存储sql语句的id、参数等
6.1 输入参数映射,通过parameterType
6.2 输出参数映射,用过resultType
数据库
[] 索引原理
主键索引(不能为null)、唯一索引(不可重复,可为null)、联合索引(最左匹配,where条件的字段存在于最左边生效,碰到范围查询则停止生效)
索引不生效:OR关键字、%模糊查询、不遵循最左匹配原则
建立索引的原则:避免经常存取的列建立索引;where条件出现次数多的列建立索引;选择区分度高的列建立索引;小型的表避免建立索引
索引实现原理:
1.hash索引,主要通过哈希值来检索,精确查询比较合适,范围查询比较消耗性能,hash值没有规律,两个相同的hash值可能会放在不同的bucket里面;
2.btree索引,将key、data都放在节点里面,key值存储较少,数据量大导致 层级深,增加磁盘io,查询效率较低;
3.b+tree索引(mysql常用)
1.数据记录节点按照键值大小有效存储在叶子节点上,
2.非叶子节点存储key的信息,降低b+tree的高度,
3.叶子节点的关键字都是从小到大有序排序,基于有序链表实现
4.全节点遍历效率高,数据记录都维护在同一层叶子节点
[] 隔离级别
1.read uncommited 读未提交,出现脏读,两个并发事务,A事务改数据未提交,B事务能读到未提交事务的数据,
2.read commited 读已提交,避免脏读,两个 并发事务,A事务读到了数据,B事务修改了数据并提交,A事务再读数据,已经发生了变化,出现不可重复读
3.repeatable read 可重复读,避免不可重复读,两个并发事务,A事务读取数据,B事务修改 提交,A事务提交之前读取,还是原来的值, 可以重复读,A在事务过程中,即使B修改了数据,并且commit,A读取的还是老的数据。即 可重复读。
4.serilized 串行化,A事务执行完提交后,B事务才能开启,性能很低
[]innodb、myisam 区别
1.innodb 支持事务,my不支持,mysql选用innodb的原因
2.支持外键,不支持
3.支持局促索引,不支持
4.行锁、表锁
jvm
[]jvm原理
区域划分
=====线程共享
堆:存放对象的地方
方法区:类的成员变量、方法定义、静态成员变量存放
常量池:
=====线程独享
虚拟机栈:记录栈桢、方法返回地址
程序计数器:程序指令
本地方法栈:调用系统原生方法
GC原理
垃圾分代收集
年轻代:eden、from、to
开始分配 eden区,满了之后出发gc,标识不可达对象,可达对象移到from,清除不可达对象;时间推移,eden又满了,此时eden、from都有对象,将可达对象都移到to,清除不可达对象;eden满了,将eden、to可达对象移到from,清除不可达,循环往复,达到一定阈值,将对象晋升到老年代
老年代:
永久代:
map
[]put
key存在,覆盖value
key不存在,通过key的hash方法计算hash值,
数组不存在,resize初始化容量16的数组
key的hash值与数组的最大索引做位运算,得到数组中的位置
位置不存在元素,创建node节点存放在数组中
存在,判断key与node节点的key是否一致,旧值覆盖新值,
不一致,判断是红黑树还是链表
红黑树,将node挂到红黑树上
链表,遍历 添加到节点中
长度达到8位,会进行树化,调用treeifBin方法,获取数组长度,达到64位,会转成红黑树
[]get
通过key的hash方法得到数组下标,获取元素
将key与元素中的key进行比较,如果一直则返回
list
[]add
底层是一个object数组,创建对象时初始化
add方法核心是自动扩容机制,当数组长度不满足使用时,扩展为原来的1.5倍,并将旧数组copy到新数组中
[]get
数组越界等方面检查
将数组中指定元素返回
建立索引的原则
1,对于经常存取的列避免建立索引。
2,尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。
3,尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。
4,对于小型的表,建立索引可能会影响性能
5,选择对区分度高的字段建立索引
6,避免选择大型数据类型的列作为索引