前言
主要用于记录面试阶段遇到的面试题
正文
1、SpringBoot相关
相关注解:
-
@SpringBootApplication: 由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan组成
-
@MapperScan: 标志扫描dao的范围
-
@SpringBootConfiguration: 继承自@Configuration,标注当前类为配置类
-
@ComponentScan: 开启组件扫描
-
@EnableAutoConfiguration: 借助@Import的支持,收集和注册相关的bean定义
-
@EnableFeignClients: 表示服务支持Feign远程调用
-
@EnableEurekaClient: 表示要注册到Eureka服务中
-
@Repository: 标注数据访问组件,即Dao组件
-
@Service: 修饰Service层的组件
-
@RestController: 标注控制层组件 @Controller @ResponseBody 表示该方法的返回结果直接写入HTTP Response body中
-
@Bean: 创建一个Bean,并交给spring管理
-
@Autowired: 自动导入配置Bean
2、SpringCloud
-
Eureka 注册中心
eureka: 服务注册中心,对外暴露自己的地址
提供者: 定期向eureka注册自己的信息
消费者: 向eureka订阅服务,eureka会把服务的相关地址列表发送给消费者,并定时更新
心跳: 服务提供者定期向eureka通过HTTP形式刷新自己的状态,每30秒一次
服务下线: 服务正常关闭,服务方发送一个rest请求给EurekaServer,告知自己下线
服务剔除: 定时(默认60s)剔除超过90s没有续约的服务
自我保护机制: 15分钟内超过85%的客户端没有正常的心跳,eureka认为客户端与注册中心出现了网络故障,自动进入保护模式
-
zuul 网关
netflix开源的微服务网关,作用:路由、控制、控流
-
Ribbon 负载均衡
默认采用轮询算法,其他算法:hash、权重、一致性hash
-
Feign 服务调用
解决服务间远程调用问题
-
Hystix 熔断器
解决雪崩效应
雪崩效应: 某一个服务出现问题,导致响应速度变慢,或是根本没有响应返回,会导致它的服务消费者由于长时间的等待,消耗尽线程,进而影响到对其他服务的线程调用,进而会转变为整个应用的故障
3、Spring生态
- Spring: 生态体系
- Spring Framework: Spring框架,基础AOP、IOC
- SpringMVC: 基于Spring框架搭建的web框架
- SpringBoot: 基于Spring框架的一套快速开发整合包
4、AOP和IOC原理
-
IOC:控制反转 / 依赖注入
利用工厂模式,将对象交给容器管理,由spring容器创建,然后注入调用者
-
AOP:面向切面编程
AOP: 动态代理 | 拦截类的元数据(包、类、方法名、参数) | 日志、异常处理
过滤器:函数回调 | 拦截URL | 修改request、URL级别的权限
拦截器:反射机制 | 拦截URL | 权限校验、日志
顺序:过滤器 -> 拦截器 -> AOP
5、线程实现方式和区别
- 继承Thread类
- 实现Runnable接口 无返回值
- 实现Callable接口 有返回值
6、线程池创建方法
-
Executors工厂方法创建
-
new ThreadPoolExecutor()创建
可自定义线程池,参数:
corePoolSize: 核心线程数,线程池中始终存活的线程数
maximumPoolSize: 最大线程数
keepAliveTime: 线程存活时间
unit: 存活时间单位
workQueue: 线程阻塞队列,一共7种,都是安全的
threadFactory: 线程工厂,主要用来创建线程
handler: 拒绝策略
7、线程常用方法
Thread.currentThread(): 获取当前线程对象
getPriority(): 获取当前线程的优先级
setPriority(): 设置当前线程的优先级
isAlive(): 判断线程是否处于活动状态
join(): 调用join方法的线程强制执行,其他线程处于阻塞状态,直至该线程完成
sleep(): 使当前线程休眠指定时间,休眠的线程进入阻塞状态
yield(): 当前线程进入就绪状态,重新去抢占CPU
interrupt(): 中断线程
wait(): 使线程等待,进入阻塞状态;使用于同步方法或同步代码块
notify(): 使线程唤醒,进入就绪状态(获取到同步锁后进入就绪);使用于同步方法或同步代码块
notifyAll(): 唤醒所有等待的线程;使用于同步方法或同步代码块
8、Redis集群高可用
9、RabbitMQ消息丢失
- 重复消费问题: 第三方介质,如redis记录消费之后的消息
- 生产者丢数据: confirm确认机制
- 消息队列丢数据: 消息持久化磁盘
- 消费者丢数据: 自动确认模式/手动确认模式
10、Ctrl层相关注解
-
@RequestParam
参数: 来自于HTTP请求体或请求url 对传入参数指定参数名; 配置前端参数是否必传;
-
@RequestBody
解析请求body中json格式的数据 参数: 来自于RequestBody请求体,故不适用于get
-
@PathVariable
绑定占位符参数
-
@RequestHeader
绑定请求头数据
form-data、x-www-form-urlencoded: 不可以用@RequestBody;可以用@RequestParam
application/json: json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam
11、设计模式
12、集合
| HashMap | HashTable | |
|---|---|---|
| null值 | key/value可以为null | 不能 |
| synchronized | 非,线程不安全 | 是,线程安全 |
| 遍历方式 | fail-fast迭代器 | fail-fast迭代器(JDK8以后) |
| ArrayList | LinkedList | |
|---|---|---|
| 数据结构 | 动态数组 | 双向链表 |
| 随机访问 | 通过对应位置索引,查询速度快 | 需要移动指针,查询速度慢 |
| 增删操作 | 需要改变增删涉及元素的地址,所以增删慢 | 改变插入点或删除点前一个的元素的指向就可以,所以增删快 |
| 内存占用 | 小 | 大 |
Lsit、set和map的区别
a) List (实现了collection接口)
i. 可以允许有重复的对象
ii. 可以插入多个null元素
iii. 是一个有序容器,保持了每个元素的插入顺序
b) Set(实现了collection接口)
i. 不允许重复对象
ii. 无序的容器,无法保证每个元素的储存顺序;而TreeSet可以通过Comparator或Comparable进行顺序排序
iii. 只允许一个null元素
iv. LinkedHashSet按照元素的插入顺序对它们进行存储
c) Map(不是collection的子接口或实现类。Map是一个接口)
i. Map是以键值对的存储方式存放数据,key是唯一的,value可以重复
ii. Map中可以有多个null值,但只能有一个null键
iii. TreeMap也可以通过comparator或者comparable维护排序顺序
13、避免线程死锁
死锁产生条件
- 互斥条件:该资源任意一个时刻只由一个线程占用
- 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:线程已获得的资源不能被其他线程强行剥夺,只有使用完毕才释放资源
- 循环等待条件:若干进程直接形成一种头尾相接的循环等待资源关系 避免方式:
- 破坏互斥条件: 这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
- 破坏请求与保持条件: 一次性申请所有的资源
- 破坏不剥夺条件: 占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源
- 破坏循环等待条件: 靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件
14、配置文件值的引入方式
@ConfigurationProperties
- 与@Bean结合为属性赋值
- 与@PropertySource(只能用于properties文件)结合读取指定文件
- 与@Validation结合,支持JSR303进行配置文件值的校验,如@NotNull@Email等
@Value
- 为单个属性赋值
- 支持属性上的SpEL表达式
| @ConfigurationProperties | @Value | |
|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定 | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |