当前位置: 首页 > news >正文

springboot打包成war_经常出现的13道SpringBoot相关的面试问题(含答案)

dc211aa2e513a4d1ed6a6954cd567192.png

概述

从诞生那天开始,SpringBoot 就在 Spring 生态中扮演一个重要的地位。这个项目的自动化部署功能使我们的编程工作变得更方便。

在这篇文章当中,我们将介绍一些在工程师面试中可能会出现的 Spring Boot 相关的常见问题。

问题

Q1. Spring 和 SpringBoot 有什么不同?

Spring 框架提供多种特性使得 web 应用开发变得更简便,包括依赖注入、数据绑定、切面编程、数据存取等等。

随着时间推移,Spring 生态变得越来越复杂了,并且应用程序所必须的配置文件也令人觉得可怕。这就是 Spirng Boot 派上用场的地方了 – 它使得 Spring 的配置变得更轻而易举。

实际上,Spring 是 unopinionated(予以配置项多,倾向性弱) 的,Spring Boot 在平台和库的做法中更 opinionated ,使得我们更容易上手。

这里有两条 SpringBoot 带来的好处:

  • 根据 classpath 中的 artifacts 的自动化配置应用程序
  • 提供非功能性特性例如安全和健康检查给到生产环境中的应用程序

Q2. 怎么使用 Maven 来构建一个 SpringBoot 程序?

就像引入其他库一样,我们可以在 Maven 工程中加入 SpringBoot 依赖。然而,最好是从 spring-boot-starter-parent 项目中继承以及声明依赖到 Spring Boot starters。这样做可以使我们的项目可以重用 SpringBoot 的默认配置。

继承 spring-boot-starter-parent 项目依赖很简单 – 我们只需要在 pom.xml 中定义一个 parent 节点:

aba0743b1b2d48f53af4d82644e9acb1.png

我们可以在 Maven central 中找到 spring-boot-starter-parent 的最新版本。

使用 starter 父项目依赖很方便,但并非总是可行。例如,如果我们公司都要求项目继承标准 POM,我们就不能依赖 SpringBoot starter 了。

这种情况,我们可以通过对 POM 元素的依赖管理来处理:

8a87554a40cddb4ee06b2c2113586104.png

最后,我们可以添加 SpringBoot starter 中一些依赖,然后我们就可以开始了。

Q3. SpringBoot starter 作用在什么地方?

依赖管理是所有项目中至关重要的一部分。当一个项目变得相当复杂,管理依赖会成为一个噩梦,因为当中涉及太多 artifacts 了。

这时候 SpringBoot starter 就派上用处了。每一个 stater 都在扮演着提供我们所需的 Spring 特性的一站式商店角色。其他所需的依赖以一致的方式注入并且被管理。

所有的 starter 都归于 org.springframework.boot 组中,并且它们都以由 spring-boot-starter- 开头取名。这种命名方式使得我们更容易找到 starter 依赖,特别是当我们使用那些支持通过名字查找依赖的 IDE 当中

在写这篇文章的时候,已经有超过50个 starter了,其中最常用的是:

  • spring-boot-starter:核心 starter,包括自动化配置支持,日志以及 YAML
  • spring-boot-starter-aop:Spring AOP 和 AspectJ 相关的切面编程 starter
  • spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
  • spring-boot-starter-jdbc:使用 HikariCP 连接池 JDBC 的 starter
  • spring-boot-starter-security:使用 Spring Security 的 starter
  • spring-boot-starter-test:SpringBoot 测试相关的 starter
  • spring-boot-starter-web:构建 restful、springMVC 的 web应用程序的 starter

Q4. 怎么禁用某些自动配置特性?

如果我们想禁用某些自动配置特性,可以使用 @EnableAutoConfiguration 注解的 exclude 属性来指明。例如,下面的代码段是使 DataSourceAutoConfiguration 无效:

// other annotations@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)public class MyConfiguration { }

如果我们使用 @SpringBootApplication 注解 — 那个将 @EnableAutoConfiguration作为元注解的项,来启用自动化配置,我们能够使用相同名字的属性来禁用自动化配置:

// other annotations@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class MyConfiguration { }

我们也能够使用 spring.autoconfigure.exclude 环境属性来禁用自动化配置。application.properties 中的这项配置能够像以前那样做同样的事情:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Q5. 怎么注册一个定制的自动化配置?

为了注册一个自动化配置类,我们必须在 META-INF/spring.factories 文件中的EnableAutoConfiguration 键下列出它的全限定名:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

如果我们使用 Maven 构建项目,这个文件需要放置在在 package 阶段被写入完成的 resources/META-INF 目录中。

Q6. 当 bean 存在的时候怎么置后执行自动配置?

为了当 bean 已存在的时候通知自动配置类置后执行,我们可以使用 @ConditionalOnMissingBean 注解。这个注解中最值得注意的属性是:

  • value:被检查的 beans 的类型
  • name:被检查的 beans 的名字

当将 @Bean 修饰到方法时,目标类型默认为方法的返回类型:

@Configurationpublic class CustomConfiguration { @Bean @ConditionalOnMissingBean public CustomService service() { ... }}

Q7. 怎么将 SpringBoot web 应用程序部署为 JAR 或 WAR 文件?

通常,我们将 web 应用程序打包成 WAR 文件,然后将它部署到另外的服务器上。这样做使得我们能够在相同的服务器上处理多个项目。当 CPU 和内存有限的情况下,这是一种最好的方法来节省资源。

然而,事情发生了转变。现在的计算机硬件相比起来已经很便宜了,并且现在的注意力大多转移到服务器配置上。部署中对服务器配置的一个细小的失误都会导致无可预料的灾难发生。

Spring 通过提供插件来解决这个问题,也就是 spring-boot-maven-plugin 来打包 web 应用程序到一个额外的 JAR 文件当中。为了引入这个插件,只需要在 pom.xml 中添加一个 plugin 属性:

org.springframework.boot spring-boot-maven-plugin

有了这个插件,我们会在执行 package 步骤后得到一个 JAR 包。这个 JAR 包包含所需的所有依赖以及一个嵌入的服务器。因此,我们不再需要担心去配置一个额外的服务器了。

我们能够通过运行一个普通的 JAR 包来启动应用程序。

注意一点,为了打包成 JAR 文件,pom.xml 中的 packgaing 属性必须定义为 jar

jar

如果我们不定义这个元素,它的默认值也为 jar

如果我们想构建一个 WAR 文件,将 packaging 元素修改为 war

war

并且将容器依赖从打包文件中移除:

org.springframework.boot spring-boot-starter-tomcat provided

执行 Maven 的 package 步骤之后,我们得到一个可部署的 WAR 文件。

Q8. 怎么使用 SpringBoot 去执行命令行程序?

像其他 Java 程序一样,一个 SpringBoot 命令行程序必须要有一个 main 方法。这个方法作为一个入口点,通过调用 SpringApplication#run 方法来驱动程序执行:

@SpringBootApplicationpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class); // other statements }}

SpringApplication 类会启动一个 Spirng 容器以及自动化配置 beans。

要注意的是我们必须把一个配置类传递到 run 方法中作为首要配置资源。按照惯例,这个参数一般是入口类本身。

在调用 run 方法之后,我们可以像平常的程序一样执行其他语句。

Q9. 有什么外部配置的可能来源?

SpringBoot 对外部配置提供了支持,允许我们在不同环境中运行相同的应用。我们可以使用 properties 文件、YAML 文件、环境变量、系统参数和命令行选项参数来声明配置属性。

然后我们可以通过 @Value 这个通过 @ConfigurationProperties 绑定的对象的注解或者实现 Enviroment 来访问这些属性。

以下是最常用的外部配置来源:

  • 命令行属性:命令行选项参数是以双连字符(例如,=)开头的程序参数,例如 –server.port=8080。SpringBoot将所有参数转换为属性并且添加到环境属性当中。
  • 应用属性:应用属性是指那些从 application.properties 文件或者其 YAML 副本中获得的属性。默认情况下,SpringBoot会从当前目录、classpath 根目录或者它们自身的 config 子目录下搜索该文件。
  • 特定 profile 配置:特殊概要配置是从 application-{profile}.properties 文件或者自身的 YAML 副本。{profile} 占位符引用一个在用的 profile。这些文件与非特定配置文件位于相同的位置,并且优先于它们。

Q10. SpringBoot 支持松绑定代表什么?

SpringBoot中的松绑定适用于配置属性的类型安全绑定。使用松绑定,环境属性的键不需要与属性名完全匹配。这样就可以用驼峰式、短横线式、蛇形式或者下划线分割来命名。

例如,在一个有 @ConfigurationProperties 声明的 bean 类中带有一个名为 myProp 的属性,它可以绑定到以下任何一个参数中,myPropmy-propmy_prop 或者 MY_PROP

Q11. SpringBoot DevTools 的用途是什么?

SpringBoot 开发者工具,或者说 DevTools,是一系列可以让开发过程变得简便的工具。为了引入这些工具,我们只需要在 POM.xml 中添加如下依赖:

org.springframework.boot spring-boot-devtools

spring-boot-devtools 模块在生产环境中是默认禁用的,archives 的 repackage 在这个模块中默认也被排除。因此,它不会给我们的生产环境带来任何开销。

通常来说,DevTools 应用属性适合于开发环境。这些属性禁用模板缓存,启用 web 组的调试日志记录等等。最后,我们可以在不设置任何属性的情况下进行合理的开发环境配置。

每当 classpath 上的文件发生更改时,使用 DevTools 的应用程序都会重新启动。这在开发中非常有用,因为它可以为修改提供快速的反馈。

默认情况下,像视图模板这样的静态资源修改后是不会被重启的。相反,资源的更改会触发浏览器刷新。注意,只有在浏览器中安装了 LiveReload 扩展并以与 DevTools 所包含的嵌入式 LiveReload 服务器交互时,才会发生。

Q12. 怎么编写一个集成测试?

当我们使用 Spring 应用去跑一个集成测试时,我们需要一个 ApplicationContext

为了使我们开发更简单,SpringBoot 为测试提供一个注解 – @SpringBootTest。这个注释由其 classes 属性指示的配置类创建一个 ApplicationContext

如果没有配置 classes 属性,SpringBoot 将会搜索主配置类。搜索会从包含测试类的包开始直到找到一个使用 @SpringBootApplication 或者 @SpringBootConfiguration 的类为止。

注意如果使用 JUnit4,我们必须使用 @RunWith(SpringRunner.class) 来修饰这个测试类。

Q13. SpringBoot的 Actuator 是做什么的?

本质上,Actuator 通过启用 production-ready 功能使得 SpringBoot 应用程序变得更有生命力。这些功能允许我们对生产环境中的应用程序进行监视和管理。

集成 SpringBoot Actuator 到项目中非常简单。我们需要做的只是将 spring-boot-starter-actuator starter 引入到 POM.xml 文件当中:

org.springframework.boot spring-boot-starter-actuator

SpringBoot Actuaor 可以使用 HTTP 或者 JMX endpoints来浏览操作信息。大多数应用程序都是用 HTTP,作为 endpoint 的标识以及使用 /actuator 前缀作为 URL路径。

这里有一些常用的内置 endpoints Actuator:

  • auditevents:查看 audit 事件信息
  • env:查看 环境变量
  • health:查看应用程序健康信息
  • httptrace:展示 HTTP 路径信息
  • info:展示 arbitrary 应用信息
  • metrics:展示 metrics 信息
  • loggers:显示并修改应用程序中日志器的配置
  • mappings:展示所有 @RequestMapping 路径信息
  • scheduledtasks:展示应用程序中的定时任务信息
  • threaddump:执行 Thread Dump

3. 总结

这篇文章我们讨论了一些关于 SpringBoot 的关键问题,这些问题可能会在你们的技术面试中遇到。我们希望这篇文章能够帮你找到理想的工作。

工作一到五年的程序员朋友面对目前的技术无从下手,感到很迷茫,高清思维导图及相关视频资料获取方式关注+转发+私信【资料】里面有阿里Java高级大牛直播讲解知识点,分享知识,课程内容都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

a394325af05abaab9ad3866d6e32c9a2.png
74b05941bcce617b4e65535e65f104bb.png
b193eea73a5c4959cd518f91f0aaeade.png
2567529597bb82bce8877fc53d108eb0.png
b17e328d434530b06ac6afce26552deb.png
4cd072f70a8d92b80ec81e343b2bf8a0.png
ef85a529fb2b8ea0dbf861bcc765df6e.png

相关文章:

  • springsecurity不拦截某个接口_Spring Security (一):Simple Demo
  • enityframework 已连接的当前状态为打开。_Http 持久连接与 HttpClient 连接池,有哪些不为人知的关系?...
  • 脚本录制软件python 按键精灵 tc_从10种脚相看你的财运
  • 用eviews计算产出弹性_深圳竞价优化|投放都和产出差不多了,还有人在投竞价...
  • qq登录界面句柄_天天玩QQ!知道登录界面那两个人是谁吗?网友:不是情侣?...
  • led数字字体_led显示屏知识大全
  • python设置单元格宽度_ms-word – Python-docx,如何在表中设置单元格宽度?
  • c++判断整数翻转溢出_CBC字节翻转攻击解析
  • python调用数据库存储过程_Mysql学习---使用Python执行存储过程
  • python实现中值滤波_Python 实现中值滤波、均值滤波
  • bigdecimal不保留小数_深入理解 BigDecimal
  • mysql 去重复查询_MySQL事务隔离级别和实现原理(看这一篇文章就够了!)
  • matlab追赶法解三对角方程组_高斯消元法解线性方程组
  • case when then else_第6章 函数、谓词、CASE表达式及练习题
  • git add 撤销_Git中的各种后悔药
  • Bytom交易说明(账户管理模式)
  • emacs初体验
  • exif信息对照
  • extjs4学习之配置
  • JavaScript设计模式与开发实践系列之策略模式
  • spring security oauth2 password授权模式
  • underscore源码剖析之整体架构
  • Vue全家桶实现一个Web App
  • 试着探索高并发下的系统架构面貌
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #include<初见C语言之指针(5)>
  • (1)bark-ml
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)windows配置JDK环境
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读30/100)Convolutional Pose Machines
  • (算法)N皇后问题
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)LINQ之路
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)Linux网络编程入门
  • 、写入Shellcode到注册表上线
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件—git忽略文件
  • .NET Micro Framework初体验
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net6+aspose.words导出word并转pdf
  • .net和php怎么连接,php和apache之间如何连接
  • .Net下的签名与混淆
  • .sys文件乱码_python vscode输出乱码
  • // an array of int