主题
面试问题总结
1.你对 Spring MVC 的理解?
SpringMVC 我觉得他是对 Servelt 的封装,屏蔽掉了 Servlet 很多细节。Servlet 获取参数需要不断地 getParameter。现在只要在 SpringMVC 方法定义对应的 JavaBean,只要属性名与参数名一致,SpringMVC 就可以帮我们实现将参数封装到 JavaBean 上了。
还有,之前使用 Servlet 上传文件,需要处理各种细节,写一大堆处理的逻辑(还得导入对应的 jar)。现在一个在 SpringMVC 的方法上定义出 MultipartFile 接口,又可以封闭掉上传文件的细节了。
2.既然你说 SpringMVC 是对 Servlet 的封装,你了解 SpringMVC 请求的处理流程嘛?
1) 首先有个统一处理请求的的入口
2)随后更具请求路径找到对应的映射器
3)找到处理请求的适配器
4)拦截器前置处理
5)真实处理请求(也就是真正的代码)
6)试图解析器处理
7)拦截处理后置
3.SpringCloudAlibaba 与 SpringCloud 在使用上有什么区别?
伴随着在 2018-12-12 号 Netflix 宣布停止开发 Spring Cloud 的相关服务:Ribbon、Feign、Eureka、Hystrix。因此阿里对外开源了一套用于管理 springboot 的微服务云框架 Spring Cloud Alibaba。其采用阿里中间件作为基础,实现了 Spring Cloud 的微服务规范。
内部也有很多的组件,如通过 Nacos 替换 Eureka,通过 Nacos 替换 Spring Cloud Config,通过 Sentinel 替换 Hystrix。将 Dubbo 将会作为 Spring Cloud Alibaba 的 RPC 组件,并与 Spring Cloud 原生的 Feign 以及 RestTemplate 进行无缝整合。
但是由于 Spring Cloud Alibaba 还没有纳入到 Spring Cloud 的主版本管理中,所以在使用的时候,还需要额外去引入它的依赖信息。
4.SpringCloudAlibaba 包括哪些常用组件?
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品一个易使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
5.SpringCloud 包括哪些常用组件?
**Eureka: **注册中心, 服务注册和发现
**Ribbon: **负载均衡, 实现服务调用的负载均衡
**Hystrix: **熔断器
**Feign: **远程调用
**Zuul: 网关 **
**Spring Cloud Config: **配置中心
6.SpringCloud 比 Spring 好在哪里?
SpringCloud 源于 Spring,所以它的质量,稳定性,持续性都是可以保证的
SpringCloiud 天热支持 SpringBoot 框架,就可以提高开发效率,能够实现需求。
SpringCloud 更新很快,后期支持很给力。
SpringCloud 可以用来开发微服务。
7.SpringCloud 和 Springboot 的关系?
SpringBoot 是为了解决 Spring 配置文件冗余问题, 简化开发的框架.
SpringCloud 是为了解决微服务之间的协调和配置问题, 还有服务之间的通信, 熔断,负载均衡远程调度任务框架
SpringCloud 需要依赖 SpringBoot 搭建微服务, SpringBoot 使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,
SpringCloud 很大的一部分是基于 SpringBoot 来实现。
SpringBoot 不需要依赖 SpringCloud 就可以独立开发. SpringBoot 也可以集成 Dubbo 进行开发.
8.JVM
Java 虚拟机栈: 线程私有的 (每个线程都有一个自己的 Java 虚拟机栈). 一个方法运行, 就会给这个方 法创 建一个栈帧, 栈帧入栈执行代码, 执行完毕之后出栈 (弹栈) 存引用变量,基本数据类型
本地方法栈:线程私有的 (每个线程都有一个自己的本地方法栈), 和 Java 虚拟机栈类似, Java 虚拟机栈 加载的是普通方法,本地方法加载的是 修饰的方法. native: 在 java 中有用 native 修饰的,表示这个方法不是 java 原生的.
堆: 线程共享的 (所有的线程共享一份). 存放对象的,new 的对象都存储在这个区域.还有就是 常量池.
元空间:存储.class 信息, 类的信息,方法的定义,静态变量等.而常量池放到堆里存储 JDK1.8 和 JDK1.7 的 jvm 内存最大的区别是, 在 1.8 中方法区是由元空间 (元数据区) 来实 现的, 常量池. 1.8 不存在方法区,将方法区的实现给去掉了.而是在本地内存中,新加入元数据区 (元空间).
9.sql 聚合函数有哪些?
COUNT:统计行数量 分页关键词 limit
SUM:获取单个列的合计值 分组关键词 group by
AVG:计算某个列的平均值
MAX:计算列的最大值 去重 distinct
MIN:计算列的最小值 select DISTINCT NAME FROM student3
10.MySql 优化
1.优化索引
索引的设计需要遵循一些已有的原则, 这样便于提升索引的使用效率, 更高效的使用索引.
对查询频次较高, 且数据量比较大的表, 建立索引.
索引字段的选择, 最佳候选列应当从 where 子句的条件中提取, 如果 where 子句中 的组合 比较多, 那么应当挑选最常用, 过滤效果最好的列的组合.
使用唯一索引, 区分度越高, 使用索引的效率越高.
索引并非越多越好, 如果该表赠,删,改操作较多, 慎重选择建立索引, 过多索引会降 低表维 护效率.
使用短索引, 提高索引访问时的 I/O 效率, 因此也相应提升了 Mysql 查询效率.
如果 where 后有多个条件经常被用到, 建议建立符合 索引, 复合索引需要遵循最左前缀法 则, N 个列组合而成的复合索引, 相当于创建了 N 个索引.
复合索引命名规则 index_ 表名 _ 列名 1_ 列名 2_ 列明 3
比如:create index idx_seller_name_sta_addr on tb_seller(name, status, address)
2.避免索引失效
如果在查询的时候, 使用了复合索引, 要遵循最左前缀法则, 也就是查询从索引的最 左列开 始, 并且不能跳过索引中的列.
尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而 进行全表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行 全表扫描。
不做列运算 where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函 数.计算表达式等, 都会是索引失效.
查询 like,如果是 ‘%aaa’ 也会造成索引失效.
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字 段没有 索引,将导致引擎放弃使用索引而进行全表扫描
3.Sql 语句调优
根据业务场景建立复合索引只查询业务需要的字段,如果这些字段被索引覆盖, 将极 大的提高查询效率.
多表连接的字段上需要建立索引,这样可以极大提高表连接的效率.- 44 -
where 条件字段上需要建立索引, 但 Where 条件上不要使用运算函数,以免索引失效.
排序字段上, 因为排序效率低, 添加索引能提高查询效率.
优化 insert 语句: 批量列插入数据要比单个列插入数据效率高.
优化 order by 语句: 在使用 order by 语句时, 不要使用 select *, select 后面要查有 索引的列, 如果一条 sql 语句中对多个列进行排序, 在业务允许情况下, 尽量同时用升 序或同时用降序.
优化 group by 语句: 在我们对某一个字段进行分组的时候, Mysql 默认就进行了 排序, 但是排序并不是我们业务所需的, 额外的排序会降低效率. 所以在用的时候可以禁止 排序, 使用 order by null 禁用. select age, count(*) from emp group by age order by null
尽量避免子查询, 可以将子查询优化为 join 多表连接查询.
11.SpringBoot 的优点
SpringBoot 对上述 Spring 的缺点进行的改善和优化,基于约定优于配置的思想,可 以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的 代码 编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
版本锁定: 解决是 maven 依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本
起步依赖:解决了完成某一个功能要整合的 jar 包过多的问题,集合了常用的 jar 包自动配置: 解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置
内置 Tomcat:通过内置的 tomcat,无需再用其他外置的 Tomcat 就直接可以运行 javaEE 程序
总之:人们把 Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建 庞大的 spring 项目,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们 关注与业务而非配置
在什么业务上用到(分布式)xxljob 任务调度?如何实现的
redis 的数据能存在 mongdb 吗?为什么
mongdb 的数据能存在 redis 吗?为什么
12.如何让获取 map 中全部 key 值,全部 value 值,以及同时获取全部 key 和 value 值
1.获取 map 中打的全部健值 (keySet 方法),输出 lambda 表达式
2.获取 map 中的全部 value 值(values)方法,输出采用 forearch
3.同时获取 key 值和 value 值 (entrySet 方法) 。输出采用了两种方式,iterator 迭代器或 foreach 循环,lambda 表达式形式
13.rabbitMQ 在模块中做了什么(自动审核处理)
14.Spring 常用注解
1. @Component(任何层) @Controller @Service @Repository (dao) : 用于实例化对象
2. @Scope : 设置 Spring 对象的作用域
3. @PostConstruct @PreDestroy : 用于设置 Spring 创建对象在对象创建之后和销毁之前 要执行的方法
4. @Value: 简单属性的依赖注入
5. @Autowired: 对象属性的依赖注入
6. @Qualifier: 要和@Autowired 联合使用,代表在按照类型匹配的基础上,再按照 名称匹配。
7. @Resource 按照属性名称依赖注入
8. @ComponentScan: 组件扫描
9. @Bean: 表在方法上,用于将方法的返回值对象放入容器
10. @PropertySource: 用于引入其它的 properties 配置文件
11. @Import: 在一个配置类中导入其它配置类的内容
12. @Configuration: 被此注解标注的类,会被 Spring 认为是配置类。 Spring 在启动的时候会自动扫描并加载所有配置类,然后将配置 类中 bean 放入容器
15.Mysql
1.行锁和表锁
1.主要是针对锁粒度划分的,一般分为:行锁、表锁、库锁
行锁:访问数据库的时候,锁定整个行数据,防止并发错误。
表锁:访问数据库的时候,锁定整个表数据,防止并发错误。
2.行锁 和 表锁 的区别:
表锁:开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最
低
行锁:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高