zoukankan      html  css  js  c++  java
  • 吃透互联网大厂必问的100道【Spring全家桶】高频面试真题,金九银十稳了!

    前言

    这篇文章主要是记录一下自己的面试经历,分享一些小伙伴们都很关注的面试题,然后文章末尾也会推荐一些电子书籍,完全免费推荐的哈,我个人感觉不错的,可以提升技术的,当然面试中也会对你有特别大的帮助。这次主要分享Spring全家桶系列的面试题,当然,面试题只是起一个查漏补缺的作用,并不是让你直接去整理答案,去背答案的哈。一个合格的面试官,是会针对你的简历去问的,每个人的面试题也都是不一样的。

    喜欢挑战自己的可以先看目录自己做做,不会的再看答案解析!

    一、微服务

    • Sentinel怎么防止激增流量打垮冷系统?
    • Ribbon说说有哪些负载均衡策略
    • 你们的微服务项目里面有没有用到什么监控追踪工具?
    • 说说Seata的实现原理?
    • 什么是服务熔断?什么是服务降级?区别是什么?
    • 什么是服务雪崩?什么是服务限流?
    • 说说服务网关可以做什么?
    • 谈谈配置中心?
    • 注册中心的原理是什么?
    • Spring Cloud有哪些常用组件,作用是什么?
    • 分布式架构下会有什么问题?
    • SOA、分布式、微服务之间有什么关系和区别?
    • 什么情况下需要进行微服务架构?

    二、Spring Boot

    • 说说你在开发的时候怎么在SpringBoot的基础上做扩展?
    • SpringBoot的默认日志实现框架是什么?怎么切换成别的?
    • SpringBoot读取配置文件的原理是什么?
    • SpringBoot中配置文件的加载顺序是怎样的?
    • 会不会SpringBoot自定义Starter?大概实现过程?
    • SpringBoot外置Tomcat启动原理?
    • SpringBoot内置Tomcat启动原理?
    • SpringBoot的启动原理?
    • 为什么SpringBoot的jar可以直接运行?
    • springboot的自动配置原理?
    • SpringBoot的核心注解
    • Spring和SpringBoot的关系和区别?
    • 谈谈你对SpringBoot的理解,它有哪些特性(优点)?

    三、Spring MVC

    • SpringMVC的拦截器和过滤器有什么区别?执行顺序?
    • 如何实现无XML零配置的SpringMVC
    • 是否可以把我们所需的Bean都放入Spring­mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)?
    • 是否可以把所有Bean都通过Spring容器来管理?(Spring的applicationContext.xml中配置全局扫描)
    • Spring和SpringMVC为什么需要父子容器?
    • SpringMvc怎么和AJAX相互调用的?
    • 请描述Spring MVC的工作流程?描述一下 DispatcherServlet 的工作流程?
    • Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
    • 说说你是如何解决 get 和 post 乱码问题?
    • 什么是Spring MVC?简单介绍下你对Spring MVC的理解?

    四、Spring核心API

    • Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?
    • Spring 框架中都用到了哪些设计模式?
    • Spring事件监听的核心机制是什么?

    五、Spring事务

    • Spring事务的失效原因?
    • Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?
    • Spring事务传播行为实现原理:
    • Spring事务实现原理
    • 说一下 spring 的事务隔离?
    • 说一下Spring的事务传播行为
    • Spring支持的事务管理类型, spring 事务实现方式有哪些?
    • 事务四大特性

    六、Spring AOP

    • Spring的 Aop的完整实现流程?
    • Spring的AOP是在哪里创建的动态代理?
    • 什么情况下AOP会失效,怎么解决?
    • 介绍AOP有几种实现方式
    • JavaConfig方式如何启用AOP?如何强制使用cglib?
    • JDK动态代理和CGLIB动态代理的区别
    • Spring AOP and AspectJ AOP 有什么区别?
    • Spring通知有哪些类型?
    • 解释一下Spring AOP里面的几个名词
    • 什么是AOP、能做什么

    七、Spring注解

    • 为什么@ComponentScan 不设置basePackage也会扫描?
    • @Bean之间的方法调用是怎么保证单例的?
    • 配置类@Configuration的作用解析原理:
    • 使用@Autowired注解自动装配的过程是怎样的?
    • @Autowired和@Resource之间的区别
    • @Autowired 注解有什么作用
    • 如何让自动注入找到多个依赖Bean时不报错
    • 如何让自动注入没有找到依赖Bean时不报错
    • @Import可以有几种用法?
    • @Component, @Controller, @Repository, @Service 有何区别?
    • 用过JavaConfig方式的spring配置吗?它是如何替代xml的?
    • Spring有哪几种配置方式:

    八、Spring Beans

    • Bean的创建顺序是什么样的?
    • Spring容器启动时,为什么先加载BeanFactoryPostProcess
    • 如何在Spring所有Bean创建完后做扩展?
    • 如何在Spring所有BeanDefinition注册完后做扩展?
    • BeanDefinition的加载过程:
    • Spring如何避免在并发下获取不完整的Bean?
    • Spring是如何解决Bean的循环依赖?
    • 解释Spring框架中bean的生命周期
    • Spring 在加载过程中Bean有哪几种形态:
    • 有哪些生命周期回调方法?有哪几种实现方式?
    • 解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?
    • 自动装配有哪些限制(需要注意)?
    • 什么是bean的自动装配?
    • 什么是bean装配?
    • Spring如何处理线程并发问题?
    • Spring框架中的单例bean是线程安全的吗?
    • Spring实例化bean方式的几种方式
    • 单例bean的优势
    • 解释Spring支持的几种bean的作用域
    • 配置Bean有哪几种方式?
    • 什么是Spring beans?

    九、Spring IOC

    • 你知道Spring的哪些扩展点,在什么时候调用?
    • IOC容器的加载过程:
    • BeanFactory 和FactoryBean有什么区别?
    • BeanFactory 和 ApplicationContext有什么区别?
    • BeanDefinition的作用
    • BeanFactory的作用
    • 紧耦合和松耦合有什么区别?
    • 什么是Spring的依赖注入(DI)?IOC和DI的区别是什么
    • Spring IoC 的实现机制是什么?
    • IOC的优点是什么?
    • 控制反转(IoC)有什么作用
    • 什么是Spring IOC 容器?有什么作用?

    十、Spring Framework

    • Spring的优缺点是什么?
    • 谈谈你对Spring的理解

    一、Spring MVC

    1、SpringMVC的拦截器和过滤器有什么区别?执行顺序?

    • 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    • 拦截器只能对action请求(DispatcherServlet 映射的请求)起作用,而过滤器则可以对几乎所有的请求起作用。
    • 拦截器可以访问容器中的Bean(DI),而过滤器不能访问(基于spring注册的过滤器也可以访问容器中的bean)。

    多个过滤器的执行顺序跟xml文件中定义的先后关系有关
    当然,对于多个拦截器它们之间的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。

    2、如何实现无XML零配置的SpringMVC

    1. 省略web.xml

    • a. servlet3.0之后规范中提供了SPI扩展:META-INF/services/javax.servlet.ServletContainerInitializer
    • b. SpringMVC通过实现ServletContainerInitializer接口
    • c. 动态注册ContextLoaderListener 和DispatcherServlet并创建子父容器(Application)

    2. 省略spring.xml和spring-mvc.xml(只是sprinmvc方式 ,springboot在自动配置类完成) 配置类--xml

    • a. 实现一个继承AbstractAnnotationConfigDispatcherServletInitializer的类
    • b. 该类就实现了ServletContainerInitializer,它会创建ContextLoaderListener 和DispatcherServlet
    • c. 还会创建父子容器, 创建容器时传入父子容器配置类则可以替代spring.xml和spring-mvc.xml

    3、是否可以把我们所需的Bean都放入Spring­mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)?

    可以 , 因为父容器的体现无非是为了获取子容器不包含的bean, 如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器来管理的。

    虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也需要把这部分配置需要放到Spring-mvc子容器的配置文件来,不然一部分内容在子容器和一部分内容在父容器,可能就会导致你的事物或者AOP不生效。 所以如果aop或事物如果不生效也有可能是通过父容器(spring)去增强子容器(Springmvc),也就无法增强。

    4、是否可以把所有Bean都通过Spring容器来管理?(Spring的applicationContext.xml中配置全局扫描)

    5、Spring和SpringMVC为什么需要父子容器?

    就功能性来说不用子父容器也可以完成(参考:SpringBoot就没用子父容器)

      1. 所以父子容器的主要作用应该是划分框架边界。有点单一职责的味道。service、dao层我们一般使用spring框架来管理、controller层交给springmvc管理
      1. 规范整体架构 使 父容器service无法访问子容器controller、子容器controller可以访问父容器 service
      1. 方便子容器的切换。如果现在我们想把web层从spring mvc替换成struts,那么只需要将spring­mvc.xml替换成Struts的配置文件struts.xml即可,而spring­core.xml不需要改变。
      1. 为了节省重复bean创建

    6、SpringMvc怎么和AJAX相互调用的?

    7、请描述Spring MVC的工作流程?描述一下 DispatcherServlet 的工作流程?

    (1)用户发送请求至前端控制器DispatcherServlet;

    (2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;

    (3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

    (4)DispatcherServlet 调用 HandlerAdapter处理器适配器;

    (5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

    (6)Handler执行完成返回ModelAndView;

    (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

    (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

    (9)ViewResolver解析后返回具体View;

    (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

    (11)DispatcherServlet响应用户

    Spring全家桶面试真题共享地址:Spring全家桶完整答案解析!

    8、Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

    9、说说你是如何解决 get 和 post 乱码问题?

    10、什么是Spring MVC?简单介绍下你对Spring MVC的理解?

    11、SpringBoot的核心注解一、微服务。

    二、Spring Boot

    1、说说你在开发的时候怎么在SpringBoot的基础上做扩展?

    2、SpringBoot的默认日志实现框架是什么?怎么切换成别的?

    3、SpringBoot读取配置文件的原理是什么?

    4、SpringBoot中配置文件的加载顺序是怎样的?

    5、会不会SpringBoot自定义Starter?大概实现过程?

    6、SpringBoot外置Tomcat启动原理?

    7、SpringBoot内置Tomcat启动原理?

    • 当依赖Spring-boot-starter-web依赖时会在SpringBoot中添加:ServletWebServerFactoryAutoConfigurationservlet容器自动配置类
    • 该自动配置类通过@Import导入了可用(通过@ConditionalOnClass判断决定使用哪一个)的一个Web容器工厂(默认Tomcat)
    • 在内嵌Tomcat类中配置了一个TomcatServletWebServerFactory的Bean(Web容器工厂)
    • 它会在SpringBoot启动时 加载ioc容器(refresh)   OnRefersh  创建内嵌的Tomcat并启动

    8、SpringBoot的启动原理?

    1.运行main方法: 初始化new SpringApplication  从spring.factories  读取 listener  ApplicationContextInitializer   。

    2.运行run方法

    3.读取 环境变量   配置信息.....

    4. 创建springApplication上下文:ServletWebServerApplicationContext

    5. 预初始化上下文 : 将启动类作为配置类进行读取-->将配置注册为BeanDefinition

    6.调用refresh 加载ioc容器

    invokeBeanFactoryPostProcessor -- 解析@Import:  加载所有的自动配置类onRefresh  创建(内置)servlet容器

    7.在这个过程中springboot会调用很多监听器对外进行扩展

    9、为什么SpringBoot的jar可以直接运行?

    1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。

    2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的

    类。

    3.java -jar会去找jar中的manifest文件,在那里面找到真正的启动类(Main-Class);

    4.Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载boot-lib下面的jar,并以一个新线程启动应用的启动类的Main函数(找到manifest中的Start-Class)。

    10、springboot的自动配置原理?

    1.通过@SpringBootConfiguration 引入了@EnableAutoConfiguration (负责启动自动配置功能)

    2.@EnableAutoConfiguration 引入了@Import

    3.Spring容器启动时:加载Ioc容器时会解析@Import 注解

    4.@Import导入了一个deferredImportSelector(它会使SpringBoot的自动配置类的顺序在最后,这样方便我们扩展和覆盖?)

    5.然后读取所有的/META-INF/spring.factories文件(SPI)

    6.过滤出所有AutoConfigurtionClass类型的类

    7.最后通过@ConditioOnXXX排除无效的自动配置类

    11、SpringBoot的核心注解

    12、Spring和SpringBoot的关系和区别?

    • SpringBoot是Spring生态的产品。
    • Spring Framework是一个容器框架

    SpringBoot 它不是一个框架、它是一个可以快速构建基于Spring的脚手架(里面包含了Spring和各种框架),为开发Spring生态其他框架铺平道路,2个不是一个层面的东西, 没有可比性

    13、谈谈你对SpringBoot的理解,它有哪些特性(优点)?

    SpringBoot的用来快速开发Spring应用的一个脚手架、其设计目的是用来简新Spring应用的初始搭建以及开发过程。

    1.SpringBoot提供了很多内置的Starter结合自动配置,对主流框架无配置集成、开箱即用。

    2.SpringBoot简化了开发,采用JavaConfig的方式可以使用零xml的方式进行开发;

    2.SpringBoot内置Web容器无需依赖外部Web服务器,省略了Web.xml,直接运行jar文件就可以启动web应用;

    4.SpringBoot帮我管理了常用的第三方依赖的版本,减少出现版本冲突的问题;

    5.SpringBoot自带了监控功能,可以监控应用程序的运行状况,或者内存、线程池、Http 请求统计等,同时还提供了优雅关闭应用程序等功能。

    三、微服务

    1、Sentinel怎么防止激增流量打垮冷系统?

    2、Ribbon说说有哪些负载均衡策略

    3、你们的微服务项目里面有没有用到什么监控追踪工具?

    4、说说Seata的实现原理?

    5、什么是服务熔断?什么是服务降级?区别是什么?

    6、什么是服务雪崩?什么是服务限流?

    7、说说服务网关可以做什么?

    8、谈谈配置中心?

    9、注册中心的原理是什么?

    10、Spring Cloud有哪些常用组件,作用是什么?

    11、分布式架构下会有什么问题?

    12、SOA、分布式、微服务之间有什么关系和区别?

    13、什么情况下需要进行微服务架构?

    四、Spring核心API

    1、Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

    2、Spring 框架中都用到了哪些设计模式?

    3、Spring事件监听的核心机制是什么?

    五、Spring事务

    1、Spring事务的失效原因?

    2、Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?

    • 1.Spring的事务信息是存在ThreadLocal中的Connection, 所以一个线程永远只能有一个事务
    • 2. 所以Spring 的事务是无法实现事务一致性的
    • 3. 可以通过编程式事务,或者通过分布式事务的思路:二阶段提交方式

    3、Spring事务传播行为实现原理:

    • Spring的事务信息是存在ThreadLocal中的, 所以一个线程永远只能有一个事务,
    • 融入:当传播行为是融入外部事务则拿到ThreadLocal中的Connection、共享一个数据库连接共同提交、回滚;
    • 创建新事务:当传播行为是创建新事务,会将嵌套新事务存入ThreadLocal、再将外部事务暂存起来;  当嵌套事务提交、回滚后,会将暂存的事务信息恢复到ThreadLocal中

    4、Spring事务实现原理

    5、说一下 spring 的事务隔离?

    6、说一下Spring的事务传播行为

    7、Spring支持的事务管理类型, spring 事务实现方式有哪些?

    8、事务四大特性

    六、Spring AOP

    1、Spring的 Aop的完整实现流程?

    2、Spring的AOP是在哪里创建的动态代理?

    3、什么情况下AOP会失效,怎么解决?

    4、介绍AOP有几种实现方式

    5、JavaConfig方式如何启用AOP?如何强制使用cglib?

    6、JDK动态代理和CGLIB动态代理的区别

    7、Spring AOP and AspectJ AOP 有什么区别?

    8、Spring通知有哪些类型?

    9、解释一下Spring AOP里面的几个名词

    (1)切面(Aspect):  在Spring Aop指定就是“切面类” ,切面类会管理着切点、通知。

    (2)连接点(Join point): 指定就是被增强的业务方法

    (3)通知(Advice):     就是需要增加到业务方法中的公共代码, 通知有很多种类型分别可以在需要增加的业务方法不同位置进行执行(前置通知、后置通知、异常通知、返回通知、环绕通知)

    (4)切点(Pointcut):  由他决定哪些方法需要增强、哪些不需要增强,  结合切点表达式进行实现

    (5)目标对象(Target Object):  指定是增强的对象

    (6)织入(Weaving) :  spring aop用的织入方式:动态代理。  就是为目标对象创建动态代理的过程就叫织入。

    10、什么是AOP、能做什么?

    • AOP(Aspect-Oriented Programming),一般称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。
    • AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP作为面向对象的一种补充,则是针对业务处理过程中的切面进行提取, 已达到业务代码和公共行为代码之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

    Spring全家桶面试真题共享地址:Spring全家桶完整答案解析!

    七、Spring注解

    1、为什么@ComponentScan 不设置basePackage也会扫描?

    2、@Bean之间的方法调用是怎么保证单例的?

    3、配置类@Configuration的作用解析原理:

    4、使用@Autowired注解自动装配的过程是怎样的?

    5、@Autowired和@Resource之间的区别

    6、@Autowired 注解有什么作用

    7、如何让自动注入找到多个依赖Bean时不报错

    8、如何让自动注入没有找到依赖Bean时不报错

    9、@Import可以有几种用法?

    10、@Component, @Controller, @Repository, @Service 有何区别?

    11、用过JavaConfig方式的spring配置吗?它是如何替代xml的?

    12、Spring有哪几种配置方式:

    八、Spring Beans

    1、Bean的创建顺序是什么样的?

    2、Spring容器启动时,为什么先加载BeanFactoryPostProcess

    3、如何在Spring所有Bean创建完后做扩展?

    4、如何在Spring所有BeanDefinition注册完后做扩展?

    5、BeanDefinition的加载过程:

    6、Spring如何避免在并发下获取不完整的Bean?

    7、Spring是如何解决Bean的循环依赖?

    8、解释Spring框架中bean的生命周期

    9、Spring 在加载过程中Bean有哪几种形态:

    10、有哪些生命周期回调方法?有哪几种实现方式?

    11、解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?

    12、自动装配有哪些限制(需要注意)?

    13、什么是bean的自动装配?

    14、什么是bean装配?

    15、Spring如何处理线程并发问题?

    16、Spring框架中的单例bean是线程安全的吗?

    17、Spring实例化bean方式的几种方式

    18、单例bean的优势

    19、解释Spring支持的几种bean的作用域

    20、配置Bean有哪几种方式?

    21、什么是Spring beans?

    九、Spring IOC

    1、你知道Spring的哪些扩展点,在什么时候调用?

    2、IOC容器的加载过程:

    3、BeanFactory 和FactoryBean有什么区别?

    4、BeanFactory 和 ApplicationContext有什么区别?

    5、BeanDefinition的作用

    6、BeanFactory的作用

    7、紧耦合和松耦合有什么区别?

    8、什么是Spring的依赖注入(DI)?IOC和DI的区别是什么

    9、Spring IoC 的实现机制是什么?

    10、IOC的优点是什么?

    11、控制反转(IoC)有什么作用

    12、什么是Spring IOC 容器?有什么作用?

    十、Spring Framework

    1、Spring的优缺点是什么?

    2、谈谈你对Spring的理解?

    对了,小伙伴们面试中有遇到过奇葩问题吗?有的话,欢迎发在评论区跟大伙交流哦!

  • 相关阅读:
    JavaScript 多个空格替换成1个空格
    「DIARY」NOI2021 小结
    kubernetes常用命令总结
    Qt绘图(使用QPainter)翻转图像的两种方法
    android 11 R framework 新特证 开发备忘
    浏览器的缓存机制
    记el-tree 懒加载复选框回显的坑
    VUE根据文件流下载EXC
    西瓜视频播放器VUE
    推荐系统打散算法--权重
  • 原文地址:https://www.cnblogs.com/QLCZ/p/15260251.html
Copyright © 2011-2022 走看看