程序员的金三银四求职宝典
随着春天的脚步渐近,对于许多程序员来说,一年中最繁忙、最重要的面试季节也随之而来。金三银四,即三月和四月,被广大程序员视为求职的黄金时期。在这两个月里,各大公司纷纷开放招聘,求职者们则通过一轮又一轮的面试,力争心仪的职位。而如何在这关键的时期脱颖而出,成为每个求职者关注的焦点。在金三银四的关键时期如何准备,快来看看吧
面试题解析
接着上一篇面试题解析(java程序员的金三银四求职宝典),咱们继续……
41、Spring中常见的设计模式?--也可以说自己用过的设计模式
答:
- 工厂设计模式:BeanFactory(懒加载)或者ApplicationContext(饿加载)创建对象;
- 单例设计模式:spring中的bean默认作用域就是单例。
- 代理设计模式:springAOP就是基于动态代理实现的。代理有:JDK接口代理和CGlib类代理;
- 适配器设计模式:适配器设计模式将一个接口转换成客户希望的另一个接口,适配器模式使得接口不兼容的那些类可以一起工作,其别名为包装器。在spring MVC中,DispatcherServlet根据请求信息调用HanderMapping,解析请求对应的Handler,解析到对应的Handler(也就是controller控制器)后,开始由HanderAdapter适配器处理。
为什么在spring MVC中使用适配器模式?Spring MVC中的controller种类众多,不同类型的controller通过不同的方法来对请求进行处理,有利于代码的维护。
42、Mybatis工作原理?
答:
- 先读配置文件:配置mybatis的运行环境的信息,例如数据库连接信息;
- 加载映射文件:映射文件(xml)就是sql语句文件,需要在mybatis的配置文件中加载;
- 构造会话工厂SqlSessionFactory:通过mybatis的环境等配置信息构建会话工厂SqlSessionFactory;
- 创建会话对象:由会话工厂创建Sqlsession对象,该对象中包含了执行sql语句的所有方法;
- Executor执行器:mybatis底层定义了一个Executor接口来操作数据库,它根据Sqlsession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护。
- MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的sql语句的id、参数等信息。
43、Mybatis有哪些Executor执行器?
答:SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或者select,就开启一个statement对象,用完立刻关闭statement对象。
ReuseExecutor:执行update或者select,以sql作为key查找statement对象,存在就使用,不存在就创建,用完后,不关闭statement对象,而是放置于Map<String,Statement>内,供下一次使用。
BatchExecutor:执行完update,没有select,JDBC批处理不支持select,将所有sql都添加到批处理中,等待同一执行,它缓存了多个statement对象,每个statement对象都是添加完毕后,同一执行的。
44、Redis的数据结构?
答:string、list、set、hash、zset
45、Spring boot starter的工作原理
答:
46、Spring的事务是怎么生效的?AOP使用场景?
答:底层使用的AOP实现的,对被代理的对象的每个方法进行拦截,在方法执行前启动事务,在方法完成后根据是否有异常及异常的类型进行提交或回滚。
Spring AOP动态代理机制:spring在运行期间会为目标对象生成代理对象,并在代理对象中实现目标对象的增强。
Spring AOP中默认的动态代理方式是JDK代理。
AOP使用场景:
- 记录日志;
- 监控方法运行时间;
- 权限控制;
- 事务管理
Spring事务失效场景需要去了解。
47、Spring中的自动配置和自动装配?
答:简单版本:
自动配置:根据项目引入的依赖库来自动配置应用程序中需要的组件;
自动装配:自动将符合条件的bean注入到spring容器中。当我们需要使用某个bean时,springboot会根据bean的类型和名称自动找打对应的bean。
48、实体类中的字段和表中字段不一致的解决方案?
答:
- sql语句中字段起别名(我经常用);
- 在xml中的resultmap中进行字段映射;
49、在mapper如何传递多个参数?
答:
- 如果mapper层的接口形参有多个,那在xml中就使用#{0}、#{1}……的方式按序获取;
- 如果mapper层的接口形参有多个,也可以在mapper中使用@Param注解(我经常使用)
50、Jdk和cglib代理的区别?
答:
51、redis和rabbitmq做消息队列的区别?
答:
Redis:
- 数据持久化,可以将内存中的数据存储到磁盘中;
- 单线程,多路复用技术;
- 支持数据备份。
- 性能极高;
- 原子操作,要么成功要么失败;
- 支持发布和订阅;
Rabbitmq:
- 是一个消息队列技术;
- 异步、消峰、解耦、负载均衡;
- 架构:
3.1消息:转发的二进制对象;
3.2生产者:消息的生产者,负责把消息发送到交换机中;
3.3消费者:使用队列从交换机获取信息;
3.4交换机:负责接收生产者的消息并把它转到合适的队列;
3.5队列:一个存储交换机发来的消息的缓冲,并将消息主动发送给消费者或者消费者主动获取消息;
3.6绑定:队列和交换机之间的关系。交换机根据消息的属性和绑定的属性来转发消息。绑定的一个重要的属性是binding_key;
3.7连接和通道:生产者和消费者需要和mq建立TCP连接。一些应用需要多个连接,为了节省TCP连接,可以使用通道,它被认为是一种轻型的共享TCP连接的连接。连接需要用户认证,并且支持TLS。
52、rabbitmq的使用场景?
答:
- 服务之间的异步通信--就是我执行了某个步骤后,不需要立即知道结果也行,在这个期间我可以去执行其他步骤,等我想知道结果后,我再去看;
- 顺序消费--队列?
- 请求消峰;
- 定时任务?
53、定时任务的实现方式?
答:定时任务的应用场景:客户下单后多久提醒商家发货等
- springboot的@Scheduled注解;
- 采用定时线程池来实现;
- 采用redis队列实现延迟的效果;
- Rabbitmq实现延迟时任务并间接实现动态定时任务。
4.1通过死信的方式实现延时信息消费(队列顺序消费问题和开销过大问题);
死信:生产者将消息投递到队列中,消费从队列中去出信息消费,但是某些时候由于特定的原因导致队列的某些消息无法被消费,这样的消息如果没有后续处理,就会变成死信,所有的死信都会被放到死信队列中。
4.2通过MQ延时插件实现延时任务。
54、Rabbitmq消息基于什么传输的?
答:基于TCP,但是TCP连接断开消耗较大。所以Rabbitmq是使用信道通信,一个TCP连接中有多个信道。
55、Rabbitmq如何保证消息不丢失?
答:消息持久化,消息消费之前,Rabbitmq将消息持久化到磁盘的日志文件中。
56、Mysql中innodb和myisam区别?
答:
- innodb支持ACID(原子性(要么发生,要么不发生)、一致性(事务前后数据一致)、隔离性(不同事务之间操作不影响)、持久性(数据是持久存储的,即使数据库有问题))、事务,myisam不支持ACID、事务;
- Innodb支持行锁,myisam支持表锁;行锁粒度小,表锁粒度大
- Innodb支持外键,myisam不支持外键。
57、Innodb四种事务隔离级别?
答:脏读:读到没有提交的事务结果;不可重复读:两次读取出现数据不一致现象-行级影响;幻读:两次读取出现数据表不一致现象-表级影响。
- 读未提交--可以看到未提交的事务执行结果--出现脏读、不可重复度、幻读;
- 读已提交--只能看到已经提交事务的改变--出现不可重复读、幻读;
- 可重复读--mysql的默认隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。但是会出现幻读;
- 串行--最高隔离级别,它通过强制事务排序,使之不可能互相冲突,从而解决幻读问题。
58、Mysql如何优化distinct?
答:自己也不太理解,也没用过,先记录一下吧。
DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。
59、Mysql中关于锁的问题?
答:
60、实践中如何优化mysql?
答:优化顺序如下:
- sql语句以及索引的优化‘;
- 数据库表的优化;
- 系统配置的优化;
- 硬件的优化;