SpringBoot有史以来最全面试题,吐血整理,你值得拥有!
Posted 孟挽周
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot有史以来最全面试题,吐血整理,你值得拥有!相关的知识,希望对你有一定的参考价值。
Spring Boot 是微服务中最好的 Java 框架。为了更好的理解与使用,最近熬夜整合了一套
《Springboot “42” 问答》
,请大家务必认真看完,便于日后的面试 !
42问答,目录
- 什么是SpringBoot?
- SpringBoot的特征?
- 如何快速构建一个SpringBoot项目?
- SpringBoot启动类注解?它是由哪些注解组成?
- 什么是yaml?
- SpringBoot支持配置文件的格式?
- SpringBoot启动方式?
- SpringBoot需要独立的容器运行?
- SpringBoot配置途径?
- application.properties和application.yml文件可放位置?优先级?
- SpringBoot自动配置原理?
- SpringBoot热部署方式?
- bootstrap.yml 和application.yml?
- SpringBoot如何修改端口号?
- 开启SpringBoot特性的几种方式?
- SpringBoot如何兼容Spring项目?
- SpringBoot配置监控?
- 获得Bean装配报告信息访问哪个端点?
- 关闭应用程序访问哪个端点?
- 查看发布应用信息访问哪个端点?
- 针对请求访问的几个组合注解?
- SpringBoot 中的starter?
- SpringBoot集成Mybatis?
- 什么是SpringProfiles?
- 不同的环境的配置文件?
- 如何激活某个环境的配置?
- 编写测试用例的注解?
- SpringBoot异常处理相关注解?
- SpringBoot 1.x 和 2.x区别?
- SpringBoot读取配置相关注解有?
- Spring Boot 有哪些优点?
- SpringBoot多数据源拆分的思路
- SpringBoot多数据源事务如何管理
- 如何实现 Spring Boot 应用程序的安全性?
- 比较一下 Spring Security 和 Shiro 各自的优缺点 ?
- Spring Boot 中如何解决跨域问题 ?
- Spring Boot 中的监视器是什么?
- 我们如何监视所有 Spring Boot 微服务?
- SpringBoot性能如何优化
- SpringBoot微服务中如何实现 session 共享 ?
- Spring Boot 中的 starter 到底是什么 ?
- Spring Boot 中如何实现定时任务 ?
- Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
什么是SpringBoot?
- 通过Spring Boot,可以轻松地创建独立的,基于生产级别的Spring的应用程序,您可以“运行”它们。大多数Spring Boot应用程序需要最少的Spring配置。
SpringBoot的特征?
- 创建独立的Spring应用程序
- 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)
- 提供固化的“starter”依赖项,以简化构建配置
- 尽可能自动配置Spring和3rd Party库
- 提供可用于生产的功能,例如指标,运行状况检查和外部化配置
- 完全没有代码生成,也不需要XML配置
如何快速构建一个SpringBoot项目?
- 通过Web界面使用。http://start.spring.io
- 通过Spring Tool Suite使用。
- 通过IntelliJ IDEA使用。
- 使用Spring Boot CLI使用
SpringBoot启动类注解?它是由哪些注解组成?
启动注解:@SpringBootApplication
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项。
- @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
- @ComponentScan:Spring组件扫描
什么是yaml?
YAML
(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl。更具有结构性。
SpringBoot支持配置文件的格式?
- properties
java.user.name = mengzhichao
- yml
java:
user:
name: mengzhichao
SpringBoot启动方式?
- main方法
- 命令行 java -jar 的方式
- mvn/gradle
SpringBoot需要独立的容器运行?
- 不需要,内置了 Tomcat/Jetty。
SpringBoot配置途径?
- 命令行参数
- java:comp/env里的JNDI属性
- JVM系统属性
- 操作系统环境变量
- 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long})
- 应用程序以外的application.properties或者appliaction.yml文件
- 打包在应用程序内的application.properties或者appliaction.yml文件
- 通过@PropertySource标注的属性源
- 默认属性
tips:这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。
application.properties和application.yml文件可放位置?优先级?
- 外置,在相对于应用程序运行目录的/config子目录里。
- 外置,在应用程序运行的目录里。
- 内置,在config包内。
- 内置,在Classpath根目录。
这个列表按照优先级排序,优先级高的会覆盖优先级低的。
当然我们可以自己指定文件的位置来加载配置文件。
java -jar xiaoka.jar ———spring.config.location=/home/application.yml
SpringBoot自动配置原理?
- @EnableAutoConfiguration (开启自动配置) 该注解引入了AutoConfigurationImportSelector,该类中的方法会扫描所有存在META-INF/spring.factories的jar包。
SpringBoot热部署方式?
- spring-boot-devtools
- Spring Loaded
- Jrebel
- 模版热部署
bootstrap.yml 和application.yml?
- bootstrap.yml 优先于application.yml
SpringBoot如何修改端口号?
- yml中
server :
port: 8888
- properties中
server.port = 8888
- 命令1:
java -jar mzc.jar ——— server.port=8888
- 命令2:
java - Dserver.port=8888 -jar mzc.jar
开启SpringBoot特性的几种方式?
- 继承spring-boot-starter-parent项目
- 导入spring-boot-dependencies项目依赖
SpringBoot如何兼容Spring项目?
- 在启动类加:
@ImportResource(locations = {"classpath:spring.xml"})
注解
SpringBoot配置监控?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
获得Bean装配报告信息访问哪个端点?
- /beans 端点
关闭应用程序访问哪个端点?
- /shutdown
该端点默认是关闭的,如果开启,需要如下设置(properties格式也是可以的)。
endpoints:
shutdown:
enabled: true
查看发布应用信息访问哪个端点?
- /info
针对请求访问的几个组合注解?
- @PatchMapping
- @PostMapping
- @GetMapping
- @PutMapping
- @DeleteMapping
SpringBoot 中的starter?
-
可以理解成对依赖的一种合成,starter会把一个或一套功能相关依赖都包含进来,避免了自己去依赖费事,还有各种包的冲突问题。大大的提升了开发效率。
-
并且相关配置会有一个默认值,如果我们自己去配置,就会覆盖默认值。
SpringBoot集成Mybatis?
mybatis-spring-boot-starter
什么是SpringProfiles?
- 一般来说我们从开发到生产,经过开发(dev)、测试(test)、上线(prod)。不同的时刻我们会用不同的配置。Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。它们可以让我们自己选择什么时候用什么配置。
不同的环境的配置文件?
可以是 application-{profile}.properties/yml
,但默认是启动主配置文件application.properties,一般来说我们的不同环境配置如下。
application.properties
:主配置文件application-dev.properties
:开发环境配置文件application-test.properties
:测试环境配置文件application.prop-properties
:生产环境配置文件
如何激活某个环境的配置?
比如我们激活开发环境。
- yml
spring:
profiles:
active: dev
- properties
spring.profiles.active=dev
- 命令行
java -jar mengzhichao-v1.0.jar ———spring.profiles.active=dev
编写测试用例的注解?
- @SpringBootTest
SpringBoot异常处理相关注解?
- @ControllerAdvice
- @ExceptionHandler
SpringBoot 1.x 和 2.x区别?
- SpringBoot 2基于Spring5和JDK8,Spring 1x用的是低版本。
- 配置变更,参数名等。
- SpringBoot2相关的插件最低版本很多都比原来高
- 2.x配置中的中文可以直接读取,不用转码
- Actuator的变化
- CacheManager 的变化
SpringBoot读取配置相关注解有?
- @PropertySource
- @Value
- @Environment
- @ConfigurationPropertie
Spring Boot 有哪些优点?
- Spring Boot 主要有如下优点:
- 容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架。
- 开箱即用,远离繁琐的配置。
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
- SpringBoot总结就是使编码变简单、配置变简单、部署变简单、监控变简单等等
SpringBoot多数据源拆分的思路
- 先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中。
SpringBoot多数据源事务如何管理
- 第一种方式是在service层的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事务
- 第二种是使用jta-atomikos实现分布式事务管理
如何实现 Spring Boot 应用程序的安全性?
- 为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
比较一下 Spring Security 和 Shiro 各自的优缺点 ?
- 由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。
- Shiro 和 Spring Security相比,主要有如下一些特点:
Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
Spring Security 功能强大;Shiro 功能简单
Spring Boot 中如何解决跨域问题 ?
- 跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Crossorigin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
Spring Boot 中的监视器是什么?
- Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。
我们如何监视所有 Spring Boot 微服务?
- Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。
SpringBoot性能如何优化
-
如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范围。
-
在项目启动时设置JVM初始内存和最大内存相同
-
将springboot内置服务器由tomcat设置为undertow
SpringBoot微服务中如何实现 session 共享 ?
- 在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务
器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
Spring Boot 中的 starter 到底是什么 ?
- 首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性(spring.factories)注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter。
Spring Boot 中如何实现定时任务 ?
- 在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled注解,另一个则是使用第三方框架 Quartz。
- 使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
- Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过
java -jar xxx.jar
命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。 - Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \\BOOTINF\\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
整合不易,别忘了给兄弟一键三连加关注哦!
以上是关于SpringBoot有史以来最全面试题,吐血整理,你值得拥有!的主要内容,如果未能解决你的问题,请参考以下文章