我的面试
第一次
抽象类应用在哪些方面
平时会怎么去使用他
list和map的区别
不说理论,在什么场景上会使用、或者案例
多线程
java线程start和run的区别
- start() 可以启动一个新线程,run()不能
- start()不能被重复调用,run()可以
- start()中的run代码可以不执行完就继续执行下面的代码,即进行了线程切换。直接调用run方法必须等待其代码全部执行完才能继续执行下面的代码。
- start() 实现了多线程,run()没有实现多线程。
死锁的规避或解决
springboot的启动步骤
Application启动类中的**@SpringBootApplication** 注解和 SpringApplication.run 启动方法
1、创建SpringApplication实例
2、执行run方法
在springboot里加一个方法springboot做了一些什么东西
SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
服务日志快速查询命令
- cat | grep 命令的使用(单个关键字查询日志)
- tail -f 命令的使用(实时显示)
华立科技
总结:(没去了解公司,他侧重点在前端。最后就是没去要微信)
为什么离开上一家公司?(要注意一下,可能有问题)
想寻找更大的发展平台,了解到贵公司在各方面都比较符合我对未来的职业规划,我想加入贵公司,寻求更好的发展。
js闭包
风石健康
yaml和properties
1 | server.port=8081 |
list和json的写法
1 | { |
蜂电科技
重点是项目,不够了解项目,支付功能经常被问啊,
支付后的开票功能,
微信小程序调用支付通道的手续费
1 | 微信小程序只能对接的是微信支付(无法对接支付宝),一般常见的手续费是千分之2~千分之6 |
mqtt协议
微信小程序调用支付宝的支付接口
查询资料发现,大多数的答案是:微信与支付宝属于互相竞争的关系,是两个不同的支付平台,目前是不支持互相通用的。微信小程序里面的程序软件属于内嵌于微信的服务,支持微信支付,但不能使用支付宝支付。也就是说:
①在小程序中生成支付宝二维码的方式,不可行
②在小程序中内嵌H5网页后调用支付宝支付接口,也不可行,由于支付协议
那么我通过诱导的方式直接在浏览器使用支付呢?也就是:
③通过点击某个链接直接跳出小程序自动跳转到系统浏览器的方式,也不可行,原因:
微信小程序没办法直接跳转打开app、网址、手机浏览器,但是可以直接打开其他的小程序并跳转到指定的小程序页面
微信公众号可以直接打开app或app指定页面,可以直接打开手机浏览器并跳转指定网址,可以打开小程序或进入小程序指定页面。
但是,我就是想通过某种方式实现小程序通过支付宝支付呢?(嗯 其实也不是我轴了 公司要求)哪怕是曲里拐弯儿的方式,所以:
④通过诱导的方式在小程序中生成你需要在浏览器中打开使用支付页面的链接地址,诱导用户手动复制网址并手动切换到系统浏览器中使用。我自己的这个链接有公司小程序接口的前提下弄的,比如说http://xxxx.com/xxxx.aspx?参数=xxxx,复制这个链接到浏览器打开是一个信息展示的页面,在这个页面上有一个按钮,通过这个按钮再去请求支付宝支付的接口。类似于如图:)
四方精创
mysql函数截取字符串
创建线程有哪几种方式
1 | 一、继承Thread类创建线程类 |
SQL去重
distinct去重
group by去重
row_number() over (parttion by 分组列 order by 排序列)
SQL数据排序
Mysql内连接和外连接的区别
MySQL中的外连接和内连接
内连接
```
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。1
2
3
4
5
4. **外连接**
5. ```
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。- 左(外)连接 left join
- 左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。
- 右(外)连接 right join
- 右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。
- 左(外)连接 left join
MySQL的基础架构
得淼
是否熟悉表结构的设计
秒杀
特点:时间极短、 瞬间用户量大。
问题:
简单说个解决办法:
限流:
限流这里我觉得应该分为前端限流和后端限流。
前端:一般都是点击一下或者两下然后几秒之后才可以继续点击
后端:产品卖光了,return了一个false,前端直接秒杀结束
阿里的Sentinel
Redis
提前把商品的库存加载到Redis中,让整个流程都在Redis里面去做,然后等秒杀结束了,再异步的去修改库存就好了。
联物
项目是否上线
纯后台就说上线了,已经在使用
HTTP-8种请求类型
GET请求
POST请求
PUT请求
DELETE请求
trace请求
head请求
options
connect
vue标签
9.8线上
JDK和JRE的区别
JDK全称为Java Development Kit,顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包。
JRE全称为Java Runtime Environment,顾名思义是java运行时的环境,包含了java虚拟机,java基础类库,是使用java语言编写的程序运行所需要的软件环境。
bean注解的使用方法
数组有没有length()方法?String有没有length()方法?
数组是没有length()这个方法的,有length这个属性,可以计算数组的长度
String是有length()这个方法的,用来计算字符串的长度。
神州灵云
list的写法
[{name=jim,age=23},{……}]
hashmap底层结构
为什么两个String类型的数据,它们的hashcode()相同,但是==的结果为false
String重写了hashcode()方法,String类型的hash值是根据字符串的内容来决定的,并不是内存地址,只要两个String类型的字符串内容一致,那么两者的hashcode就相同。
数组和集合的区别
一、数组声明了类型,集合不会
二、数组静态,大小不可变。集合可以动态扩展
三、数组存放的类型只能一种,
——————————————————————
ArrayList和LinkedList的区别?
优点 | 缺点 | 适用场景 | |
---|---|---|---|
ArrayList(数组) | 读取数据快 | 数据复杂,删除成本大,需要重新排序 | 不随机访问数据时适用 |
LinkedList(链表) | 插入,添加,删除效率高,因为不需要更新索引 | 内存需求大 | 更多插入和删除,更少读取数据 |
重写和重载的区别?
概念
重写通常来说就是覆盖,重新对虚函数度重新编写
重载指的是不用的函数用相同的函数名,参数,个数,类型不同
类的属关系上来看
重写:垂直关系,只发生在父类与子类之间的关系
重载:平面关系,在同一个类之间的关系
int和Integer的区别
int是普通类型 Integer是封装类
int初始值是0 Integer初始值是null
int直接存储数据 Integer需要实例化对象,指向对象地址
String,StringBuffer,StringBuilder区别?
项 | String | StringBuffer | StringBuilder |
---|---|---|---|
可变性 | 不可变。原因:value数组是final类型。因为不可变,所以每次操作生成新对象。 | 可变。原因:其父类(AbstractStringBuilder)的value数组不是final类型 | 可变。原因:其父类(AbstractStringBuilder)的value数组不是final类型 |
线程安全性 | 线程安全。原因:value数组是final类型 | 原因:其父类(AbstractStringBuilder)的value数组不是final类型线程安全。原因:方法都用了synchronized | 线程不安全 |
static的5种用法
- 修饰成员属性
- 修饰成员方法
- 修饰代码块
- 修饰内部类
- 静态导包
JDK1.8 新特性
- Lambda表达式
- 函数式接口
- *方法引用和构造器调用
- Stream API
- 接口中的默认方法和静态方法
- 新时间日期API
HashMap、TreeMap、LinkedHashMap之间的区别?
相同点
- 都属于Map;
- Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
- 都是线程不安全的
HashMap | TreeMap | LinkedHashMap | |
---|---|---|---|
按插入顺序存放 | 不支持 | 不支持。 | 支持。遍历时,按插入的顺序出结果。 |
按key排序 | 不支持。按照hashCode进行输出。 | 支持。默认按key升序排序。可用Comparator自定义排序。用Iterator 遍历TreeMap时,结果是排过序的。 | 不支持。 |
数据结构 | 数组 + 链表 + 红黑树(put和get操作,基本可以达到常数时间的性能) | 红黑树。(get或put操作的时间复杂度是O(log(n))) | HashMap + 双向链表此类是HashMap的子类。 |
null | 只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。 | 不允许key的值为null | key和value均允许为null |
HashMap和Hashtable的区别(绝对经典)
相同点
都实现了map,Cloneable(可克隆),Serializable(可序列化)三个接口
不同点
- 底层数据结构不同,jdk1.7都是数组加链表,1.8HashMap加入了红黑树
- Hashtable不允许键值为空,HashMap允许一条
- 实现方式不同:Hashtable 继承的是 Dictionary类,而 HashMap 继承的是 AbstractMap 类。
单例模式有八种方式:
- 饿汉式(静态常量)
- 饿汉式(静态代码块)
- 懒汉式(线程不安全)
- 懒汉式(线程安全,同步方法)
- 懒汉式(线程安全,同步代码块)
- 双重检查
- 静态内部类
- 枚举
什么是值传递?什么是引用传递?
值传递:传变量的值,不会改变方法外变量的值
引用传递:传的对象地址,会改变对象本身的值
java性能优化
- 尽量指定类、方法的final修饰符
- 代码尽量重用
- 及时关闭流
- 尽量使用局部变量
- 减少对变量的重复计算
- 不要再循环中使用try
- 尽量采用懒加载的策略
java反射
作用:增加代码灵活性,避免程序死在代码里
优点:
- 提高了代码的灵活性和扩展性
- 代码简洁,提高代码的复用性,外部调用方便
缺点:性能问题、使用反射会模糊程序内部逻辑,安全限制,内部暴露
线程池的原理
提交任务,线程池会根据corePoolSize大小创建若干数量线程执行任务
超过corePoolSize数量,后续任务阻塞队列,阻塞排队
阻塞队列也满了之后,创建额外线程,执行任务,超过额外时间,销毁额外线程
线程池满了,拒绝策略
线程七大核心参数
corePoolSize:线程池中常驻核心线程数
maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于1
keepAliveTime:多余空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到剩下corePoolSize为止。
unit:keepAliveTime的单位
workQueue:里面放了被提交但是尚未执行的任务
threadFactory:表示线程池中工作线程的线程工厂,用于创建线程
handler:拒绝策略,当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时,对任务的拒绝方式。
原文链接:https://blog.csdn.net/qq_50652600/article/details/121212661
tomcat7和tomcat8的区别
配置文件:tomcat8更贴心,给出明确的启动提示输出
请求的响应状态值:8——success,7——ok
性能方面:
tomcat8的吞吐量和响应时间均优于tomcat7
MySQL
设计数据库的三大范式?
通俗解释
- 字段不可分
- 非主键字段依赖主键
- 非主键字段不能相互依赖
truncate和drop以及delete的区别
truncate:删除表内容,不删除表结构,释放空间
drop:删除数据库
delete:删除表内容,不删除表结构,不释放空间
数据库优化经验
从jdbc来说用PreparedStatement 一般来说比Statement性能高
外键会影响插入和删除的性能
表中允许适当的冗余,适度非凡三大范式,来获得更好的性能
sql语句全部大写,增强数据库编译效率
索引会增强查询性能
选择有效率的表名顺序
SELECT避免使用*
什么是事务?事务特性?有哪些隔离级别?
事务(transaction):是数据库操作的最小工作单位,是单个逻辑工作单元执行的一系列操作
属性(ACID):
- 一致性,事务中的诸多操作,要么都做,要么都不做
- 原子性,使数据库从一个一致性状态到另一个一致性状态
- 隔离性,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
- 持久性,这个事务一旦提交,数据库中数据的改变应该是永久性的
隔离级别分为:Read Uncommitted(读未提交)、Read Committed(读提交)、Repeatable Read(可以重复读)、Serializable(序列化)这4种级别
索引的好处?
索引是数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中特定的数据
大大提高了系统性能
- 加快了检索速度
- 通过创建唯一索引,保证数据库每一行数据的唯一性
- 加速表连接
- 减少分组排序时间
内外连接的区别
内:两个表的交集
外:两个表的交集+主表中不符合连接条件只符合查询条件的数据行
什么是存储过程?
存储过程是为了完成特定功能的SQL语句集合,存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
mvcc是什么?
它是MySQL中的提高性能的一种方式,配合Undo log 和版本链,替代锁,让不同事物的读-写、写-读操作可以并发的执行,从而提升系统的性能。
MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能。一般是在使用读已提交(PEAD COMMITTED)和可重复读(REPEATABLE READ)隔离级别的事务中实现。
MVCC的优点:
1 | MVCC在MySQL InnoDB中的实现主要是为了提高数据库的并发性能,用更好的方式去处理读-写或写-读之间的冲突,也能做到不加锁,非阻塞并发读,提高了数据库并发读写的性能。 |
Mybatis
Mybatis和Mybatis plus区别
mybatis:
- sql全部自己写
- 手动解析实体关系映射转换为mybatis内部对象注入容器
- 不支持lambda形式调用
mybatis plus:
- 有强大的条件构造器
- 内置Mapper,通用的Service,少量配置即可实现大量的curd操作
- 支持lambda形式调用
- 自动解析实体关系映射转换为mybatis内部对象注入容器
mybatis的作用
- 简化curd
- 乐观锁
- 逻辑删除
- 代码生成
- 高级查询
- 数据填充
动态SQL标签
- if
- where
- foreach
- set
- when
mybatis的一级缓存和二级缓存
一级缓存作用域是sqlsession级别的,执行sql查询,第一次查询数据在数据库并写到缓存中,第二次在一级缓存中取
清空:一般在缓存时执行commit操作一级缓存就会清空,避免脏读
二级缓存他指的是mybatis中SqlSessionFactory对象缓存
mybatis如何返回增加时的主键?
1 | useGeneratedKeys=“true” keyProperty=“对应的主键的对象” |
#{}和${}的区别
#{}是预编译语句,特点:会主动给String加上单引号,可以很大程度的防止SQL注入
${}只是单纯的拼接,解析后是什么就是什么,特点:有很大的SQL注入隐患,在order by时可以使用
分页插件的基本原理:
使用Mybatis提供的插件接口,实现自定义插件
在插件的拦截方法内拦截待执行的SQL,然后重写SQL limit
根据方言,添加对应的物理分页语句和物理分页参数
mybatis 四大核心接口对象
- 执行器Executor,执行器负责整个SQL执行过程的总体控制。
- 语句处理器StatementHandler,语句处理器负责和JDBC层具体交互,包括prepare语句,执行语句,以及调用ParameterHandler.parameterize()设置参数。
- 参数处理器ParameterHandler,参数处理器负责PreparedStatement入参的具体设置。
- 结果集处理器ResultSetHandler,结果处理器负责将JDBC查询结果映射到java对象。
Spring
概念:
Spring:
是一个开源框架,可以接管web层,dao层,业务层,持久层的组件,并且可以配置bean,和维护bean与bean之间的关系。核心是IOC(控制反转),AOP(面向切面),是一个分层的轻量级开源框架。
SpringMVC:
SpringMvc是一种web层框架,主要用于代替servlet
SpringBoot:
是spring的拓展,同时延续了spring的和核心ioc,aop,简化了应用的开发和部署。SpringBoot就是为了简化Spring应用的的创建、运行、调试、和部署而出现的。boot提供了很多依赖包,让我们可以做到专注spring的开发,而无需过多关注xml文件
SpringBoot常见启动器:
web、thymeleaf、shiro、security、shiro&thymeleaf、mybatis
XXL-JOB是什么
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
SpringCloud:
业界没有统一的定义标准,核心是一站式应用,根据业务区分成一个一个服务,实现彻底耦合,每个服务做每个服务的事情,能够单独启动或销毁,拥有自己独立的数据库
Spring的核心?
spring是一个开源框架,是一个生态,同时是整个生态中的基石
mvc、boot、cloud…都是以spring为基石来进行开发的,或者说都是在spring上做的延申或者拓展
自觉维护对象的创建,对象的销毁,交给容器管理我们只需做好配置就可以了
ioc、aop
IOC:控制反转(就是把new对象的权利交给容器,所有的对象都被容器控制,这就叫所谓的控制反转。)
AOP:面向切面编程(做一些与业务无关的公共功能的时候,通过aop的方式将关键的核心代码切入到业务逻辑里面去,而不需要去改每一行代码)
spring中bean的生命周期
实例化,bean属性填充,初始化bean,销毁bean
bean的作用域
session、request、application、singleton、prototype
Spring的自动装配
xml中的5种自动装配:
模式 描述 no 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。 byName byType 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。 constructor 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。 autodetect Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 基于注解的自动装配
- @Autowired:按照类型装配注入的,它要求依赖对象必须存在
- @Resource:按照名称来装配注入的,找不到与名称匹配的bean才会按照类型来配置注入
Spring事务什么时候失效
- 数据库不支持事务
- 事务方法未被Spring管理
- 方法没被public修饰
- 同一类中方法调用
- 未配置事务管理器
- 方法的事务传播类型不支持事务
- 不正确的捕获异常
- 错误的标注异常类型
SpringMVC
SpringMVC 八大注解
- @Controller
- @RequestMapping——映射请求,也就是通过它来指定控制器可以处理哪些URL请求
- @Resource和@Autowired——自动装配
- @ModelAttribute和 @SessionAttributes
- ModelAttribute:优先执行,可以做初始化操作
- SessionAttributes:应用在Controller上面,可以将Model中的属性同步到session当中。
- @PathVariable——接收请求路径中占位符的值
- @requestParam
- 不加@RequestParam注解:url可以带参数也可以不带。
- 加@RequestParam注解:url必须带参数,
容器创建bean实例的方法
- 反射调用构造方法
- 静态工厂方法
- 实例工厂方法
- FactoryBean
Collection和Collections的区别
Collection是一个接口
Collections是一个集合类,容器的工具类,就如同Array是数组的工具类
springmvc九大内置组件
可以看出,初始化策略是其他九个初始化方法的概括,而其他九个初始化方法就是我们今天要介绍的九大组件,主角登场:
1、MultipartResolver(文件处理器),对应的初始化方法是initMultipartResolver(context),用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File。
2、LocaleResolver(当前环境处理器),对应的初始化方法是initLocaleResolver(context),这就相当于配置数据库的方言一样,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。
3、ThemeResolver(主题处理器),对应的初始化方法是initThemeResolver(context),用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源,如图片、css样式等。SpringMVC的主题也支持国际化。
4、HandlerMappings(处理器映射器),对应的初始化方法是initHandlerMappings(context),这就是根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理呢
5、HandlerAdapters(处理器适配器),对应的初始化方法是initHandlerAdapters(context),从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapters要做的事情。
6、HandlerExceptionResolvers(异常处理器),对应的初始化方法是initHandlerExceptionResolvers(context),其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?这就要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。
7、RequestToViewNameTranslator(视图名称翻译器),对应的初始化方法是initRequestToViewNameTranslator(context),有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。
8、ViewResolvers(页面渲染处理器),对应的初始化方法是initViewResolvers(context),ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。
9、FlashMapManager(参数传递管理器),对应的初始化方法是initFlashMapManager(context),用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。
第一次面试
1.常用HTTP常见的状态码?就讲出两个
「200 OK」是最常见的成功状态码
「204 No Content」也是常见的成功状态码,但响应头没有 body 数据。
「301 Moved Permanently」永久性重定向。
「302 Found」临时性重定向。
「304 Not Modified」该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
「400 Bad Request」该状态码表示请求报文中存在语法错误。
「401 Unauthorized」该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。
「403 Forbidden」该状态码表明对请求资源的访问被服务器拒绝了,并不是客户端的请求出错。
「404 Not Found」 该状态码表明服务器上无法找到请求的资源。
「500 Internal Server Error」该状态码表明服务器端在执行请求时发生了错误。
「503 Service Unavailable」该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
2.Java支持多继承吗?如果想要实现怎么处理?
不支持多继承,可以通过接口实现处理
3.构造器是否可以被重写或者重载
构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。
又由于构造器不能继承,所以就不能被重写。但是,在同一个类中,构造器是可以被重载的。
4.Java集合类框架的基本接口有哪些?
- 集合类
- Collection
- List
- ArrayList
- LinkedList
- Vector——Stack
- Set
- HashSet
- TreeSet
- LinkedHashSet
- Queue
- List
- Map
- HashMap
- TreeMap
- Hashtable
- Collection
5.说一下springmvc的请求流程
1、DispatcherServlet 接收到客户端发送的请求。
2、DispatcherServlet 收到请求调用HandlerMapping 处理器映射器。
3、HandleMapping 根据请求URL 找到对应的handler 以及处理器 拦截器,返回给DispatcherServlet
4、DispatcherServlet 根据handler 调用HanderAdapter 处理器适配器。
5、HandlerAdapter 根据handler 执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView
6、HandlerAdapter 返回ModeAndView 给DispatcherServlet
7、DispatcherServlet 调用 ViewResolver 视图解析器来 来解析ModeAndView
8、ViewResolve 解析ModeAndView 并返回真正的view 给DispatcherServlet
9、DispatcherServlet 将得到的视图进行渲染,填充到request域中
10、返回给客户端响应结果。
前端发请求,前端控制器接受请求,处理请求,请求到映射器,寻找映射对象,然后返回控制器,寻找适配器,适配结束,就会映射到controller里面,后端控制返回到ModeAndView,视图进行渲染,最后返回给客户端响应结果,就展现给用户看。
6.yaml和properties的区别
编写方式不同
properties优先级更高
7.springboot的核心注解,里面的子注解是哪些?
一、核心注解
@SpringBootApplication:主要作用是标记说明这个类是主配置类
@SpringBootConfiguration:表明配置类,而配置类也是spring容器中的组件
组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration
打开自动配置的功能,也可以关闭某个自动配置的选项。
如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class });
@AutoConfigurationPackage
- 将主配置类所在的包以及子包里面所有的组件扫描并加载到spring容器中
@Import(AutoConfigurationImportSelector.class)
- 这个注解就是将需要自动装配的类以全类名的方式返回
@ComponentScan
Spring组件扫描功能,让spring Boot扫描当前以及子包的注解并把它加入到程序上下文。
自动装配
springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理
- 创建SpringApplication对象,初始化参数,判断当前应用程序的类型以及设置初始化器以及监听器,加载spring.factories文件,将内容放入缓存
- 执行run方法,启动过程有两个方法:
- prepareContext():完成的是对上下文对象的初始化操作
- refreshContext():会进行整个容器的刷新过程
- 在解析@Import注解的时候,会有一个getImport()方法,从主类开始递归解析注解,把所有包含@Import的注解都解析到,然后在processImport()方法中对import的类进行分类
启动流程
- 会构造一个SpringApplication的实例,构造SpringApplication的时候会进行初始化的工作
- 调用run方法,启动SpringApplication
8.springcloudalibaba中有哪些常见的组件
组件 | 作用 |
---|---|
nacos | 注册中心(服务注册与发现)、配置中心(动态配置管理) |
Ribbon | 负载均衡 |
Feign | 声明式Http客户端(调用远程服务) |
Sentinel | 服务容错(限流、降级、熔断) |
Gateway | API网关(webflux编程模式) |
Sleuth | 调用链监控 |
Seata | 原Fescar,即分布式事务解决方案 |
服务雪崩
服务雪崩:在整条链路的服务中,一个服务失败,导致整条链路的服务都失败的情形。
服务限流
监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。
实现方式:
- 限流实现方式一: 抛出异常的方式定义资源
- 限流实现方式二: 注解方式定义资源
- @SentinelResource
服务熔断
下游的服务变得不可用或响应过慢,为了保证可用性,不再继续调用,直接返回
服务降级
下游的服务变得不可用或响应过慢,下游服务主动停掉一些不太重要的服务,释放服务器资源
RabbitMQ消息确认机制(ACK)
1、消息确认机制(ACK)
保证消息从队列可靠的送达到消费者,MQ 提供了消息确认机制,消费者在订阅队列时,可以指定 autoAck 参数,当 autoAck 参数等于 true 时,RabbitMQ 会自动把发送出去的消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到了这些消息。
录 音:
速强 匡涛
模块传参包括哪些?
单点登录
认证中心,登陆的话判断用户A有没有携带通行证, 通行证就是Cookie,Session不能依据HTTP连接来判断是否为同一个用户。其实Session是依据Cookie来识别是否是同一个用户。
总结一下上面的思路:
- 用户登录时,验证用户的账户和密码
- 生成一个Token保存在数据库中,将Token写到Cookie中
- 将用户数据保存在Session中
- 请求时都会带上Cookie,检查有没有登录,如果已经登录则放行
简单介绍es的sql服务
springboot自动装配机制
自动装配就是自动地把其他组件中的Bean装载到IOC容器中,不需要开发人员再去配置文件中添加大量的配置,
添加SptingBootApplication注解,可以开启自动装配
原理:
https://www.cnblogs.com/15078480385zyc/p/16154533.html
mvc工作流程
依赖注入有哪些注入方式
依赖注入有三种方式:
1:接口注入:指的就是在接口中定义要注入的信息,并通过接口完成注入。
2:set注入:指的就是在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素。
3:构造注入:指的就是接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。
接口和抽象类有哪些区别
抽象类是可以继承的,抽象类里面的方法不一定要全部实现
单例模式
重载重写
简单介绍一下单例模式
单例模式是指在内存中有且只会创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同的时候,为了防止频繁的创建对象,单例模式可以让程序在内存中创建一个对象,让所有的调用者都共享这一单例对象。单例模式的类型有两种:懒汉式和饿汉式。
- 饿汉式:在类加载的时候已经创建好该单例对象。
- 懒汉式:在需要使用对象的时候才会去创建对象
持续集成—Jenkins
erk环境
魔介商务
string可以被继承嘛?
不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。
list和set的区别
- List、Set都继承自Collection接口;List的特点:元素有放入顺序,且可重复;Set的特点:元素无放入顺序,且不可重复(注意:元素虽然无放入顺序,但是元素在Set中的位置是由该元素的HashCode决定的,其位置是固定的)。List支持for循环,也就是通过下标来遍历,也可以用迭代器,但是Set只能用迭代器,因为他无序,无法使用下标取值;
- List接口有三个实现类:LinkedList,ArrayList,Vector。Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
- Set:检索元素效率低,删除和插入效率高,插入和删除不会引起元素位置改变。List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
springmvc的实现流程
前端发请求,前端控制器接受请求,处理请求,请求到映射器,寻找映射对象,然后返回控制器,寻找适配器,适配结束,就会映射到controller里面,后端控制返回到ModeAndView,视图进行渲染,最后返回给客户端响应结果,就展现给用户看。
redis的数据类型
策贸:
ioc aop
ioc,我把对象交给你了,你帮我去控制,创建
https://blog.csdn.net/davidiao/article/details/106486915/
AOP的作用
日志记录、性能统计、安全控制、事务处理、异常处理
aop做切面时,获取目标方法中的参数
Spring中所使用的设计模式
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
数组去重的三种方法
一、原生JS去重
数组去重思路:
1、建立新数组
2、遍历旧数组
3、往新数组中放置旧数组的元素
4、遍历新数组
5、判断如果新数组中有相同的元素,就不往新数组中放了
三、利用set结构成员值唯一的特点
1 | var arr = [100, 20, 30, 50, 30, 100, 20, 50];//[100,20,30,50] |
数据库的几种去重方法总结
用group by方法配合Having
1 | (1)、查数据 |
数据库的几种去重方法总结_Mr.姚先森的博客-CSDN博客_数据库去重
jdbc连接数据库流程
1.注册驱动:
Class.forName("com.mysql.jdbc.Driver");
显示的加载到JVM中
2.获取连接:
3.创建一个Statement语句对象
4.执行SQL语句:
5.处理结果集:
6.关闭资源:
java的数据结构
arraylist超过初始大小,数据是怎么存储的
linux基础命令
面试:
什么是死性队列?
处理死性的队列叫死性队列
死性:我们这个消息发出去了,但是一直没被消费
应用场景:订单超时
什么是延迟队列?
进入该队列的消息会被延迟消费的队列。
应用场景:延迟消费——过一段时间校验订单的支付状态,未支付则关闭订单
每五分钟执行一次的表达式怎么写?
cron:每五分钟执行 */5 * * * *
dockerfile常见命令
- FROM:声明镜像
- MAINTAINER:作者信息+
- **RUN:**运行指定的命令
- **CMD:**执行脚本
- EXPOSE(expose):设置暴露端口号
- ENV:设置环境变量
- ADD:复制命令
- COPY:复制命令,部分只能是本地文件
- VLOUME:设置你的卷
- WORKDIR:指定容器的工作目录
路由传参的三种方式
path加params的方式
name加query的方式
没解决
集合框架
扩容
线程
线程池的分类
七个
redis
mq
笔试
1,有哪些数据库优化方面的经验?
2,请简述常用的索引有哪些种类?
3,HAVNG 子句 和 WHERE的异同点?
4,如何在Unix和Mysql时间戳之间进行转换?
5,Tomcat有几种部署方式?
6,redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?
7,Redis如何实现延时队列?
8,Spring Boot中的监视器是什么?
9,如何使用Spring Boot实现异常处理?
10,SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
11,SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
12,如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
13,怎么样把ModelMap里面的数据放入Session里面?
14,什么是控制反转(IOC)?什么是依赖注入?
15,请解释下Spring框架中的IoC?
16,简述 AOP 和 IOC 概念
17,在 Spring 中如何配置Bean ?
18,IOC 容器对 Bean 的生命周期?
19,开发中主要使用 Spring 的什么技术 ?
20,怎么监视Tomcat的内存使用情况?