Spring Boot面试问题总结

Spring Boot

1 什么是Spring Boot
  • spring boot是spring开源组织下的子项目,是spring组件一站式解决方案,主要是简化了使用spring的难度,简化了繁重的配置,提供了各种启动器,使得开发者能够快速上手。
2 Spring Boot和Spring Cloud的区别
  • Spring Boot是快速开发的Spring框架,Spring Cloud是完整的微服务框架,Spring Cloud依赖于Spring Boot
3 Spring Boot的核心注解是哪个,主要是那几个注解组成的
  • 启动类上面的注解@SpringBootApplication,它也是Spring Boot的核心注解,主要包含以下三个注解。
    1.@SpringBootConfiguration:组合了@Configuration注解,实现了配置文件的功能。

    2.EnableAutoConfiguration:打开了自动配置功能,也可以关闭某个自动配置的选项

    3.@ComponentScan:Spring组件扫描

4 Spring Boot支持哪些日志框架?默认和推荐的日志框架是哪个?
  • Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果使用Starters启动器,Spring Boot将使用Logback作为默认日志框架,不管哪种日志框架都支持将配置文件输出到控制台或者文件中。
5 SpringBoot Starter的工作原理

在SpringBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件中配置了所有需要创建的spring容器里的bean,并且进行自动配置把bean注入到SpringContext中(Spring的配置文件)

6 运行Spring Boot的几种方式
  • 打包用命令或者放到容器中运行
  • 用maven/Gradle插件运行
  • 直接执行main方法运行
7 Spring Boot需要独立的容器运行吗
  • 可以不需要,内置了Tomcat/Jetty等容器
8 开启Spring Boot特性的几种方式
  • 继承Spring-boot-starter-parent项目

  • 导入spring-boot-depenencies项目依赖

9 Spring Boot实现热部署的几种方式
  • 热部署就是可以不用重新运行Spring Boot项目可以实现操作后台代码自动更新到已经运行的项目中,主要由下面两种方式:
    Spring Loaded
    Spring-boot-devtools
10 Spring Boot事务的使用
  • Spring Boot首先使用注解@EnableTransactionManagement开启事务之后,然后再service方法上添加@Transactionl即可
11 Async异步调用方法
  • 在Spring Boot中使用异步调用很简单,只需要在方法上使用@Async注解即可实现方法的异步调用。需要启动类加上@EnableAsync使得异步调用@Async注解生效
12 如何在Spring Boot启动时运行一些特定的代码
  • 可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,都提供了一个run方法
13 Spring Boot有哪几种读取配置的方式
  • Spring Boot可以通过@PropertySource,@Value,@Environment,@ConfigurationProperties注解来绑定变量
14 什么是Java Config
  • Spring Java Config是Spring社区的产品,提供了配置Spring IOC容器的纯Java方法,有助于避免XML配置,优点在于:

    1.面向对象配置,由于配置被定义为JavaConfg中的类,因此用户可以充分利用Java中的面向对象功能,一个配置类可以继承另一个,重写它的@Bean方法。

    2.减少或者消除XML配置。基于依赖注入原则的外化配置的好处已经被证明。Java Config为开发人员提供一种纯Java方法来配置与XML配置概念类似的Spring容器。从技术角度讲,只使用Java Config配置类来配置容器是可行的,但实际上很多人认为Java Config与XML混合匹配是理想的

15 Spring Boot的自动配置原理
  • 主要是Spring Boot启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能

  • 有了EnableAutoConfiguration的话,就会实现以下步骤:
    从配置文件META_INF/Spring.factories加载可能用到的自动配置类

    去重,并将exclude和excludeName属性携带的类排除
    过滤,将满足条件(@Conditional)的自动配置类返回

16 如何理解Spring Boot配置加载顺序
  • 在Spring Boot里面,可以使用以下几种配置来加载配置
    properties文件
    YAML文件
    系统环境变量
    命令行参数
17 YAML是什么
  • YAML是一种人类可读的数据序列化语言。通常用于配置文件,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。
18 YAML配置的优势在哪里

相比于传统的properties配置,优势如下:

  1. 配置有序
  2. 简洁明了,还支持数组,数组中元素可以是基本数据类型也可以是对象
  3. 但是不支持@PropertySource注解导入自定义的YAML配置
19 Spring Boot 是否可以使用 XML 配置 ?
  • Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
20 Spring Boot的核心配置文件是什么,bootstrap.properties和application.properties有何区别
  • 单纯做Spring Boot开发不太容易遇到bootstrap.properties配置文件,但是在结合Spring Cloud时,这个配置就会经常遇到,特别是在需要加载一些远程配置文件时。

  • Spring Boot核心的两个配置文件

    1.bootstrap(.yml或者.properties):bootstrap由父ApplicationContext加载,比application优先加载,配置在应用程序上下文的引导阶段生效。一般来说在Spring Cloud配置就会使用到这个文件,且bootstrap里面的属性不能被覆盖。

    2.application(.yml或者.properties):由ApplicationContext加载,用于Spring Boot项目的自动化配置。

21 什么是 Spring Profiles?
  • 在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?Spring给我们提供了profiles机制给我们提供的就是来回切换配置文件的功能
  • Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。
22 SpringBoot多数据源拆分的思路
  • 先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中
23 SpringBoot多数据源事务如何管理
  • 第一种方式是在service层的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事务
  • 第二种是使用jta-atomikos实现分布式事务管理
24 保护 Spring Boot 应用有哪些方法?
  • 在生产中使用HTTPS
  • 使用Snyk检查你的依赖关系
  • 升级到最新版本
  • 启用CSRF保护
  • 使用内容安全策略防止XSS攻击
25 如何实现 Spring Boot 应用程序的安全性?
  • 为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
26 Spring Boot 中如何解决跨域问题 ?
  • 跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
27 Spring Boot 中的监视器是什么?
  • Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。
28 如何使用 Spring Boot 实现全局异常处理?
  • Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。
29 我们如何监视所有 Spring Boot 微服务?
  • Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。
30 SpringBoot性能如何优化
  • 如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范围
  • 在项目启动时设置JVM初始内存和最大内存相同
  • 将springboot内置服务器由tomcat设置为undertow
31 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot项目如何热部署?
  • 这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。
32 SpringBoot微服务中如何实现 session 共享 ?
  • 在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
33 Spring Boot 中如何实现定时任务 ?
  • 在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一-个则是使用第三方框架 Quartz。
  • 使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
34 您使用了哪些 starter maven 依赖项?
  • 使用了下面的一些依赖项
    • spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
    • spring-boot-starter-data-jpa 数据库支持
    • spring-boot-starter-data-redis redis数据库支持
    • mybatis-spring-boot-starter 第三方的mybatis集成starter
    • 自定义的starter(如果自己开发过就可以说出来)
35 Spring Boot 中的 starter 到底是什么 ?
  • 首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性(spring.factories)注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter
36 spring-boot-starter-parent 有什么用 ?
  • 我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
    1. 定义了 Java 编译版本为 1.8 。
    2. 使用 UTF-8 格式编码。
    3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
    4. 执行打包操作的配置。
    5. 自动化的资源过滤。
    6. 自动化的插件配置。
    7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
  • 总结就是打包用的
37 SpringBoot如何实现打包
  • 进入项目目录在控制台输入mvn clean package,clean是清空已存在的项目包,package进行打包
  • 或者点击左边选项栏中的Mavne,先点击clean在点击package
38 Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
  • Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
  • Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值