49道Spring Boot面试题带答案(很全)
1. 为什么要用SpringBoot
Spring Boot 优点非常多,如:
1、独立运行
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
2、简化配置
spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
3、自动配置
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个Spring-boot-starterweb启动器就能拥有web的功能,无需其他配置。
4、无代码生成和XML配置
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
5、应用监控
Spring Boot提供一系列端点可以监控服务及应用,做健康检测。
2. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了
以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能。
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})。
@ComponentScan:Spring组件扫描。
3. 运行Spring Boot有哪几种方式?
1)打包用命令或者放到容器中运行
2)用 Maven/Gradle 插件运行
3)直接执行 main 方法运行
4. 如何理解 Spring Boot 中的 Starters?
Starters是什么:
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
Starters命名:
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
Starters分类:
- Spring Boot应用类启动器
- Spring Boot技术类启动器
- Spring Boot技术类启动器
5. 如何在Spring Boot启动的时候运行一些特定的代码?
如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。
CommandLineRunner:启动获取命令行参数
6. Spring Boot 需要独立的容器运行吗?
可以不需要,内置了 Tomcat/ Jetty 等容器。
7. Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
8. 如何使用Spring Boot实现异常处理?
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice类,来处理控制器类抛出的所有异常。
10. springboot常用的starter有哪些
starter可以理解成对依赖的一种合成,starter会把一个或一套功能相关依赖都包含进来,避免了自己去依赖费事,还有各种包的冲突问题。大大的提升了开发效率。并且相关配置会有一个默认值,如果我们自己去配置,就会覆盖默认值。
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成
11. SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
- spring-boot-devtools
- Spring Loaded
- Jrebel
- 模版热部署
12. 如何理解 Spring Boot 配置加载顺序?
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
13. Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
spring boot 核心的两个配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 SpringCloud 配置就会使用这个文件。且 boostrap 里面的属性不能被覆盖;
application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。
14. 如何集成 Spring Boot 和 ActiveMQ?
对于集成 Spring Boot 和 ActiveMQ,我们使用 spring-boot-starter-activemq 依赖关系。 它只需要很少的配置,并且不需要样板代码。
15. Spring Boot的特征
- 创建独立的Spring应用程序
- 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)
- 提供固化的“starter”依赖项,以简化构建配置
- 尽可能自动配置Spring和3rd Party库
- 提供可用于生产的功能,例如指标,运行状况检查和外部化配置
- 完全没有代码生成,也不需要XML配置
16. 什么是yaml?
YAML(/?j?m?l/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了
其他多种语言,包括:C语言、Python、Perl。更具有结构性。
17. SpringBoot支持配置文件的格式
1.properties
java.xiaokaxiu.name = xiaoka
2.yml
java:
xiaokaxiu:
name: xiaoka
18. SpringBoot启动方式?
- main方法
- 命令行 java -jar 的方式
- mvn/gradle
19. SpringBoot配置途径?
-
命令行参数
-
java:comp/env里的JNDI属性
-
JVM系统属性
-
操作系统环境变量
-
随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long})
-
应用程序以外的application.properties或者appliaction.yml文件
-
打包在应用程序内的application.properties或者appliaction.yml文件
-
通过@PropertySource标注的属性源
-
默认属性
tips:这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相
同属性。
20. application.properties和application.yml文件可放位置?优先级?
1、外置,在相对于应用程序运行目录的/config子目录里。
2、外置,在应用程序运行的目录里。
3、内置,在config包内。
4、内置,在Classpath根目录。
这个列表按照优先级排序,优先级高的会覆盖优先级低的。
当然我们可以自己指定文件的位置来加载配置文件。
java -jar xiaoka.jar ———spring.config.location=/home/application.yml
21. SpringBoot自动配置原理?
主要是Spring Boot的启动类上的核心注解@SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。有了这个EnableAutoConfiguration的话就会:
- 从配置文件META_INF/Spring.factories加载可能用到的自动配置类
- 去重,并将exclude和excludeName属性携带的类排除
- 过滤,将满足条件(@Conditional)的自动配置类返回
22. SpringBoot如何修改端口号?
java -jar xiaoka.jar ——— server.port=8888
java - Dserver.port=8888 -jar xiaoka.jar
23. 开启SpringBoot特性的几种方式?
- 继承spring-boot-starter-parent项目
- 导入spring-boot-dependencies项目依赖
24. SpringBoot如何兼容Spring项目?
在启动类加:
@ImportResource(locations = {“classpath:spring.xml”})
25. 针对请求访问的几个组合注解?
@PatchMapping
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
26. 什么是SpringProfiles?
一般来说我们从开发到生产,经过开发(dev)、测试(test)、上线(prod)。不同的时刻我们会用不同的配置。Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。它们可以让我们自己选择什么时候用什么配置。
27. 不同的环境的配置文件?
可以是 application-{profile}.properties/yml ,但默认是启动主配置文件application.properties,一般来说我们的不同环境配置如下。
application.properties
:主配置文件
application-dev.properties
:开发环境配置文件
application-test.properties
:测试环境配置文件
application.prop-properties
:生产环境配置文件
28. 如何激活某个环境的配置?
比如我们激活开发环境。
yml:
spring:
profiles:
active: dev
properties:
spring.profiles.active=dev
命令行:
java -jar xiaoka-v1.0.jar ———spring.profiles.active=dev
29. SpringBoot异常处理相关注解?
@ControllerAdvice
@ExceptionHandler
30. SpringBoot读取配置相关注解有?
@PropertySource
@Value
@Environment
@ConfigurationProperties
31.SpringBoot与SpringCloud 区别
SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。
32. Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,但是不管是那种日志框架他都支持将配置文件输出到控制台或者文件中。
33. SpringBoot事务的使用
SpringBoot的事物很简单,首先使用注解@EnableTransactionManagement开启事物之后,然后在Service方法上添加注解@Transactional便可。
34. Async异步调用方法
在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步调用。 注意:需要在启动类加入@EnableAsync使异步调用@Async注解生效。
35. YAML 配置的优势在哪里 ?
- 配置有序,在一些特殊的场景下,配置有序很关键
- 简洁明了,它还支持数组,数组中的元素可以是基本数据类型也可以是对象
- 相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。
36. Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
37. SpringBoot多数据源拆分的思路
先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中。
38. SpringBoot多数据源事务如何管理
第一种方式是在service层的@TransactionManager中使用transactionManager指定DataSourceConfig中配置的事务。
第二种是使用jta-atomikos实现分布式事务管理
39. 保护 Spring Boot 应用有哪些方法?
- 在生产中使用HTTPS
- 使用Snyk检查你的依赖关系
- 升级到最新版本
- 启用CSRF保护
- 使用内容安全策略防止XSS攻击
40. 如何实现 Spring Boot 应用程序的安全性?
为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
41. 比较一下 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 功能简单
42. Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Crossorigin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuraion
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
43. 如何使用 Spring Boot 实现全局异常处理?
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice 类,来处理控制器类抛出的所有异常。
44. 我们如何监视所有 Spring Boot 微服务?
Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不集中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。
45. SpringBoot性能如何优化
- 如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范围。
- 在项目启动时设置JVM初始内存和最大内存相同
- 将springboot内置服务器由tomcat设置为undertow
46. SpringBoot微服务中如何实现 session 共享 ?
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
47. Spring Boot 中如何实现定时任务 ?
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled注解,另一-个则是使用第三方框架 Quartz。
48. spring-boot-starter-parent 有什么用 ?
我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 springboot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
-
定义了 Java 编译版本为 1.8 。
-
使用 UTF-8 格式编码。
-
继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
-
执行打包操作的配置。
-
自动化的资源过滤。
-
自动化的插件配置。
-
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
-
总结就是打包用的
49. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
- Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
主要有如下作用:
-
定义了 Java 编译版本为 1.8 。
-
使用 UTF-8 格式编码。
-
继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
-
执行打包操作的配置。
-
自动化的资源过滤。
-
自动化的插件配置。
-
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
-
总结就是打包用的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!