Spring
自动装配原理
--反射,feiled 通过反射注入引用。方法通过反射 invoke调用
Required 注解
打在方法上,如果使用前未初始化,会报错bean 未初始化
bean是线程安全的吗
不是,大部分bean都是无状态的,也不会有线程安全问题,如果有状态的,需要开发者处理线程安全问题。
什么是spring innerBean
一个bean 无论何时,只会被当做一个属性调用。
也就是在bean 内部再申明一个bean
Spring bean 作用域
5个,单例 原型、请求、会话、全局会话
Dubbo
注册中心集群整个挂掉了,还能通信吗
可以,消费者还能通过本地缓存找到服务提供者。
负载均衡策略
随机、轮询、最少活跃度、一致性hash
安全机制:
dubbo消费者发起服务通信的时候,需要提供注册中心发放的token、不允许绕开注册中心直连
dubbo协议,为什么消费者比服务提供者多
千兆网络下,打满提供者,需要20个消费线程。
dubbo协议,为啥不建议大数据传输
千兆网卡下,服务提供者网络传输满载支持的最大tps:14,
其他协议:
Rmi:java.rmi协议,阻塞式短链接,jdk序列化。
Hessian协议,底层采用http协议通信,序列化使用hessian二进制协议,内置servlet。dubbo缺省使用neety作为容器。
Thrift:支持跨语言
Mybatis
缓存相关:
一级缓存:
同一个会话相同的sql,第二次直接从一级缓存中提取数据
任何的 UPDATE, INSERT, DELETE 语句都会清空缓存。
可以选择scopre=statement。每次sqlmapper执行后,即清空缓存。
二级缓存:
应用级别的缓存,默认不开启
如何分页
sql分页,limit x,y
分页拦截器。本质还是构造limit,
通过id order by 分页
如何写一个插件
原理:使用jdk代理生成dao层接口的代理类,并在jdbc每个执行步骤前,做AOP切面,回调下面4个切入点
4个扩展点:执行、statementHander/parameterHandler/ResultSetHandler
#$区别,
#通过预编译,把sqlmapper的sql固定下来了,入参会加上''.有效的放置sql注入
$用在传入对象、或者排序的时候使用。直接拼装到sql中了。
延迟加载
就是一个有外联表的时候,sqlmapper中定义的返回对象中嵌套其他对象。
只嵌套对象使用的时候才去查db
JVM
对象创建、内存分配过程、对象的访问定位
对象创建:三个阶段:类加载、链接、初始化
类加载过程:
通过class全类名获取类的二进制流,使用自定义appClassLoader 加载对象、如果没有,则委派给父类加载器加载,。如果都没有,则appClassLoad进行加载
并将加载好的数据放入方法区
链接阶段:
校验:
二进制流解析,café babe 开头,符合虚拟机安全规范的数据
准备
初始化符号引用、默认值
解析
将常理池中符号引用改为直接引用
初始化:
执行cinit的默认方法,
内存分配过程:
Eden->servive0 ->servive1
大部分在eden创建
大对象直接进入老年代
长期存活的分配到老年代
空间担保
https://www.cnblogs.com/godoforange/archive/2019/09/21/11565505.html
对象的访问定位
jvm虚拟机栈中,栈帧中存放了,局部变量表。(方法返回、接口、操作数栈、对象引用)
通过局部变量表中的对象引用来实现对象的访问定位。
https://www.cnblogs.com/YYfish/p/6722258.html
句柄池访问,句柄池地址稳定。对象变化,句柄不变,对于线程存放的句柄地址不会改变
直接访问(hotspot),少一次定位。性能更好。