Spring Boot一直是Spring生态系统的关键参与者。该项目通过其自动配置功能使我们的生活更加轻松。在本教程中,我们将介绍在求职面试中可能出现的一些与Spring Boot相关的最常见问题。

Spring和Spring Boot有什么区别?

Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入,数据绑定,面向方面的编程,数据访问等等。

多年来,Spring变得越来越复杂,这种应用程序所需的配置量可能会令人生畏。这就是Spring Boot派上用场的地方 - 它使配置Spring应用程序变得轻而易举。

从本质上讲,虽然Spring是不受欢迎的,但Spring Boot对平台和库有了自己的看法,让我们快速入门。

以下是Spring Boot带来的两个最重要的好处:

  • 根据在类路径中找到的工件自动配置应用程序
  • 提供生产中应用程序通用的非功能性功能,例如安全性或健康检查

我们如何使用Maven设置Spring Boot应用程序?

我们可以像在任何其他库中一样在Maven项目中包含Spring Boot。但是,最好的方法是从spring-boot-starter-parent项目继承并声明对Spring Boot启动器的依赖。这样做可以让我们的项目重用Spring Boot的默认设置。

继承spring-boot-starter-parent项目非常简单 - 我们只需要在pom.xml中指定一个父元素:

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.1.1.RELEASE</version>

</parent>

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

使用启动父项目很方便,但并不总是可行。例如,如果我们公司要求所有项目都从标准POM继承,我们就不能依赖Spring Boot的启动父级。

在这种情况下,我们仍然可以通过此POM元素获得依赖关系管理的好处:

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-dependencies</artifactId>

            <version>2.1.1.RELEASE</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

有什么Spring Boot启动器可供选择吗?

依赖管理是任何项目的关键方面。当项目足够复杂时,管理依赖项可能会变成一场噩梦,因为涉及的工件太多了。

这是Spring Boot入门者派上用场的地方。每个入门者都可以作为我们所需的所有Spring技术的一站式服务。然后,以一致的方式传递和管理其他所需的依赖关系。

所有启动器都在org.springframework.boot组下,其名称以spring-boot-starter-开头 。这种命名模式使您可以轻松找到启动器,尤其是在使用支持按名称搜索依赖关系的IDE时。

在撰写本文时,我们有超过50个启动器。最常用的是:

  • spring-boot-starter: 核心启动器,包括自动配置支持,日志记录和YAML
  • spring-boot-starter-aop: 使用Spring AOP和AspectJ进行面向方面编程的启动器
  • spring-boot-starter-data-jpa: 使用Spring Data JPA和Hibernate的启动器
  • spring-boot-starter-jdbc: 用于将JDBC与HikariCP连接池一起使用的启动器
  • spring-boot-starter-security: 使用Spring Security的启动器
  • spring-boot-starter-test: 用于测试Spring Boot应用程序的启动器
  • spring-boot-starter-web: 用于构建Web的入门者,包括使用Spring MVC的RESTful应用程序

如何禁用特定的自动配置?

如果我们要禁用特定的自动配置,我们可以使用@EnableAutoConfiguration批注的exclude属性来指示它

// 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

如何注册自定义自动配置?

要注册自动配置类,我们必须在META-INF / spring.factories文件中的EnableAutoConfiguration键下列出其完全限定名称:

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

如果我们使用Maven构建一个项目,那么该文件应放在resources / META-INF目录中,该目录将在程序打包阶段找到该文件。

如何告诉自动配置在bean已经存在情况下退回?

要指示自动配置类在bean已经存在时退出,我们可以使用 @ConditionalOnMissingBean批注。此注释的最显着属性是:

  • value:要检查的bean类型
  • name:要检查的bean的名称

放置在使用@Bean装饰的方法上时,目标类型默认为方法的返回类型:

@Configuration

public class CustomConfiguration {

    @Bean

    @ConditionalOnMissingBean

    public CustomService service() { ... }

}

如何将Spring Boot Web应用程序部署为JAR和WAR文件?

传统上,我们将Web应用程序打包为WAR文件,然后将其部署到外部服务器中。这样做可以让我们在同一台服务器上安排多个应用程序。在CPU和内存稀缺的时候,这是节省资源的好方法。

但事情发生了变化。计算机硬件现在相当便宜,而且注意力转向服务器配置。在部署期间配置服务器的一个小错误可能会导致灾难性后果。

Spring通过提供一个插件即spring-boot-maven-plugin来解决这个问题,将Web应用程序打包为可执行的JAR。要包含此插件,只需向pom.xml添加一个插件元素:

<plugin>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

有了这个插件,我们将在执行打包阶段后生成一个胖JAR 。此JAR包含所有必需的依赖项,包括嵌入式服务器。因此,我们不再需要担心配置外部服务器。

然后我们就像普通的可执行JAR一样运行应用程序。

请注意,必须将pom.xml文件中的packaging元素设置为 jar 才能构建JAR文件:

<packaging>jar</packaging>

执行Maven 打包阶段后,我们将拥有一个可部署的WAR文件。

如何将Spring Boot用于命令行应用程序?

与任何其他Java程序一样,Spring Boot命令行应用程序必须具有 main方法。此方法用作入口点,它调用SpringApplication#run方法来引导应用程序:

@SpringBootApplication

public class MyApplication {

    public static void main(String[] args) {

        SpringApplication.run(MyApplication.class);

        // other statements

    }

}

然后SpringApplication类启动一个Spring容器并自动配置bean。

请注意,我们必须将配置类传递给run方法才能用作主要配置源。按照惯例,这个参数是入门类本身。

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

有哪些可能的外部配置源?

Spring Boot支持外部配置,允许我们在各种环境中运行相同的应用程序。我们可以使用属性文件,YAML文件,环境变量,系统属性和命令行选项参数来指定配置属性。

然后,我们可以访问使用这些属性@Value注释,经由绑定对象 的@ConfigurationProperties注释,或环境抽象。

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

  • 命令行属性:命令行选项参数是以双连字符开头的程序参数,例如-server.port = 8080。Spring Boot将所有参数转换为属性,并将它们添加到环境属性集中。
  • 应用程序属性:应用程序属性是从application.properties文件或其YAML对应文件加载的属性。默认情况下,Spring Boot会在当前目录,类路径根或其config子目录中搜索此文件。
  • 特定于配置文件的属性:特定于配置文件的属性从application- {profile} .properties文件或其YAML对应文件加载。{profile}是指激活的Profile名称。这些文件与非特定属性文件位于相同位置,并且优先于非特定属性文件。

Spring Boot支持轻松绑定是什么意思?

Spring Boot中的轻松绑定适用于配置属性的类型安全绑定。

使用宽松绑定时,环境属性的键不需要与属性名称完全匹配。这样的环境属性可以用驼峰camelCase,kebab-case,snake_case或大写字母写成,单词用下划线分隔。

例如,如果具有@ConfigurationProperties批注的bean类中的属性名为myProp,则可以将其绑定到以下任何环境属性:myProp,my-prop,my_prop或MY_PROP。

什么是Spring Boot DevTools?

Spring Boot Developer Tools或DevTools是一组工具,使开发过程更容易。要包含这些开发时功能,我们只需要在pom.xml文件中添加依赖项:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-devtools</artifactId>

</dependency>

在生产运行模块,Spring Boot devtools将自动禁用。默认情况下,重新打包存档也会排除此模块。因此,它不会给我们的最终产品带来任何开销。

默认情况下,DevTools应用适合开发环境的属性。这些属性禁用模板缓存,为Web组启用调试日志记录,等等。因此,我们拥有这种合理的开发时配置,而无需设置任何属性。

只要类路径上的文件发生更改,使用DevTools的应用程序就会重新启动。这是开发中非常有用的功能,因为它可以快速反馈修改。

默认情况下,静态资源(包括视图模板)不会启动重新启动。相反,资源更改会触发浏览器刷新。请注意,只有在浏览器中安装LiveReload扩展以与DevTools包含的嵌入式LiveReload服务器进行交互时,才会发生这种情况。

Idea中要通过运行配置进行专门配置。

如何编写集成测试?

在为Spring应用程序运行集成测试时,我们必须有一个ApplicationContext。

为了让我们的生活更轻松,Spring Boot为测试提供了一个特殊的注释 - @SpringBootTest。此批注从其classes属性指示的配置类创建ApplicationContext。

如果未设置classes属性,Spring Boot将搜索主配置类。搜索从包含测试的包开始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注释的类。

请注意,如果我们使用JUnit 4,我们必须使用@RunWith(SpringRunner.class)修饰测试类。

什么是Spring Boot Actuator

从本质上讲,Actuator通过支持生产就绪功能,将Spring Boot应用程序变为现实。这些功能使我们能够在生产中运行时监控和管理应用程序。

将Spring Boot Actuator集成到一个项目中非常简单。我们需要做的就是在pom.xml文件中包含 spring-boot-starter-actuator starter :

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

Spring Boot Actuator可以使用HTTP或JMX端点公开操作信息。但是,大多数应用程序都使用HTTP,其中端点的标识和/执行器前缀形成URL路径。

以下是Actuator提供的一些最常见的内置端点:

  • auditevents: 公开审计事件信息
  • env: 公开环境属性
  • health: 显示应用程序运行状况信息
  • httptrace: 显示HTTP跟踪信息
  • info: 显示任意应用程序信息
  • metrics: 显示指标信息
  • loggers: 显示和修改应用程序中记录器的配置
  • mappings: 显示所有@RequestMapping路径的列表
  • scheduledtasks: 显示应用程序中的计划任务
  • threaddump: 执行线程转储

​​​​​​​本教程介绍了您在技术面试中可能遇到的一些关于Spring Boot的最关键问题。我们希望他们能帮助您找到理想的工作。

作者:Java高级架构狮
链接:https://www.jianshu.com/p/0b36d8e48c8f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

 

 

 

2019阿里P7最新总结Spring Boot面试问题的更多相关文章

  1. Spring Boot 面试的十个问题

    用下面这些常见的面试问题为下一次 Spring Boot 面试做准备. 在本文中,我们将讨论 Spring boot 中最常见的10个面试问题.现在,在就业市场上,这些问题有点棘手,而且趋势日益严重. ...

  2. Spring Boot 面试,一个问题就干趴下了!(下)

    前些天栈长在Java技术栈微信公众号分享一篇文章:Spring Boot 面试,一个问题就干趴下了!,看到大家的留言很精彩,特别是说"约定大于配置"的这两个玩家. 哈哈,上墙的朋友 ...

  3. 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    Spring Boot 面试题 1.什么是 Spring Boot? 2.Spring Boot 有哪些优点? 3.什么是 JavaConfig? 4.如何重新加载 Spring Boot 上的更改, ...

  4. Spring Boot 面试,一个问题就干趴下了!

    最近栈长面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了! 这是 ...

  5. 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)

    一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...

  6. Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)

    最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...

  7. Spring Boot 面试总结(一)

    1.使用 Spring Boot 前景? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用 ...

  8. 2020最新的Spring Boot 分布式锁的具体实现(内附代码)

    前言 面试总是会被问到有没有用过分布式锁.redis 锁,大部分读者平时很少接触到,所以只能很无奈的回答 "没有".本文通过 Spring Boot 整合 redisson 来实现 ...

  9. Spring Boot面试杀手锏————自动配置原理

    转:https://blog.csdn.net/u014745069/article/details/83820511 引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技 ...

随机推荐

  1. vue element-ui 2.3.4版本 input number值为0时 显示不出来

    解决:官方修复了这个bug.升级element-ui为2.3.5版本就好了

  2. ArcGIS 网络分析[1] 利用自定义点线数据(shp或数据库)创建网络数据集【小白向】

    前言 似乎除了官方介绍的例子,我还没有在网上见过一篇介绍如何“使用自己的数据”创建“网络数据集”的文章. 究其原因,是因为当前的高质量的线数据或保密,或采集困难. 有介绍几何网络的,有介绍如何用官方S ...

  3. arcgis api 3.x for js 共享干货系列之二自定义 Navigation 控件样式风格(附源码下载)

    0.内容概览 自定义 Navigation 控件样式风格 源码下载 1.内容讲解 arcgis api 3.x for js 默认的Navigation控件样式风格如下图:这样的风格不能说不好,各有各 ...

  4. 《Pro Asp.net core mvc 2》bower问题

    在阅读<Pro Asp.net core mvc 2>中有使用bower管理包,可能是由于vs2017或者bootstrap什么地方改变了,按照步骤进行操作,完全没有对应的样式出现.开始以 ...

  5. 在android studio中配置运行时签名

    做项目的时候,有时需要用到第三方接口,而基本第三方接口都是要求我们要先进行签名.结果每次调试都得手动进行签名一次,实在麻烦.所以android studio提供了一种在运行的时候自动进行签名的方法,在 ...

  6. vue父子组件之间传值

    vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...

  7. spring学习总结——装配Bean学习三(xml装配bean)

    通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...

  8. MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

      关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别 ...

  9. centos下Django+uwsgi+nginx

    本篇章主要讲解uwsgi和nginx的作用,并利用两者对django项目进行部署 一.概述 在开发过程中,我们一般是在该项目的虚拟环境中启用django自带的web服务:python manage.p ...

  10. 用一条SQL语句显示所有可能的比赛组合

    一个叫team的表,里面只有一个字段name,一共有4 条纪录,分别是a.b.c.d,对应四个球队,现在四个球队进行比赛,用一条SQL语句显示所有可能的比赛组合. select * from team ...