1.SpringBoot框架,项目启动流程是什么?、
主要做两件事,第一步实例SpringApplication对象,第二步调用他的run方法,在new SpringApplication主要做的是 判断项目的类型、设置初始化器和监听器、判断应用入口类。在调用run方法期间主要是 获取SpringApplicationRunListeners、准备配置环境ConfigurableEnvironment
、创建ApplicationContext应用上下文、ApplicationContext的前置处理以及刷新和后置处理。
1.2 SpringBoot框架,如何实现自动装配?
什么是自动装配,可以简单理解为:通过注解或者一些简单的配置就能在SpringBoot的帮助下实现某块功能。SpringBoot通过@EnableAutoConfiguration
开启自动装配,通过SpringFactoriesLoader 最终加载META-INF/spring.factories
中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional
按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx
包实现起步依赖
2.Spring框架bean对象的声明周期?
bean的生命周期大致分为,初始化、使用和销毁这三块。初始阶段先加载bean,spring框架要想实例化bean,要扫描一下知道哪些bean需要被加载,然后进入后处理bean--将加载到的bean交给BFPP(BeanFactoryPostProcessor),BFPP会梳理bean之间的关系,如:Bean A实例的时候需要依赖Bean B 但Bean B 又要依赖C 那么C就得先需要实例。根据BFPP梳理出来的关系进行一系列的实例化,其实这里呢,对象的创建和构造方法的调用其实是两步,创建对象在内存里真正的示意图是,现在内存中开辟出空间,对象创建出来,这时对象已经实例化好了,但是这时还没调用构造方法,接下来调用构造方法 ,构造方法的意义是进行初始化,紧接着进行字段注入和setter注入(这几个注入也叫依赖注入),这时初始化还没完成,如果还想进行一些人为初始化,这时调用初始化器,spring提供了一个生命周期中的注解@PostConstruct(setter注入之后执行初始化),作用在方法上,若还想在这个注解作用的方法前或方法后再进行人为初始化,那么就要交给BPP(BeanPostProcessor) 其实它是一个接口,重写其中的方法返回一个bean对象即可,初始化好之后就可以使用了。
2. 使用 不论是通过context获取bean对象还是通过注入的方式来获取bean对象,若在初始化过程中使用了Bpp,则得到bean对象为代理对象(对原对象进行了加工,之后执行的都是加工后的代码,新对象就叫做代理对象) 产生代理对象需要使用代理机制,Spring中Bean对象的创建会使用动态代理机制: -JDK动态代理:使用JDK提供的api方法来生成代理对象的,要求目标对象一定实现了接口 -CGLIB动态代理:使用CGLib提供的api方法来生成代理对象的,要求目标对象没有实现接口 动态:在运行期执行的操作,叫做动态,而在运行期执行操作是通过反射来完成的
3. 销毁 在context对象关闭之前会销毁所有的bean对象,但是会先调用添加了@PreDestory注解的方法,然后才销毁bean实例
3.Spring框架中ioc的理解,和底层实现原理?
IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。
底层实现原理:spring ioc容器原理是根据Java的反射机制,获取类的所有信息,再通过xml或者注解配置获取类与类之间的关系,最后根据以上信息构建类与类之间的依赖。
4.Spring框架中DI的注入方式有几种?分别是什么?
DI依赖注入,三种方式:字段注入、setter注入、构造方法注入,其中setter注入用的最少,推荐使用构造方法注入。
5.Spring框架中AOP的实现原理,JDK代理和CGLIB代理有什么区别?
SpringAOP(运行时增强)的实现是基于JDK动态代理,AspectJAOP(编译时增强)的实现是基于静态代理。
Spring全家桶面试题(2021优化版) (qq.com)
6.Spring框架bean对象的循环依赖注入问题如何解决?
循环依赖就是循环引用的意思,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。
1.field属性注入引发的依赖问题的解决:
2.怎么解决构造器注入引发的循环依赖:
(46条消息) Spring Bean循环依赖问题是如何解决的?_晓呆同学的专栏-CSDN博客_springbean循环依赖怎么解决
7.Spring框架如何实现批量注入?
8.SpringMVC框架的运行流程,(工作流程,实现原理)
SpringMVC执行流程及工作原理 - 简书 (jianshu.com)
9.jvm内存结构模型分析
10.jvm中,类加载机制,如何打破双亲委派
11.jvm如何进行优化
12.gc垃圾回收机制
13.JAVA中线程synchronize和lock锁的区别,锁机制
14.JAVA中线程池的几种创建方式,核心参数,原理分析
15.JAVA中活锁死锁分析,如何避免死锁
16.map集合中底层的数据结构分析,以及map集合的put方法做了哪些事?
17.SpringMVC框架,从用户发起请求到dispatchServlet发生了什么?(网络相关)
18.Mybatis框架有几级缓存,默认开启几级缓存?缓存的实现原理。
19.Mybatis框架如何防止注入攻击?
20.离职原因是什么?为什么离职?你上家公司领导叫什么?联系方式。
21.mybatis框架底层采用的缓存算法Lru简单介绍?
22.Nginx的轮询,权重,IPHash三种简单介绍下。
23.MySQL数据库索引的作用以及优缺点?索引在什么情况下失效!
24.MySQL数据库的优化有哪些?(主要看下sql优化,什么情况下优化?)
25.mysql数据库的事务是什么?有哪些特性?事务的隔离级别?
26.项目流程总结?模块总结?
27.redis缓存雪崩和击穿和穿透的解决方案。
缓存穿透的解决方案:最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。
1.缓存无效 key,如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间,这种方式可以解决请求的 key 变化不频繁的情况,尽量将无效的 key 的过期时间设置短一点 。很明显,这种方案并不能从根本上解决此问题。
2.布隆过滤器,把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中,不存在的话,直接返回请求参数错误信息给客户端。小概率会误判,
3.实时监控,对于恶意的大量访问的用户设置黑名单,目的就是让这些非法的访问不进入服务器和数据库。
缓存击穿:
缓存雪崩的解决方案:
针对 Redis 服务不可用的情况:
- 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
- 限流,避免同时处理大量的请求。
针对热点缓存失效的情况:
- 设置不同的失效时间比如随机设置缓存的失效时间。
- 缓存永不失效。
28.redis如何储存热点数据?
29.mysql数据库中有2000万条数据,redis中有20w条,如何保证这20w条数据一定是热点数据?
30.redis的常见数据类型有哪些?
1.string数据类型,redis是c写的,但是 Redis 并没有使用 C 的字符串表示,但是redis是自己构建了一种简单动态字符串SDS,可保存文本数据还可保存二进制数据,除此之外,Redis 的 SDS API 是安全的,不会造成缓冲区溢出。一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
2.list 链表,Redis 的 list 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。(链表是一种非常常见的数据结构,特点是易于数据元素的插入和删除并且可以灵活调整链表长度,但是链表的随机访问困难。)应用场景: 发布与订阅或者说消息队列、慢查询。
3.hash,hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表),hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象。应用场景: 系统中对象数据的存储。
4.set,set 类似于 Java 中的 HashSet
。Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
5.sorted set,和 set 相比,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。应用场景: 需要对数据根据某个权重进行排序的场景。比如在直播系统中各种礼物排行榜。
6.bitmap,bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 bitmap 本身会极大的节省储存空间。应用场景: 适合需要保存状态信息(比如是否签到、是否登录...