SpringBoot现在已经成了必备框架,而且大厂也特别喜欢考察,今天给大家总结了28道SpringBoot面试题及答案@mikechen
1. SpringBoot是什么?
SpringBoot来简化Spring应用开发,约定大于配置,去繁化简,是 Spring 开源组织下的子项目。
传统的 SSM/SSH 框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率。
而 Spring Boot 对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。
2.SpringBoot的核心注解有哪些?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
1)@SpringBootConfiguration
组合了 @Configuration 注解,实现配置文件的功能。
2)@EnableAutoConfiguration
打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
3)@ComponentScan
Spring组件扫描
3.SpringBoot的配置文件有哪几种格式?
.properties 和 .yml,它们的区别主要是书写格式不同。
1)properties
app.user.name = javastack
2)yml
app: user: name: javastack
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心。
@EnableAutoConfiguration, @Configuration, @ConditionalOnClass
@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类,筛选有效的自动配置类,每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能。
5.如何理解 Spring Boot 配置加载顺序?
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
6.SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
Spring Loaded Spring-boot-devtools
7.SpringBoot启动时都做了什么?
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作。
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中,它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 。
8.SpringBoot打成的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 ,一个可执行,一个可引用。
9. 运行SpringBoot 有哪几种方式?
-
-
打包用命令或者放到容器中运行
-
-
-
用 Maven/ Gradle 插件运行
-
-
-
直接执行 main 方法运行
-
10.什么是YAML?
-
YAML是一种人类可读的数据序列化语言。 -
它通常用于配置文件。 -
与属性文件相比,如果我们想要在配置文件中添加复杂的属性, -
YAML文件更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
11.SpringBoot中如何实现定时任务?
定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。
在 Spring Boot 中使用定时任务主要有两种不同的方式,
-
一个就是使用 Spring 中的 @Scheduled 注解, -
另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可
12.SpringBoot、Spring MVC和Spring有什么区别?
1)Spring
Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转,当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。
2)Spring MVC
Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
3)SpringBoot
Spring和Spring MVC的问题在于需要配置大量的参数,SpringBoot通过一个自动配置和启动的项来解决这个问题。
13.Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。
这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在则是通过 @CrossOrigin 注解来解决跨域问题。
14.什么是Spring Profiles?
主要用来区分环境;
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。
15.如何实现SpringBoot 应用程序的安全性?
为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
16.如何使用SpringBoot实现分页和排序?
使用Spring Boot实现分页非常简单,使用Spring Data-JPA
可以实现,将可分页的 org.springframework.data.domain.Pageable 传递给存储库方法。
17. SpringBoot 中的监视器是什么?
-
Spring boot actuator是spring启动框架中的重要功能之一。 -
Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。 -
有几个指标必须在生产环境中进行检查和监控。 -
即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。 -
监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
18.SpringBoot中如何实现 session 共享 ?
常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
19.SpringBoot 1.x 和 2.x区别?
- SpringBoot 2基于Spring5和JDK8,Spring 1x用的是低版本。
- SpringBoot2相关的插件最低版本很多都比原来高
- 2.x配置中的中文可以直接读取,不用转码
20.谈谈 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
21.什么是 SpringBoot Stater ?
启动器是一套方便的依赖没描述符,它可以放在自己的程序中。你可以一站式的获取你所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
例如,如果你想使用 Sping 和 JPA 访问数据库,只需要你的项目包含 spring-boot-starter-data-jpa 依赖项,你就可以完美进行。
22.SpringBoot 支持哪些日志框架?推荐和默认的日志框架是哪个?
SpringBoot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架。
如果你使用 Starters 启动器,SpringBoot 将使用 Logback 作为默认日志框架,但是不管是那种日志框架他都支持将配置文件输出到控制台或者文件中。
23.如何使用SpringBoot实现分页和排序?
使用SpringBoot实现分页非常简单。使用Spring Data-JPA可以实现将可分页的。
24.如何更改代码而无需重新启动服务器?
这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>
SpringBoot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。
25.SpringBoot性能如何优化?
- 如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范围;
- 在项目启动时设置JVM初始内存和最大内存相同;
- 将springboot内置服务器由tomcat设置为undertow。
26.您使用了哪些 starter maven 依赖项?
使用了下面的一些依赖项:
- 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集成starter
- 自定义的starter(如果自己开发过就可以说出来)
27.Spring Boot Actuator有什么用?
Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。
Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。
Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。
28.SpringBoot 与 SpringCloud 区别?
SpringBoot 是快速开发的 Spring 框架,SpringCloud 是完整的微服务框架,SpringCloud 依赖于 SpringBoot。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》