Spring Boot2.x 面试题(2020.9月版)

文章目录

一. 基本概念

1.1 什么是 Spring Boot?

Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架

1.2 SpringBoot四个主要特性?

  • SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;

  • 自动配置:SpringBoot的自动配置特性利用了Spring4对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;

  • 命令行接口:(Command-line-interface, CLI):SpringBoot的CLI发挥了Groovy编程语言的优势,并结合自动配置进一步简化Spring应用的开发;

  • Actuatir:它为SpringBoot应用的所有特性构建一个小型的应用程序。但首先,我们快速了解每项特性,更好的体验他们如何简化Spring编程模型。

1.3 SpringBoot 有什么优点?

  • 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
  • 开箱即用,远离繁琐的配置。
  • 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
  • 没有代码生成,也不需要XML配置。
  • 避免大量的 Maven 导入和各种版本冲突。

1.4 Spring Boot的缺点?

Spring Boot虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。

1.5 Spring Boot 的核心注解是什么?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

  • @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

  • @ComponentScan:Spring组件扫描。

学习Spring Boot 注解,这一篇就够了

1.6 Spring Boot 自动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。筛选有效的自动配置类。
每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

1. 7 你如何理解 Spring Boot 配置加载顺序?

在 Spring Boot 里面,可以使用以下几种方式来加载配置。本章内容基于 Spring Boot 2.0 进行详解。

1、properties文件;

2、YAML文件;

3、系统环境变量;

4、命令行参数;

等等……

我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:

1、使用 @Value注解直接注入对应的值,这能获取到 Spring 中 Environment 的值;

2、使用 @ConfigurationProperties 注解把对应的值绑定到一个对象;

3、直接获取注入 Environment 进行获取;

配置属性的方式很多,Spring boot使用了一种独有的PropertySource可以很方便的覆盖属性的值。

配置属性加载的顺序如下:


1、开发者工具 `Devtools` 全局配置参数;

2、单元测试上的 `@TestPropertySource` 注解指定的参数;

3、单元测试上的 `@SpringBootTest` 注解指定的参数;

4、命令行指定的参数,如 `java -jar springboot.jar --name="Java技术栈"`;

5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定参数, 如 `java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar`

6、`ServletConfig` 初始化参数;

7、`ServletContext` 初始化参数;

8、JNDI参数(如 `java:comp/env/spring.application.json`);

9、Java系统参数(来源:`System.getProperties()`);

10、操作系统环境变量参数;

11、`RandomValuePropertySource` 随机数,仅匹配:`ramdom.*`;

12、JAR包外面的配置文件参数(`application-{profile}.properties(YAML)`)

13、JAR包里面的配置文件参数(`application-{profile}.properties(YAML)`)

14、JAR包外面的配置文件参数(`application.properties(YAML)`)

15、JAR包里面的配置文件参数(`application.properties(YAML)`)

16、`@Configuration`配置文件上 `@PropertySource` 注解加载的参数;

17、默认参数(通过 `SpringApplication.setDefaultProperties` 指定);

1. 8 什么是 YAML 文件?

YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

1.8.1 YAML 适用的场景?

  • 脚本语言:由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,Go 。除了Java 和 Go,其他都是脚本语言
  • 序列化:YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
  • 配置文件:YAML做配置文件也不错。写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事。由于兼容性问题,不同语言间的数据流转建议不要用YAML

1.8.2 YAML 配置的优势在哪里?

YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?

  • 配置有序,在一些特殊的场景下,配置有序很关键
  • 支持数组,数组中的元素可以是基本数据类型也可以是对象
  • 简洁

1. 9 Spring Boot 是否可以使用 XML 配置?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

1. 10 spring boot 核心配置文件是什么?

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

1. 10.1 bootstrap.properties 和 application.properties 有何区别 ?

spring boot 核心的两个配置文件:

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
  • application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

1. 11 什么是 Spring Profiles?(springboot项目的开发环境,生产环境配置该如何实现切换?)

Spring Profiles允许用户根据配置文件(dev,test,prod等)来注册bean。因此,当应用程序在开发中运行时,

只有某些bean可以加载,而在PRODUCTION中,某些其他bean可以加载。假设我们的要求是Swagger文档仅适用于QA环境,

并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot使得使用配置文件非常简单。

1. 12 如何在自定义端口上运行 Spring Boot 应用程序?

application.properties 中指定端口

server.port = 8090

1. 13 什么是 Spring Boot Stater ?

启动器是一套方便的依赖描述符,它可以放在自己的程序中。你可以一站式的获取你所需要的 Spring 和相关技术,而不需要到处找示例代码和依赖包。

例如,如果你想使用 Sping 和 JPA 访问数据库,只需要你的项目包含 spring-boot-starter-data-jpa依赖项,你就可以完美进行。

实现原理点击这里

1. 14 Spring Boot 还提供了其它的哪些 Starter Project Options?

  • spring-boot-starter-web-services - SOAP Web Services;

  • spring-boot-starter-web - Web 和 RESTful 应用程序;

  • spring-boot-starter-test - 单元测试和集成测试;

  • spring-boot-starter-jdbc - 传统的 JDBC;

  • spring-boot-starter-hateoas - 为服务添加 HATEOAS 功能;

  • spring-boot-starter-security - 使用 SpringSecurity 进行身份验证和授权;

  • spring-boot-starter-data-jpa - 带有 Hibeernate 的 Spring Data JPA;

  • spring-boot-starter-data-rest - 使用 Spring Data REST 公布简单的 REST 服务;

1. 15 Spring Boot 有哪几种读取配置的方式?

  • @PropertySource
  • @Value
  • @Environment
  • @ConfigurationProperties
    通过以上四种方式来绑定变量。

1. 16 需要加载外部配置文件中的自定义属性,该如何实现?

需求一批量加载多个属性.

步骤一: 首先需要自定义外部配置文件和其中的自定义属性:
user.properties . 存放在resources目录下:
内部:
#自定义配置其他属性:

user.username=zhangsan
user.age=20

步骤二: 加载属性到程序中:
springboot 1.5版本以及之前采用:br/>

@ConfigurationProperties(prefix="user",locations={"classpath:user.propeties"})
public class User {
	private String username;
	private Integer age;
	get/set封装省略....
}

springboot 1.5版本以后采用如下:

@PropertySource(value ="classpath:user.properties")
@ConfigurationProperties(prefix = "user")
@Component
public class User {
	private String username;
	private Integer age;
	get/set封装省略....
}

步骤三:
以上配置需要在main启动函数类文件上激活配置: 新版本中默认开启.
@EnableConfigurationProperties

需求二:如果加载单个属性:
步骤一:省略.如上.
步骤二:

@Value("${name}")
private String name;.

备注:以上外部文件属性加载.切记注意中文乱码问题.

1. 17 springboot怎么引用jar外部配置文件?

1.17.1 设置环境变量

首先设置我们的发布工程目录的环境变量为:PROJECT_HOME,目录为:/home/ies/prohome
比如我们的配置文件放在 $PROJECT_HOME/config目录下,名为:common.config

#redis配置
redis-ip: 192.168.22.100
redis-port: 6379
redis-maxTotal: 1000
redis-maxIdle: 1000
redis-maxWaitMillis: 10000
redis-expire-minite:1440

我们配置了redis的常用参数。

1.17.2 启动类中添加文件引入

@PropertySource(value = {"file:${PROJECT_HOME}/config/common.properties"})
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

在springboot的主类中增加如上代码。

1.17.3 配置文件中使用变量

jedis:
  pool:
    host: ${redis-ip}
    port: ${redis-port}
    config:
      maxTotal: ${redis-maxTotal}
      maxIdle: ${redis-maxIdle}
      maxWaitMillis: ${redis-maxWaitMillis}

这样在修改相关配置时,直接修改common.properties文件即可,不要重新打jar包。

1. 18 springboot支持的默认日志框架有哪些.可以进行哪些设置.

spring-boot: 默认采用Logback作为日志框架.
配置即可:

logging.file=d:/test/log.log
logging.level.org.springframework.web=DEBUG
#logging.config=classpath:logback.xml 加载单独的日志配置文件.

1.19 如何使用Spring Boot实现异常处理?

Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice类,来处理控制器类抛出的所有异常。

1.20 SpringBoot 实现热部署有哪几种方式?

  • Spring Loaded
  • Spring-boot-devtools

1.21 Spring Boot 可以兼容老 Spring 项目吗,如何做?

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

二. 组件集成

2.1 什么是Swagger?您是否使用Spring Boot实现了它?

Swagger被广泛用于可视化api,Swagger UI为前端开发人员提供在线沙箱环境。在本教程中,我们将使用Swagger2规范的Springfox实现。Swagger是一种工具、规范和完整的框架实现,用于生成RESTful Web服务的可视化表示。它允许文档以与服务器相同的速度更新。当通过Swagger正确定义时,使用者可以用最少的实现逻辑理解远程服务并与之交互。因此Swagger消除了调用服务时的猜测。

2.2 什么是Spring Boot Batch?如何使用Spring Boot实现它?

Spring Boot Batch提供了处理大量记录所必需的可重用功能,包括日志/跟踪、事务管理、作业处理统计信息、作业重启、作业跳过和资源管理。它还提供了更高级的技术服务和特性,通过优化和分区技术,这些特性将支持极高容量和高性能的批处理作业。无论是简单的还是复杂的,大容量批处理作业都可以以高度可伸缩的方式利用该框架来处理大量信息

2.3 什么是缓存?您在Spring引导中使用过缓存框架吗?

缓存是本地内存的一个区域,它保存了频繁访问的数据的副本,否则获取或计算这些数据将非常昂贵。使用redis进行缓存

2.4 如何用Spring Boot实现拦截器?拦截器和过滤器有什么区别呢?

详情

2.5 您使用过哪些启动器maven依赖项?

使用过不同的starter依赖项,如spring-boot-starter-activemq依赖项、spring-boot-starter-security依赖项、spring-boot-starter-web依赖项。

2.6 你什么时候使用WebSockets?如何使用Spring Boot实现它?

WebSocket是双向的——使用WebSocket客户端或服务器都可以发起发送消息。WebSocket是全双工的——客户端和服务器之间的通信是相互独立的。单个TCP连接——初始连接使用HTTP,然后将此连接升级为基于套接字的连接。然后,这个单一连接将用于未来的所有通信轻- WebSocket消息数据交换比http轻得多。

2.7 Sprint boot怎么设置外部静态资源映射

创建类WebMvcConfigurer,实现WebMvcConfigurer接口类进行实现,代码如下:

@Configuration
public class WebMvcConfigurer implements WebMvcConfigurer {
    //配置文件路径
    @Value("${file.uploadFolder}")
    private String uploadFolder;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //默认的资源映射需要填写,不然不能正常访问
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        //配置外部资源目录的映射,/image目录为前端访问的路径,后面配置静态资源的绝对路径
        registry.addResourceHandler("/image/**").addResourceLocations("file:"+uploadFolder);
    }
}

2.8 Sprint boot怎么设置跨域访问?顺序问题

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
    /**
     * 跨域访问配置接口
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .allowCredentials(true)
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

2.9 Spring Boot2.x :怎么集成kafka

Spring Boot2.x 怎么集成kafka

2.10 Spring Boot2.x:集成 Shiro 权限框架

Spring Boot2.x 集成 Shiro 权限框架

2.11 Spring Boot2.x:怎么自定义Starter

Spring Boot2.x 自定义Starter实例讲解

2.12 Spring Boot2.x:怎么实现定时任务

Spring Boot2.x:实现定时任务的多种方式

2.13 Spring Boot2.x:什么是监听器,有什么使用场景?

Spring Boot2.x:监听器使用及场景介绍

2.14 Spring Boot2.x:的切面编程有哪些实例场景

Spring Boot2.x 中的切面编程,实例场景讲解

2.15 Spring boot2.x:WebMvcConfigurationSupport 重要接口的应用场景详解

WebMvcConfigurationSupport 重要接口的应用场景详解

2.16 Spring Boot2.x:集成spring-boot-starter-test进行单元测试

Spring Boot集成spring-boot-starter-test进行单元测试

2.17 Springboot2.x:怎么使用@Slf4j注解简化日志代码

Springboot怎么使用@Slf4j注解简化日志代码

2.18 Springboot2.x:集成Dubbo

Spring Boot2.x 集成Dubbo实例讲解

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值