前言

spring框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定的帮助。

系列文章:

面试题-Java基础

面试题-Java集合

面试题-Java多线程基础、实现工具和可见性保证

面试题-线程池和原子变量

面试题-Java虚拟机

面试题-计算机网络1

面试题-计算机网络-HTTP部分


Spring框架

  1. 什么是 Spring 框架?

    Spring是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们说的Spring框架是很多模块的集合,包括核心容器,数据访问集成,web,AOP等等。

  2. @RestController vs @Controller和区别?

    单独使用Controller时,适用于前后端不分离的应用,Controller返回一个model and view。

    RestController将返回数据写入ResponseBody中,Controller+ResponseBody注解一起用和RestController是一样的功能。

  3. 简单说说你对IOC的理解

    IOC叫做控制反转,控制反转是一种设计思想,简单来说就是,本来把程序员控制的流程交给框架控制,框架提供给程序员一些扩展点,程序员实现扩展点就可以方便的调用框架做需要的事情。

    SpringIoc容器是控制反转设计思想的一种实现,程序员把管理对象生命周期的工作交给框架来做,通过配置文件或注解配置需要的对象,在使用的时候跟Spring容器要就可以了。

  4. 谈谈你对AOP的理解

    AOP是面向切面编程,通过把和业务无关,但是却被很多业务模块调用的系统功能封装起来,减少系统的重复代码,提高代码的复用性并提高的系统的维护性。

    比如实际项目中,中间件组的web层代码AOP框架规范是我制定的,统一处理异常,记录日志等操作是放在这个AOP中的,具体用的是ControllerAdvice实现的。

  5. AOP的实现原理你了解吗?简单说说

    AOP的实现最核心的就是利用JDK的动态代理或者cglib实现,项目启动时通过反射获取相关的信息,在创建代理对象时,如果被代理对象实现了接口,就是用JDK动态代理,如果没有实现接口,就使用cglib创建被代理对象的子类来实现代理。

  6. Spring的AOP和AspectJ的AOP有什么区别?

    二者都是AOP思想的实现,AspectJ的功能更加强大。

    • springAOP是基于运行时动态增强

    • AspectJ是编译时操作字节码增强,运行时更快

    项目中遇到无法使用Spring来管理对象这种情况时,就会考虑使用AspectJ来增强对象

  7. 为什么需要bean的作用域?

    spring容器需要管理对象的生命周期,spring通过scope作用域的概念给使用者对对象生命周期的更精细的控制。

  8. bean的作用域都有哪些?

    • singleton:单例,会一直存活直到容器关闭,spring默认的对象作用域是单例的
    • prototype:多实例,每次请求都会创建一个新的对象,交给使用方以后,spring就不负责管理对象的生命周期了
    • request:每次请求都创建一个实例,请求完毕后销毁对象
    • session:每个session创建一个实例,session失效后销毁对象实例
  9. Spring 中的单例 bean 的线程安全问题了解吗?

    对单例bean的非静态成员变量的读写会有线程安全问题。

    如果每个线程对成员变量的修改业务上没有关联,可以通过使用ThreadLocal来保存每个线程单独的变量拷贝副本来实现线程安全。

  10. @Component 和 @Bean 的区别是什么?

    • 作用对象不同:component作用于类,bean作用于方法。
    • bean注解适用于引用第三方类库的bean时使用,因为没办法使用component注解用于第三方类库的源码
  11. 将⼀个类声明为Spring的 bean 的注解有哪些?

    • Component:通用注解
    • Service:Service层的注解
    • Controller:控制层的注解
    • Repository:DAO层的注解
  12. Spring 中的 bean ⽣命周期?

    • Spring先对bean进行实例化
    • Spring将值和引用注入到相关属性中
    • 如果bean实现了相关的aware接口,spring就会调用set方法把相关需求的实例注入到bean中
    • 如果实现了 beanpostProcessor接口,会调用before方法
    • 如果有postConstruct注解,会调用注解的方法
    • 如果实现了InitialingBean接口,会调用afterPropertiesSet方法
    • 如果指定了init-method,会调用init-method
    • 最后调用beanpostProcessor的after方法
    • 销毁前,会调用DispoableBean的destory方法
    • 如果指定了destroy-method,调用这个方法
    • 最后调用 preConstruct注解修饰的方法

    流程图如下:

  1. 你知道spring MVC的工作原理吗?

    • DispatcherServlet接收用户的请求后,根据请求向处理器映射器查询具体处理器
    • 处理器映射器返回对应的处理器链返回给dispatherServlet
    • dispatcherServlet会将请求发送给具体的处理器,并等待处理
    • 处理器处理完毕后,会返回逻辑视图名和模型给前端控制器
    • 前端控制器根据逻辑视图名向视图解析器解析具体的视图
    • 最后视图负责根据模型数据渲染页面,并返回给客户端
  2. MVC的注解都用过什么?

    • RestController:指定控制器
    • RequestMapping,负责编写具体的url,指定post方法,并指定返回内容类型
    • RequestBody:接收通过body传递过来的JSONObject数据参数
    • ControllerAdvice和ExceptionHandler:负责controller的全局异常处理
  3. Spring 框架中⽤到了哪些设计模式?

    • 单例模式:spring的bean作用域默认是单例的
    • 代理模式:AOP就是代理模式的实现
    • 工厂模式:applicationContext就是对象工厂
    • 观察者模式:spring的事件机制就是观察者模式的一个典型应用
  4. Spring 管理事务的⽅式有⼏种?

    • 编程式事务:硬编码
    • 声明式事务:
      • 基于XML
      • 基于注解
  5. Spring事务的隔离级别都有哪些,如何设置?

    和MySQL中的事务隔离级别一样,有四种隔离级别可以设置,还有一种是使用数据库的默认隔离级别

    在transactional注解中设置isolation属性即可

  6. Spring中事务的传播机制有哪些?

    事务的传播机制指的是,如果事务方法互相调用,事务应该如何传播,具体分为三大类:

    • 支持当前事务的:如果有事务,加入当前事务
    • 不支持当前事务的:如果有事务,挂起或者抛出异常
    • 其他情况:嵌套事务,父事务回滚,子事务也会回滚

我们的具体业务中,相关联的业务都写在了同一个service方法中,所以不存在事务的传播机制问题

如果需要拆分方法,那么需要根据具体业务逻辑具体分析使用哪种事务

事务的传播机制

  1. @Transactional(rollbackFor = Exception.class)注解了解吗?

    了解,如果不这么配置,那么事务只会在运行时异常的时候才会回滚,我们也需要cover到非运行时异常的情况。

  2. Spring是如何管理bean的?

    Spring会读取配置文件或者注解定义的bean信息,实例化为一个BeanDefinition,存入到一个List中,然后利用反射实例化对象,存入一个Map<String,Object>中

  3. Bean的生命周期中的扩展点都有哪些?

    • Spring实例化
    • 依赖注入
    • 各种XXAware接口,注入相关实例
    • BeanPostProcessor
    • InitializingBean
    • DisposableBean
  4. Spring常见的注入方式有哪些?

    • 构造函数
    • set方法
    • 注解注入
  5. Spring是如何解决循环依赖的问题的?

    什么是循环依赖?循环依赖分为两种,一种是构造器依赖,这种JVM会报错;另一种是属性依赖。Spring解决的是属性循环依赖。

    Spring是通过递归来实例化bean和它依赖的bean的,直到bean中没有依赖就会返回,然后反递归层层设置上属性。这里有个关键点,如果是循环依赖,就会把没有真实完成的类注入到对应类中。

  6. 哪几种情况会引起事务失效?

    • this引用方法
    • private或者protected

Springboot

  1. 什么是Springboot?

    Springboot简化了使用Spring的难度,使开发者能快速上手,具体表现在:

    • 节省了繁重的配置
    • 提供了各种starter启动器
  2. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

    SpringbootApplicaition是Springboot的启动类注解,也是核心注解,它是由下面三个注解组成的:

    • ComponentScan:组件扫描,将组件注册到容器中
    • EnableAutoConfiguration:打开自动配置,根据类路径中jar包是否存在来决定是否开启某个默认配置,用exclude可以关闭某个默认配置
    • SpringBootConfiguration: 相当于Configuration,是一个配置类,会被ComponentScan注解扫描到
  3. 什么是 JavaConfig?

    JavaConfig是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的,通过纯Java方法来配置Springg容器,可以避免使用XML。

  4. Spring Boot 自动配置原理是什么?

    • Springboot启动的时候会通过@EnableAutoConfiguration注解开启自动配置,并找到META-INF/spring.factories中的所有自动配置类,并对其进行加载。
    • 自动配置类都是以AutoConfiguration结尾的,里面包含一个关键性注解EnableConfigurationProperties,这个注解可以把配置了ConfigurationProperties注解的类注入到容器中,这个类可以接收application.properties中配置的配置信息。
  5. YML配置文件的优势在哪里?

    yml格式的配置文件有着可读性更强的树型结构,但是因为yml配置文件需要过多的考虑格式问题,我们项目组还是使用properties配置文件。

  6. Spring Boot 是否可以使用 XML 配置 ?

    可以使用,但是Springboot推荐使用java配置。如果一定要使用的话,可以使用@importResource注解引入一个XML配置

  7. 什么是 Spring Profiles?

    我们的环境分为开发验证和生产环境,没有profile的概念时,需要手动维护多个配置文件,然后进行替换,使用Profile时,可以定义单个配置文件,并定义名称为application-dev.properties,application-verify.properties和application-prod.properties,在总配置文件中指定spring.active.profile为对应的配置文件后缀即可。同样的道理,也可以基于Profile注解实现不同环境注入不同的bean到容器中。

  8. 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot项目如何热部署?

    使用spring-boot-devtools可以实现热部署,具体操作时,需要在idea中开启自动build项目选项,并在配置文件中增加热部署相关的配置项,比如spring.devtools.restart.enabled设置为true。

  9. Spring Boot 中的 starter 到底是什么 ?

    starter的作用简单来说有下面两个:

    • 方便引入相关依赖
    • 自动配置各模块需要的属性,这里的原理和第四个问题,自动配置原理那个问题是一样的
  10. spring-boot-starter-parent 有什么用 ?

    这个是springboot工程的父级依赖,我觉得最核心的就是定义了各种版本号,这样我们在自己的项目中就不需要写版本号了。其他的功能还有比如默认使用Java8,使用UTF-8编码等等。

  11. 不适用spring-boot-starter-parent,如果创建springboot项目?

    一般来说,这种场景可能出现在该模块已经有了一个父模块存在,无法再引入parent,这种场景下可以在父模块中使用dependacyManagement来实现引入sprintboot

  12. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

    boot打成的jar不能作为普通的jar被其他项目引用,因为普通可引用的jar解压后就是包名,而Springboot的jar是放在Boot-INF/classes下的。如果一定要引用,那么也可以在pom文件中增加配置,将springboot打成两个jar,一个可执行,一个可引用。SpringBoot打包可执行可依赖的jar包

  13. 运行 Spring Boot 有哪几种方式?

    • 打jar包用java命令或者打war包用容器执行
    • main方法直接执行
    • maven的插件也可以运行: mvn spring-boot:run
  14. 让你写个starter 你会怎么写?

    • 编写自己的Properties配置类和需要提供的核心服务类XXService
    • 编写AutoConfig类。
      • 通过EnableAutoConfiguration开启自动配置并且注入Properties类的实例;通过@Bean注册核心服务类到容器中,构造函数相关参数就是Properties类中提供的
      • 通过Condition类控制相关的条件
    • 在META-INF/spring.factories文件,里面写入key为一个特别长的配置,value为AutoConfig类的全路径名

      参考资料

面试题-Spring和Springboot框架的更多相关文章

  1. 微服务分布式 spring cloud springboot 框架源码 activiti工作流 前后分离

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  2. spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  3. SSM(Spring + Springmvc + Mybatis)框架面试题

    JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...

  4. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

  5. Java 框架面试题-Spring Boot自定义配置与自动配置共存

    Spring Boot 是一个快速开发框架,可以简化 Spring 应用程序的开发,其中自定义配置是其中一个非常重要的特性. 在 Spring Boot 中,自定义配置允许开发者以自己的方式来配置应用 ...

  6. 面试题Spring Boot

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  7. Springboot框架

    本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...

  8. Springboot 框架学习

    Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等 ...

  9. 小程序后端项目【Springboot框架】部署到阿里云服务器【支持https访问】

    前言: 我的后端项目是Java写的,用的Springboot框架.在部署服务器并配置https访问过程中,因为做了一些令人窒息的操作(事后发现),所以老是不能成功. 不成功具体点说就是:域名地址可以正 ...

  10. Spring SpringMVC SpringBoot SpringCloud概念、关系及区别

    一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确,Struts主要负责表示 ...

随机推荐

  1. 第九章 ThreadPoolExecutor源码解析

    ThreadPoolExecutor使用 + 工作机理 + 生命周期 1.最基础的线程池ThreadPoolExecutor 使用方式: 1 /** 2 * ThreadPoolExecutor测试类 ...

  2. Codeforces Round 962 (Div. 3)

    题目链接:Codeforces Round 962 (Div. 3) 总结:ABC秒过,D有点难评了,E优化很妙. A. Legs tag:签到 void solve(){ cin >> ...

  3. 第3章 在C#中创建类型

    第3章 在C#中创建类型 3.1 类 复杂的类可能包含如下内容: 在 class ​关键字之前:类特性(Attribute​)和类修饰符.非嵌套的类修饰符有:public​.internal​.abs ...

  4. Windows中GNURadio的安装

    对于一个常常使用Python的人来讲(此处指我),conda环境是必不可少的,(Anaconda或Miniconda). 在Windows中且已经安装过conda环境的情况下,安装GNURadio特别 ...

  5. 腾讯云HAI服务器上部署与调用DeepSeek-R1大模型的实战指南

    上次我们大概了解了一下 DeepSeek-R1 大模型,并简单提及了 Ollama 的一些基本信息.今天,我们将深入实际操作,利用腾讯云的 HAI 服务器进行 5 分钟部署,并实现本地 DeepSee ...

  6. nmcli命令

    nmcli命令详解 nmcli命令是可以完成网卡上的所有配置,并可以写入配置文件中. 在NM里,有2个维度:连接(connection)和设备(device),这是多对一的关系.想给某个网卡配ip,首 ...

  7. Doris名词解释

    1.Tablet:Doris 表的逻辑分片,一个表有多个分片 2.Replica:分片的副本,默认一个分片有3个副本 3.Healthy Replica:健康副本,副本所在 Backend 存活,且副 ...

  8. MinIO笔记

    MinIO (网站 https://min.io/) 是开源的对象存储项目, 用Go实现, 支持Linux环境, 客户端支Java,Python,Javacript, Go等语言. 在分布式项目中, ...

  9. 如何配置支付宝密钥之如何配置普通 RSA2 密钥|保姆级教学(一)

    进行支付宝开发的第一步就是:配置密钥. 但是有很多小伙伴都不知道怎么配置,这篇文章将手把手帮你从头开始捋清如何配置支付宝密钥- 这次首先放一下官方文档:[如何生成及配置 RSA2 密钥],大佬们也可以 ...

  10. 几乎全平台的C语言JSON解析工具cJSON[转载]

    最近在做一个外设管理平台,用PYTHON写了一个连接管理,兼容串口和套接字的连接,然后抽象为设备统一管理.使用套接字时JSON是一种很好的数据封装类型,假设我需要远程操控一个设备,发送一个JSON的数 ...