关于后端:面试题SpringBoot

33次阅读

共计 9626 个字符,预计需要花费 25 分钟才能阅读完成。

概述

说说 Spring Boot 和 Spring 的关系

spring boot 我了解就是把 spring spring mvc spring data jpa 等等的一些罕用的罕用的根底框架组合起来,提供默认的配置,而后提供可插拔的设计,就是各种 starter,来不便开发者应用这一系列的技术,套用官网的一句话,spring 家族倒退到明天,曾经很宏大了,作为一个开发者,如果想要应用 spring 家族一系列的技术,须要一个一个的搞配置,而后还有个版本兼容性问题,其实挺麻烦的,偶然也会有小坑呈现,其实蛮影响开发进度,spring boot 就是来解决这个问题,提供了一个解决方案吧,能够先不关怀如何配置,能够疾速的启动开发,进行业务逻辑编写,各种须要的技术,退出 starter 就配置好了,间接应用,能够说谋求开箱即用的成果吧.

如果说 Spring 是一个家族,其实就是;它蕴含 spring core, spring mvc,spring boot 与 spring Cloud 等等;

那 spring boot 就像是这个家族中的大管家

什么是 Spring Boot?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,次要是简化了应用 Spring 的难度,简省了沉重的配置,提供了各种启动器,开发者能疾速上手。

Spring Boot 有哪些长处?

Spring Boot 次要有如下长处:

  1. 容易上手,晋升开发效率,为 Spring 开发提供一个更快、更宽泛的入门体验。
  2. 开箱即用,远离繁琐的配置。
  3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、平安治理、运行数据监控、运行状况检查和内部化配置等。
  4. 没有代码生成,也不须要 XML 配置。
  5. 防止大量的 Maven 导入和各种版本抵触。

Spring Boot 的外围注解是哪个?它次要由哪几个注解组成的?

启动类下面的注解是 @SpringBootApplication,它也是 Spring Boot 的外围注解,次要组合蕴含了以下 3 个注解:

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

@EnableAutoConfiguration:关上主动配置的性能,也能够敞开某个主动配置的选项,如敞开数据源主动配置性能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})。

@ComponentScan:Spring 组件扫描。

说说 Spring Boot 启动原理

SpringBoot 将所有的常见开发性能,分成了一个个场景启动器(starter),这样咱们须要开发什么性能,就导入什么场景启动器依赖即可

配置

什么是 JavaConfig?

Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯 Java 办法。因而它有助于防止应用 XML 配置。应用 JavaConfig 的长处在于:

(1)面向对象的配置。因为配置被定义为 JavaConfig 中的类,因而用户能够充分利用 Java 中的面向对象性能。一个配置类能够继承另一个,重写它的 @Bean 办法等。

(2)缩小或打消 XML 配置。基于依赖注入准则的外化配置的益处已被证实。然而,许多开发人员不心愿在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 办法来配置与 XML 配置概念类似的 Spring 容器。从技术角度来讲,只应用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将 JavaConfig 与 XML 混合匹配是现实的。

(3)类型平安和重构敌对。JavaConfig 提供了一种类型平安的办法来配置 Spring 容器。因为 Java 5.0 对泛型的反对,当初能够按类型而不是按名称检索 bean,不须要任何强制转换或基于字符串的查找。

Spring Boot 主动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是主动配置的外围,

@EnableAutoConfiguration 给容器导入 META-INF/spring.factories 里定义的主动配置类。

筛选无效的主动配置类。

每一个主动配置类联合对应的 xxxProperties.java 读取配置文件进行主动配置性能

你如何了解 Spring Boot 配置加载程序?

在 Spring Boot 外面,能够应用以下几种形式来加载配置。

1)properties 文件;

2)YAML 文件;

3)零碎环境变量;

4)命令行参数;

等等……

什么是 YAML?

YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果咱们想要在配置文件中增加简单的属性,YAML 文件就更加结构化,而且更少混同。能够看出 YAML 具备分层配置数据。

YAML 配置的劣势在哪里 ?

YAML 当初能够算是十分风行的一种配置文件格式了,无论是前端还是后端,都能够见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些劣势呢?

  1. 配置有序,在一些非凡的场景下,配置有序很要害
  2. 反对数组,数组中的元素能够是根本数据类型也能够是对象
  3. 简洁

相比 properties 配置文件,YAML 还有一个毛病,就是不反对 @PropertySource 注解导入自定义的 YAML 配置。

Spring Boot 是否能够应用 XML 配置 ?

Spring Boot 举荐应用 Java 配置而非 XML 配置,然而 Spring Boot 中也能够应用 XML 配置,通过 @ImportResource 注解能够引入一个 XML 配置。

spring boot 外围配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,然而在联合 Spring Cloud 时,这个配置就会常常遇到了,特地是在须要加载一些近程配置文件的时侯。

spring boot 外围的两个配置文件:

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

什么是 Spring Profiles?

Spring Profiles 容许用户依据配置文件(dev,test,prod 等)来注册 bean。因而,当应用程序在开发中运行时,只有某些 bean 能够加载,而在 PRODUCTION 中,某些其余 bean 能够加载。假如咱们的要求是 Swagger 文档仅实用于 QA 环境,并且禁用所有其余文档。这能够应用配置文件来实现。Spring Boot 使得应用配置文件非常简单。

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

为了在自定义端口上运行 Spring Boot 应用程序,您能够在 application.properties 中指定端口。server.port = 8090

平安

如何实现 Spring Boot 应用程序的安全性?

为了实现 Spring Boot 的安全性,咱们应用 spring-boot-starter-security 依赖项,并且必须增加平安配置。它只须要很少的代码。配置类将必须扩大 WebSecurityConfigurerAdapter 并笼罩其办法。

比拟一下 Spring Security 和 Shiro 各自的优缺点 ?

因为 Spring Boot 官网提供了大量的十分不便的开箱即用的 Starter,包含 Spring Security 的 Starter,使得在 Spring Boot 中应用 Spring Security 变得更加容易,甚至只须要增加一个依赖就能够爱护所有的接口,所以,如果是 Spring Boot 我的项目,个别抉择 Spring Security。当然这只是一个倡议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,次要有如下一些特点:

  1. Spring Security 是一个重量级的平安治理框架;Shiro 则是一个轻量级的平安治理框架
  2. Spring Security 概念简单,配置繁琐;Shiro 概念简略、配置简略
  3. Spring Security 功能强大;Shiro 性能简略

Spring Boot 中如何解决跨域问题 ?

跨域能够在前端通过 JSONP 来解决,然而 JSONP 只能够发送 GET 申请,无奈发送其余类型的申请,在 RESTful 格调的利用中,就显得十分鸡肋,因而咱们举荐在后端通过(CORS,Cross-origin resource sharing)来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就能够通过 CORS 来解决跨域问题,只不过之前咱们是在 XML 文件中配置 CORS,当初能够通过实现 WebMvcConfigurer 接口而后重写 addCorsMappings 办法解决跨域问题。

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }

}
12345678910111213

我的项目中前后端拆散部署,所以须要解决跨域的问题。
咱们应用 cookie 寄存用户登录的信息,在 spring 拦截器进行权限管制,当权限不合乎时,间接返回给用户固定的 json 后果。
当用户登录当前,失常应用;当用户退出登录状态时或者 token 过期时,因为拦截器和跨域的程序有问题,呈现了跨域的景象。
咱们晓得一个 http 申请,先走 filter,达到 servlet 后才进行拦截器的解决,如果咱们把 cors 放在 filter 里,就能够优先于权限拦截器执行。

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

}
12345678910111213141516

什么是 CSRF 攻打?

CSRF 代表跨站申请伪造。这是一种攻打,迫使最终用户在以后通过身份验证的 Web 应用程序上执行不须要的操作。CSRF 攻打专门针对状态扭转申请,而不是数据窃取,因为攻击者无奈查看对伪造申请的响应。

监视器

Spring Boot 中的监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要性能之一。Spring boot 监视器可帮忙您拜访生产环境中正在运行的应用程序的以后状态。有几个指标必须在生产环境中进行检查和监控。即便一些内部应用程序可能正在应用这些服务来向相干人员触发警报音讯。监视器模块公开了一组可间接作为 HTTP URL 拜访的 REST 端点来查看状态。

如何在 Spring Boot 中禁用 Actuator 端点安全性?

默认状况下,所有敏感的 HTTP 端点都是平安的,只有具备 ACTUATOR 角色的用户能力拜访它们。安全性是应用规范的 HttpServletRequest.isUserInRole 办法施行的。咱们能够应用来禁用安全性。只有在执行机构端点在防火墙后拜访时,才倡议禁用安全性。

咱们如何监督所有 Spring Boot 微服务?

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取无关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否失常运行很有帮忙。然而,应用监视器的一个次要毛病或艰难是,咱们必须独自关上应用程序的知识点以理解其状态或健康状况。设想一下波及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮忙咱们解决这种状况,咱们将应用位于的开源我的项目。它建设在 Spring Boot Actuator 之上,它提供了一个 Web UI,使咱们可能可视化多个应用程序的度量。

整合第三方我的项目

什么是 WebSockets?

WebSocket 是一种计算机通信协议,通过单个 TCP 连贯提供全双工通信信道。

1、WebSocket 是双向的 - 应用 WebSocket 客户端或服务器能够发动音讯发送。

2、WebSocket 是全双工的 - 客户端和服务器通信是互相独立的。

3、单个 TCP 连贯 - 初始连贯应用 HTTP,而后将此连贯降级到基于套接字的连贯。而后这个繁多连贯用于所有将来的通信

4、Light - 与 http 相比,WebSocket 音讯数据交换要轻得多。

什么是 Spring Data ?

Spring Data 是 Spring 的一个子项目。用于简化数据库拜访,反对 NoSQL 和 关系数据存储。其次要指标是使数据库的拜访变得方便快捷。Spring Data 具备如下特点:

SpringData 我的项目反对 NoSQL 存储:

  1. MongoDB(文档数据库)
  2. Neo4j(图形数据库)
  3. Redis(键 / 值存储)
  4. Hbase(列族数据库)

SpringData 我的项目所反对的关系数据存储技术:

  1. JDBC
  2. JPA

Spring Data Jpa 致力于缩小数据拜访层 (DAO) 的开发量. 开发者惟一要做的,就是申明长久层的接口,其余都交给 Spring Data JPA 来帮你实现!Spring Data JPA 通过标准办法的名字,依据符合规范的名字来确定办法须要实现什么样的逻辑。

什么是 Spring Batch?

Spring Boot Batch 提供可重用的函数,这些函数在解决大量记录时十分重要,包含日志 / 跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和性能,通过优化和分区技术,能够实现极高批量和高性能批处理作业。简略以及简单的大批量批处理作业能够高度可扩大的形式利用框架解决重要大量的信息。

什么是 FreeMarker 模板?

FreeMarker 是一个基于 Java 的模板引擎,最后专一于应用 MVC 软件架构进行动静网页生成。应用 Freemarker 的次要长处是表示层和业务层的齐全拆散。程序员能够解决利用程序代码,而设计人员能够解决 html 页面设计。最初应用 freemarker 能够将这些联合起来,给出最终的输入页面。

如何集成 Spring Boot 和 ActiveMQ?

对于集成 Spring Boot 和 ActiveMQ,咱们应用依赖关系。它只须要很少的配置,并且不须要样板代码。

什么是 Apache Kafka?

Apache Kafka 是一个分布式公布 – 订阅音讯零碎。它是一个可扩大的,容错的公布 – 订阅音讯零碎,它使咱们可能构建分布式应用程序。这是一个 Apache 顶级我的项目。Kafka 适宜离线和在线音讯生产。

什么是 Swagger?你用 Spring Boot 实现了它吗?

Swagger 宽泛用于可视化 API,应用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化示意的工具,标准和残缺框架实现。它使文档可能以与服务器雷同的速度更新。当通过 Swagger 正确定义时,消费者能够应用最大量的实现逻辑来了解近程服务并与其进行交互。因而,Swagger 打消了调用服务时的猜想。

前后端拆散,如何保护接口文档 ?

前后端拆散开发日益风行,大部分状况下,咱们都是通过 Spring Boot 做前后端拆散开发,前后端拆散肯定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比拟笨的办法就是应用 word 或者 md 来保护接口文档,然而效率太低,接口一变,所有人手上的文档都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger,应用 Swagger 咱们能够疾速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师拜访这一个在线网站就能够获取到最新的接口文档,十分不便。

其余

如何从新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot 我的项目如何热部署?

这能够应用 DEV 工具来实现。通过这种依赖关系,您能够节俭任何更改,嵌入式 tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于进步开发人员的生产力。Java 开发人员面临的一个次要挑战是将文件更改主动部署到服务器并主动重启服务器。开发人员能够从新加载 Spring Boot 上的更改,而无需重新启动服务器。这将打消每次手动部署更改的须要。Spring Boot 在公布它的第一个版本时没有这个性能。这是开发人员最须要的性能。DevTools 模块齐全满足开发人员的需要。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
1234

您应用了哪些 starter maven 依赖项?

应用了上面的一些依赖项

spring-boot-starter-activemq

spring-boot-starter-security

这有助于减少更少的依赖关系,并缩小版本的抵触。

Spring Boot 中的 starter 到底是什么 ?

首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有性能来实现的。首先它提供了一个自动化配置类,个别命名为 XXXAutoConfiguration,在这个配置类中通过条件注解来决定一个配置是否失效(条件注解就是 Spring 中本来就有的),而后它还会提供一系列的默认配置,也容许开发者依据理论状况自定义相干配置,而后通过类型平安的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,咱们只须要引入依赖就能够间接应用了。当然,开发者也能够自定义 Starter

spring-boot-starter-parent 有什么用 ?

咱们都晓得,新创建一个 Spring Boot 我的项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent,spring-boot-starter-parent 次要有如下作用:

  1. 定义了 Java 编译版本为 1.8。
  2. 应用 UTF-8 格局编码。
  3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以咱们在写依赖时才不须要写版本号。
  4. 执行打包操作的配置。
  5. 自动化的资源过滤。
  6. 自动化的插件配置。
  7. 针对 application.properties 和 application.yml 的资源过滤,包含通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

Spring Boot 打成的 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,一个可执行,一个可援用。

运行 Spring Boot 有哪几种形式?

1)打包用命令或者放到容器中运行

2)用 Maven/ Gradle 插件运行

3)间接执行 main 办法运行

Spring Boot 须要独立的容器运行吗?

能够不须要,内置了 Tomcat/ Jetty 等容器。

开启 Spring Boot 个性有哪几种形式?

1)继承 spring-boot-starter-parent 我的项目

2)导入 spring-boot-dependencies 我的项目依赖

如何应用 Spring Boot 实现异样解决?

Spring 提供了一种应用 ControllerAdvice 解决异样的十分有用的办法。咱们通过实现一个 ControlerAdvice 类,来解决控制器类抛出的所有异样。

如何应用 Spring Boot 实现分页和排序?

应用 Spring Boot 实现分页非常简单。应用 Spring Data-JPA 能够实现将可分页的传递给存储库办法。

微服务中如何实现 session 共享 ?

在微服务中,一个残缺的我的项目被拆分成多个不雷同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,然而常常,咱们须要在不同微服务之间共享 session,常见的计划就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 对立保留在 Redis 上,当各个微服务对 session 有相干的读写操作时,都去操作 Redis 上的 session。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是通明的,十分简便。

Spring Boot 中如何实现定时工作 ?

定时工作也是一个常见的需要,Spring Boot 中对于定时工作的反对次要还是来自 Spring 框架。

在 Spring Boot 中应用定时工作次要有两种不同的形式,一个就是应用 Spring 中的 @Scheduled 注解,另一个则是应用第三方框架 Quartz。

应用 Spring 中的 @Scheduled 的形式次要通过 @Scheduled 注解来实现。

应用 Quartz,则依照 Quartz 的形式,定义 Job 和 Trigger 即可。

本文由 mdnice 多平台公布

正文完
 0