后端大厂面试总结大全一
目录:
- 1、springIOC的流程以及bean的生命周期以及注入bean的几种方式
- 2、Spring如何解决循环依赖问题
- 3、hashSet的实现原理
- 4、http请求到controller方法之间的过程
- 5、mysql加索引的方式
- 6、线程池的使用流程以及参数以及状态
- 7、mybatisPlus实现分页操作流程
- 8、MyBatis如何获取新插入数据主键
- 9、quartz和springTask定时任务的区别
- 10、sql的三范式
- 11、fegin负载均衡的策略
- 12、mybatis的核心组件
- 13、mybatis的拦截器以及springMvc的拦截器
- 14、Redis缓存穿透和雪崩
- 15、网络7层模型
1、springIOC的流程以及bean的生命周期以及注入bean的几种方式
1、首先,通过BeanDefinitionReader 读取指定的配置文件生成bean的定义信息,然后到完整的bean定义信息(BeanDefinition对象),注意这里只是存储bean的定义信息,还没有实例化bean对象;就像工厂里面一样,原材料已经准备好了,但是还没有进行生产,原材料就是beanDefinition,生产就是实例化。
2、在 BeanDefinition 和 完整BeanDefinition 中间通过一个后置增强器,可以对bean的定义信息进行统一修改,只需要实现 BeanFactoryPostProcessor 接口即可,这个后置增强器是可以有多个的,你只要在不同的类实现多个 BeanFactoryPostProcessor 接口就会执行多次。
3、得到完整BeanDefinition之后就可以进行创建对象了,这整个过程被称为 bean 的生命周期,也就是从实例化到销毁的过程;
4、初始化又要经历三步:实例化,属性赋值,初始化。
注入方式以及@Autowired和@Resource的区别
2、Spring如何解决循环依赖问题
说白了就是利用了三级缓存来实现的。
循环依赖
3、hashSet的实现原理
HashSet是基于HashMap实现的,是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素(但最多只能有一个值为null)。HashSet中不允许由重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final PRESENT = new Object();
HashSet中add()方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put()方法,首先会判断key是否存在,如果key存在则修改value的值,如果key不存在则插入这个key-value键值对。而在HashSet中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key是否存在),如果不存在则插入,如果存在则不插入,这样HashSet中就不存在重复元素。
而判断key是否存在就要重写元素的类的equals()方法和hashCode()方法,当向HashSet中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在HashSet中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()方法比较两个对象是否相同,相同则不能被添加。
4、http请求到controller方法之间的过程
拿到地址进行域名解析,找到服务器,然后servlet收到请求,找映射器,再找适配器,然后找到handler执行对应的controller。
参考链接
5、mysql加索引的方式
1.添加primary key(主键索引)
alter table 表名 add primary key(列名);
2.添加unique(唯一索引)
alter table 表名 add unique(列名);
3.添加index(普通索引)
alter table 表名 add index 索引名(index_name) (列名);
4.添加fulltext(全文索引)
alter table 表名 add fulltext (列名);
5.添加多列索引
alter table 表名 add index 索引名(index_name) (列名1,列名2…);
6、线程池的使用流程以及参数以及状态
工作流程:
1、线程在有任务的时候会创建核心的线程数corePoolSize
2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。
3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。
4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。
这 7 个参数分别是:
corePoolSize:核心线程数。
maximumPoolSize:最大线程数。
keepAliveTime:空闲线程存活时间。
TimeUnit:时间单位。
BlockingQueue:线程池任务队列。
ThreadFactory:创建线程的工厂。
RejectedExecutionHandler:拒绝策略。
线程有 6 种状态:
NEW:初始化状态、
RUNNABLE:可运行/运行状态、
BLOCKED:阻塞状态、
WAITING:无时限等待状态、
TIMED_WAITING:有时限等待状态
TERMINATED:终止状态。
线程池的状态有以下 5 种:
RUNNING:运行状态,线程池创建好之后就会进入此状态,如果不手动调用关闭方法,那么线程池在整个程序运行期间都是此状态。
SHUTDOWN:关闭状态,不再接受新任务提交,但是会将已保存在任务队列中的任务处理完。
STOP:停止状态,不再接受新任务提交,并且会中断当前正在执行的任务、放弃任务队列中已有的任务。
TIDYING:整理状态,所有的任务都执行完毕后(也包括任务队列中的任务执行完),当前线程池中的活动线程数降为 0
时的状态。到此状态之后,会调用线程池的 terminated() 方法。 TERMINATED:销毁状态,当执行完线程池的
terminated() 方法之后就会变为此状态。
7、mybatisPlus实现分页操作流程
1、.写个Mybatis-plus配置类,就可以直接使用
2、使用Page对象来对数据进行封装
8、MyBatis如何获取新插入数据主键
9、quartz和springTask定时任务的区别
1、相同点: 两者均能实现定时调度任务
2、Quartz
① 默认多线程异步执行
② 单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度。业务繁忙时,一个任务会有多个调度,可能导致数据处理异常。
③ 多个任务时,任务之间没有直接影响,多任务执行的快慢取决于CPU的性能
④ 触发方式 : (1)SimpleTrigger (2)CronTrigger
⑥ 能被集群实例化,支持分布式部署
⑦使用JobStoreCMT(JDBCJobStore的子类),Quartz 能参与JTA事务;Quartz 能管理JTA事务(开始和提交)在执行任务之间,这样,任务做的事就可以发生在JTA事务里。
3、Task:
① 默认单线程同步执行
② 单个任务时,当前次的调度完成后,再执行下一次任务调度
③ 多个任务时,一个任务执行完成后才会执行下一个任务。若需要任务能够并发执行,需手动设置线程
④ 触发方式:
与Quartz的CronTrigger的表达式类似
可以使用注解标注定时任务
10、sql的三范式
第一范式(1NF)
(必须有主键,列不可分)
数据库表中的任何字段都是单一属性的,不可再分
第二范式(2NF)
数据库表中非关键字段对任一候选关键字段的 都 不存在部分函数依赖
(当一个表是复合主键时,非主键的字段不依赖于部分主键(即必须依赖于全部的主键字段))
第三范式(3NF)
关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖
Likes:即所有的非主键属性都依赖于主键属性,不能依赖于非主键属性,如果依赖则应该拆分表,是被依赖的非主键属性作为此表的外键,新表的主键。
11、fegin负载均衡的策略
- com.netflix.loadbalancer.RandomRule #配置规则 随机,几个提供者间随机访问
- com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询,轮流访问
- com.netflix.loadbalancer.RetryRule #配置规则 重试,在一段时间内通过RoundRobinRule选择服务实例,一段时间内没有选择出服务则线程终止
-com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重,根据平均响应时间来计算权重 - com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
12、mybatis的核心组件
1)SqlSessionFactoryBuilder (构造器):它会根据配置或者代码来生成SqlSessionFactory,才用的时分步构建的Builder模式。(建造者模式)
2)SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是(工厂模式)。
3)SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用Mybatis提供的SQL Mapper接口编程技术,它能提高代码的可读性和可维护性。
4)SQL Mapper(映射器):Mybatis新设计存在的组件,他有一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。
13、mybatis的拦截器以及springMvc的拦截器
mybatis拦截器
Springmvc中拦截器与过滤器的区别:
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现Filter接口对象,拦截器是实现HandleInterceptor
3.过滤器是用来设置request,response参数、属性,侧重对数据的过滤;拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前执行的
5.过滤器是tomcat服务器创建的对象,拦截器是springmvc容器创建的对象
6.过滤器是一个执行时间点;拦截器是三个执行时间点
7.过滤器可以处理jsp、js、html等;拦截器是侧重拦截Controller的对象,如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器的内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应
14、Redis缓存穿透和雪崩
介绍详解
解决方案
15、网络7层模型
1、物理层
建立、维护、断开物理连接(网卡、网线、光纤、集线器、中继器调制解调器等)
2、数据链路层
局域网,MAC地址标识物理设备位置有唯一性(相当于电脑的身份证,每个PC有且只有一个MAC地址)
3、网络层
在不同网络时,路径的选择,IP地址(相当于电脑所在地方的住址,随着地区变化也有变化)
4、传输层(tcp/udp)
TCP/UDP等协议及协议端口号的传输,效验
TCP通常是访问网站等特点是安全、稳定。
UDP是QQ这一类的特点是速度快。
5、会话层 (session,cookie)
建立会话,连接关系,建立连接到断开,会话层的控制
6、表示层
人类语言与计算机语言(二进制)的转换、翻译。
7、应用层 (http, telnet,FTP、Telnet、DNS、SMTP,webSocket是应用层,socket也是应用层且基于http协议)
用户所使用的的操作界面比如访问百度网站
bst@微胖子: 会增加
CSDN-Ada助手: 服务器中的缓存占用的内存大小会随着时间的增加而增加吗?
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加除了各种控件外,文章正文的字数;(2)增加条理清晰的目录;(3)提升标题与正文的相关性。
CSDN-Ada助手: WPF 中如何实现图形编辑?
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)使用更多的站内链接。