Spring Boot面试问题
Spring Boot使应用程序开发更加容易,但是在测试您对所有工作原理的了解时,我们可能会遇到一些棘手的面试问题。准备给定的Spring Boot面试问题和答案的下一次面试。
目录
1.什么是Spring Boot?它与Spring框架有何不同?
2.Spring Boot的优缺点?
3.什么是自动配置?如何启用或禁用某些配置?
4.什么是启动器依赖项?
5. Spring Boot常用注释?
6. Spring Boot是否支持嵌入式服务器?
7.为什么我们使用spring boot maven插件?
8.如何创建和引导简单的启动应用程序?
10.如何启用调试日志记录?
11.什么是弹簧执行器?它有什么优势?
12.什么是Spring Boot中的宽松绑定?
13.如何对Spring Boot应用程序进行单元测试和插入测试?
14.如何在浏览器中启用热部署和实时重载?
15.如何在Spring Boot中启用HTTPS / SSL支持?
1.什么是Spring Boot?它与Spring框架有何不同?
Spring Boot Starter模块
Spring Boot是一个Spring框架模块,借助强大的入门模板和自动配置功能,它们可以为Spring框架提供RAD(快速应用程序开发)功能,这些功能非常强大且可以完美运行。
它对Spring平台和第三方库持坚定态度。这意味着只要我们将任何依赖项包含到应用程序中,Spring Boot就会假定它具有通用性,并自动将库中最常用的类配置为具有合理默认值的Spring bean。
例如,如果我们正在创建Web MVC应用程序,则包含maven依赖项spring-boot-starter-web
仅会带来所有用于使用Spring webMVC构建Web的jar /库,包括RESTful应用程序。Ut还包括Tomcat作为默认的嵌入式容器。
它还提供了一系列非功能性功能,例如嵌入式服务器,安全性,指标,运行状况检查和开箱即用的外部配置,而无需额外的配置。
如果我们必须确定Spring框架与Spring Boot的区别,那么可以说Spring Boot基本上是Spring框架的扩展,它消除了设置可正常生产的应用程序所需的样板配置。
它对导入到项目中的Spring和第三方库采取了自以为是的观点,并为我们配置了行为。区别就这么简单。
2.Spring Boot的优缺点?
引导的两个最大优点是通过启动程序POM简化了&版本无冲突的依赖关系管理,并且对最常用的库和行为进行了有意识的自动配置。
嵌入式jar可以将Web应用程序打包为jar文件,可以在任何地方运行。
它的执行器模块提供HTTP端点来访问应用程序内部,例如详细指标,应用程序内部工作,运行状况等。
在不利方面,它们很少。仍然有许多开发人员可能将初学者poms包含的传递性依赖项视为部署打包的负担。
另外,它的自动配置功能可能会启用许多我们在应用程序生命周期中从未使用过的功能,并且它们将一直处于初始化和完全配置状态。这可能会导致不必要的资源利用。
3.什么是自动配置?如何启用或禁用某些配置?
Spring Boot自动配置扫描类路径,在类路径中找到库,然后尝试为它们猜测最佳配置,最后配置所有此类Bean。
自动配置会尝试尽可能智能化,并且会随着我们定义更多自己的自定义配置而退出。它总是在注册用户定义的bean之后应用。
自动配置在@Conditional注释(例如@ConditionalOnBean
和)的帮助下工作@ConditionalOnClass
。
例如,看AopAutoConfiguration
课。如果类路径扫描找到了EnableAspectJAutoProxy,Aspect,Advice和AnnotatedElement类并且spring.aop.auto=false
在属性文件中不存在,则Spring boot将为我们配置Spring AOP模块。
@Configuration @ConditionalOnClass ({ EnableAspectJAutoProxy. class , Aspect. class , Advice. class , AnnotatedElement. class }) @ConditionalOnProperty (prefix = "spring.aop" , name = "auto" , havingValue = "true" , matchIfMissing = true ) public class AopAutoConfiguration { //code } |
4.什么是Starter依赖项?
Spring Boot Starter是Maven模板,其中包含启动特定功能所需的所有相关传递依赖项的集合。
例如,如果我们要创建一个Spring WebMVC应用程序,那么在传统的设置中,我们将自己包括所有必需的依赖项。它留下了版本冲突的机会,最终导致更多的运行时异常。
使用Spring boot,要创建Web MVC应用程序,我们需要导入的只是spring-boot-starter-web
依赖项。可传递地,它引入了所有其他必需的依赖关系以构建Web应用程序,例如spring-webmvc,spring-web,hibernate-validator,tomcat-embed-core,tomcat-embed-el,tomcat-embed-websocket,jackson-databind,jackson -datatype-jdk8,jackson-datatype-jsr310和jackson-module-parameter-names。
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > |
5. Spring Boot常用注解?
最常用和重要的spring boot注解如下:
–仅导入并应用指定的自动配置类。当我们不想启用默认的自动配置时,应该使用它。
@EnableAutoConfiguration
–启用自动配置机制。@ComponentScan
–在应用程序类路径中启用组件扫描。@SpringBootApplication
–一步启用上述三项功能,即启用自动配置机制,启用组件扫描并在上下文中注册额外的bean。- @ImportAutoConfiguration
@AutoConfigureBefore, @AutoConfigureAfter, @AutoConfigureOrder
–如果需要以特定顺序应用配置(在此之前或之后),则应使用–。@Conditional
– @ConditionalOnBean,@ConditionalOnWebApplication或@ConditionalOnClass之类的注释仅在条件满足时才允许注册bean。
6. Spring Boot是否支持嵌入式服务器?
Spring Boot应用程序始终将tomcat作为嵌入式服务器依赖项。这意味着您可以从命令提示符运行Spring Boot应用程序,而无需使用复杂的服务器基础结构。
如果需要,我们可以排除tomcat,并根据需要包含任何其他嵌入式服务器。或者我们可以完全排除服务器环境。全部基于配置。
例如,以下配置排除了tomcat,并包括了jetty作为嵌入式服务器。
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > < exclusions > < exclusion > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-tomcat</ artifactId > </ exclusion > </ exclusions > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-jetty</ artifactId > </ dependency > |
7.为什么我们使用spring boot maven插件?
它在Maven中提供了Spring Boot支持,使我们可以打包可执行jar或war归档文件并“就地”运行应用程序。要使用它,我们必须使用Maven 3.2(或更高版本)。
该插件提供了使用Spring Boot应用程序的几个目标:
spring-boot:repackage
:创建可自动执行的jar或war文件。它可以代替常规工件,也可以使用单独的分类器附加到构建生命周期。spring-boot:run
:使用几个选项运行您的Spring Boot应用程序以将参数传递给它。spring-boot:start
和stop
:将Spring Boot应用程序集成到该integration-test
阶段,以便该应用程序在该阶段之前启动。spring-boot:build-info
:生成执行器可以使用的构建信息。
8.如何创建和引导简单的启动应用程序?
-
要创建任何简单的spring boot应用程序,我们需要先创建一个
pom.xml
文件。添加spring-boot-starter-parent
为项目的父项,使其成为Spring Boot应用程序。pom.xml <?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<
modelVersion
>4.0.0</
modelVersion
>
<
groupId
>com.example</
groupId
>
<
artifactId
>myproject</
artifactId
>
<
version
>0.0.1-SNAPSHOT</
version
>
<
parent
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter-parent</
artifactId
>
<
version
>2.2.1.RELEASE</
version
>
</
parent
>
</
project
>
上面是最简单的spring boot应用程序,可以打包为jar文件。现在,将项目导入到IDE中(可选)。
-
现在,我们可以开始添加在开发特定类型的应用程序时可能需要的其他启动程序依赖项。例如,对于Web应用程序,我们添加了spring-boot-starter-web依赖项。
pom.xml <
dependencies
>
<
dependency
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter-web</
artifactId
>
</
dependency
>
</
dependencies
>
-
在此步骤开始添加应用程序业务逻辑,视图和域数据。默认情况下,Maven编译源代码,
src/main/java
因此仅在此文件夹内创建应用程序代码。作为最初的软件包,添加应用程序引导类并添加
@SpringBootApplication
注释。此类将用于运行应用程序。它的main()
方法充当应用程序的入口点。MyApplication.java import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public
class
MyApplication
{
public
static
void
main(String[] args) {
SpringApplication.run(MyApplication.
class
, args);
}
}
- 上面方法中提供的SpringApplication类
main()
引导我们的应用程序,启动Spring,这反过来又启动了自动配置的Tomcat Web服务器。MyApplication
(方法参数)指示主要的Spring组件。 -
由于我们使用了spring-boot-starter-parent父POM,因此我们有一个有用的“运行”目标,可以用来启动应用程序。
'mvn spring-boot:run'
从根项目目录中键入以启动应用程序。它将通过点击URL:启动我们可以在控制台日志和浏览器中验证的应用程序
localhost:8080
。
9.如何将Web应用程序打包为可执行jar或war文件?
可执行jar(有时称为“胖jar”)是包含已编译类以及应用程序需要运行的所有jar依赖项的归档文件。
要创建一个可执行的JAR,我们将增加spring-boot-maven-plugin
在pom.xml
。默认情况下,此插件.jar
仅将应用程序打包为文件。
< build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > </ build > |
要创建war文件,逻辑上的第一步是在pom.xml文件中声明打包类型'war'。
其次,将嵌入式服务器依赖项的范围设置为“已提供”,因为服务器依赖项将由将要部署war文件的应用程序服务器提供。
< packaging >war</ packaging > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-tomcat</ artifactId > < scope >provided</ scope > </ dependency > |
10.如何启用调试日志记录?
要启用调试日志记录,
- 我们可以使用
--debug
开关启动应用程序。 - 我们可以
logging.level.root=debug
在application.properties
文件中设置属性。 - 我们可以在提供的日志配置文件中设置root logger的日志记录级别。
11.什么是Spring Boot Actuator?它有什么优势?
Spring Boot的执行器模块使我们能够监视和管理生产环境中的应用程序使用情况,而无需为其中任何一个进行编码和配置。这些监视和管理信息通过REST(如端点URL )公开。
启用功能的最简单方法是将依赖项添加到spring-boot-starter-actuator
启动程序pom文件。
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-actuator</ artifactId > </ dependency > |
Spring Boot包含许多内置端点,我们可以添加自己的端点。此外,每个单独的端点也可以启用或禁用。
一些重要且广泛使用的执行器端点如下:
终点 | 用法 |
---|---|
/env |
返回当前环境中的属性列表 |
/health |
返回应用程序健康信息。 |
/auditevents |
返回所有自动配置的候选对象以及应用它们“被”或“未被”的原因。 |
/beans |
返回应用程序中所有Spring Bean的完整列表。 |
/trace |
返回跟踪日志(默认情况下,最近的100个HTTP请求)。 |
/dump |
它执行线程转储。 |
/metrics |
它显示了一些有用的指标信息,例如JVM内存使用情况,系统CPU使用情况,打开的文件等等。 |
12.什么是Spring Boot中的宽松绑定?
Spring Boot使用一些宽松的规则来解析配置属性名称,以便可以以多种方式编写一个简单的属性名称。
例如,一个简单的属性“ log.level.my-package”可以通过以下方式编写,并且所有内容都是正确的,并将由框架根据其属性值对其值进行解析。
log.level.my- package = debug //Kebab case log.level.my_package = debug //Underscore notation log.level.myPackage = debug //Camel case LOG.LEVEL.MY-PACKAGE = debug //Upper case format |
以下是每个属性源的宽松绑定规则列表。
财产来源 | 允许的类型 |
---|---|
属性文件 | Camel Case,kebab case或下划线 |
YAML文件 | Camel Case,kebab case或下划线 |
环境变量 | 以下划线作为定界符的大写格式。_ 不应在属性名称中使用 |
系统属性 | Camel Case,kebab case或下划线 |
13.如何在Spring Boot应用程序中进行单元测试和集成测试?
通常,任何软件应用程序都分为不同的模块和组件。单独测试一个这样的组件时,称为单元测试。
单元测试不能验证应用程序代码是否正确地与外部依赖项一起工作。它专注于单个组件并模拟与该组件交互的所有依赖项。
要执行单元测试,我们可以借助特殊的注释,例如:
@JdbcTest
–当测试仅关注基于jdbc的组件时,可用于典型的jdbc测试。@JsonTest
–当测试仅关注JSON序列化时使用。@RestClientTest
–用于测试REST客户端。@WebMvcTest
–用于仅与MVC测试相关的配置的Spring MVC测试。
集成测试可以根据测试内容将整个应用程序置于范围内,也可以仅将某些组件置于范围内。他们可能需要为数据库实例和硬件分配资源。尽管也可以模拟这些交互以提高测试性能。
在集成测试中,我们将专注于测试从控制器到持久层的完整请求处理。
该@SpringBootTest
注释有助于在编写集成测试。它启动嵌入式服务器并完全初始化应用程序上下文。我们可以使用@Autowired注解在测试类中注入依赖项。
我们还可以使用嵌套的@Configuration类或显式@TestConfiguration
类提供测试特定的bean配置。
它还会注册一个TestRestTemplate
和/或WebTestClient
bean用于网络测试。
@SpringBootTest (classes = SpringBootDemoApplication. class , webEnvironment = WebEnvironment.RANDOM_PORT) public class EmployeeControllerIntegrationTests { @LocalServerPort private int port; @Autowired private TestRestTemplate restTemplate; //tests } |
14.如何在浏览器中启用热部署和实时重载?
大多数现代IDE支持字节码的热交换,并且大多数代码更改应干净地重新加载而没有副作用。此外,该spring-boot-devtools
模块还支持在类路径上的文件发生更改时自动重新启动应用程序。
默认情况下,将监视类路径上指向文件夹的任何条目的更改。请注意,某些资源(例如静态资产和视图模板)不需要重新启动应用程序。
该spring-boot-devtools
模块包括一个嵌入式LiveReload服务器,该服务器可用于在更改资源时触发浏览器刷新。可从livereload.com免费获得适用于Chrome,Firefox和Safari的LiveReload浏览器扩展。
要启用/禁用LiveReload服务器,请将spring.devtools.livereload.enabled
属性的值更改为true
(默认值)或false
。
15.如何在Spring Boot中启用HTTPS / SSL支持?
可以通过添加以下条目来添加spring boot项目中的SSL支持application.properties
。
server.port= 8443 server.ssl.key-alias=selfsigned_localhost_sslserver server.ssl.key-password=changeit server.ssl.key-store=classpath:ssl-server.jks server.ssl.key-store-provider=SUN server.ssl.key-store-type=JKS |
请与我们分享您过去遇到的更多春季靴面试问题