后端大厂面试总结大全一

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)

关系模式RUF)中的所有非主属性对任何候选关键字都不存在传递依赖

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协议)
用户所使用的的操作界面比如访问百度网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bst@微胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值