20230910java面经整理

1.threadlocalmap和hashmap解决哈希冲突的方式

哈希冲突指多个对象抢同一个哈希槽
hashmap使用拉链法,同一个槽维护一个链表或红黑树
threadlocalmap使用开放地址法,会进行探测(线性、二次、双重)
拉链法适用于解决频繁产生哈希冲突(数据量不可预测)
因为threadlocalmap的key是threadlocal,发生哈希碰撞的几率很小

2.bean生命周期对外开放的接口以及作用

生命周期:创建前准备 -》 创建实例 -〉 依赖注入 -》 容器缓存 -〉销毁实例
initializingBean: 在bean属性设置完成后,执行自定义的初始化逻辑
DisposableBean: 销毁bean时,执行自定义的清理逻辑 #
@PostConstruct: bean初始化时调用
@PreDestroy: bean销毁之前调用
BeanPostProcessor:修改bean属性值,包装bean对象
InstantiationAwareBeanPostProcessor :控制bean的创建,在属性注入时对属性进行处理
BeanFactoryPostProcessor:在加载bean定义后,在bean实例化之前修改beanFactory的配置

3.bean初始化后进行修改的方式

1.让您的 Bean 类实现 InitializingBean 接口,并重写 afterPropertiesSet 方法
2.@PostConstruct
3.实现 BeanPostProcessor 接口,它包含 postProcessBeforeInitialization 和 postProcessAfterInitialization 两个方法
4.如果您的 Bean 是通过实现 FactoryBean 接口来创建的,您可以在 FactoryBean 的 getObject 方法中返回一个经过修改的 Bean 实例
5.实现 BeanFactoryPostProcessor 接口,可以在容器加载 Bean 定义后,在 Bean 实例化之前修改 Bean 的配置

4.注解如何继承

1.元注解@inherited,可以向下传递,针对于类
2.基于类\接口继承,子类重写的没有注解,针对与属性和方法

5.@Primary

一个接口的实现类有多个的时候,spring不知道注入哪个
@Primary:优先考虑被注解的对象注入,只有一个,直接注入
@Qualifier:申明后对名字进行使用

6.声明式事务的原理

1.spring启动,进行事务自动注册,创建动态代理bean的后置处理器以及管理事务相关的bean
2.创建bean时,通过bean后置管理器找到@transational注解的方法,存入缓存
3.创建动态代理,对有注解的创建动态代理
4.当调用有@transational注解的方法的方法或类,进入transactionInterceptor总,触发代理逻辑,开启事务,分别处理嵌套事务和单一事务。如果抛异常则回滚,无异常则提交

7.声明式事务的传播机制

保证一个事务在多个调用方法之间可控
7种
required:默认级别,如果存在事务则加入,否则创建新的
required_new:创建一个新的,如果存在则把当前挂起
supports:如果存在则加入,不存在则非事务
mandatory:如果存在则加入,不存在抛异常
not_supports:以非事务运行,如果存在事务则挂起
never:非事务运行,如果存在则异常
nested:如果存在事务,则创建一个事务作为当前的嵌套事务;如果没有则创建新的

8.声明式事务失效的情况

@transactional应用在非public方法
@transactional的propagation使用非事务
@transactional的rollbackFor设置错误
同一个类种方法调用,A调用B,A没有申明B申明了,会失效(只有被当前类以外的调用才行)
异常被catch捕获
例如myisam引擎不支持事务

9.分布式事务的解决方案

一次操作多个系统协同,一次事务涉及多个系统通过网络协同完成的过程。
cap:一致,可用,分区容忍性

1.2pc:prepare阶段协调者通知准备提交,反馈执行结果但不提交事务;commit阶段通知可以提交,反馈事务提交结果,失败就会滚(增加了协调者的开销)
2.事务补偿tcc:try完成提交事务前的检查预留资源;confirm确定执行业务对try的资源正式执行;cancel取消业务对try资源的释放
3.消息事务:基于中间件的2pc,将本地事务和发消息放在一个事务,保证本地操作和发送消息同时成功,异步协调,不利于高并发

10.mysql的常见优化手段(存储,查询,索引)

索引:主键查询不会回表,避免<>和!=会导致全表,合适的前缀索引
查询:避免*指定字段,使用join替代子查询减少临时表开销,小表驱动大表,注意列上的运算,适当加入冗余字段
数据库结构:用char18替代varchar18,简单的数据结构,少用text,适当分表分库
联合索引最左匹配原则
满查询:日志,explain排查定位

猜你喜欢

转载自blog.csdn.net/weixin_40986490/article/details/132790449
今日推荐