java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」

java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」1.什么是SpringBoot?SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。2.SpringBoot有哪些优点?SpringBoot主要有如下优点:容易上手,提升开发效率,为Spring开发提供一个更快、更广泛的入门体验。开箱即用,远离繁琐的配置。提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」

推荐文章:

最新java开发面试笔试题及答案—图片(面试题系列持续更新中)(1)_南北极之间的博客-CSDN博客JAVAEE工程师笔试题答题人1.你最常上的,一一术站和最常使用的两个P分别是什么?主要解决你什么需求?2请简述http协议中get请求和post请求的区别,3.请简述session和cookie的区别.4简述Servlet与sP的关系,5.SP内置对象有哪些,各自起到的作用6.简述你所理解的AVA封装、继承、多态7写出2个常用的设计模式(伪代码),并简述应用场景。8.HashMap和HashTable区别.9.HashSet和TreeSet的区别.l0.ArrayLisjava经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」https://blog.csdn.net/qq_22182989/article/details/125042862

给大家推荐一个程序员开发利器:给大家推荐一个让你觉得相见恨晚的工具——utools

可以随意取色!识别图中的所有文字。还能翻译哦!

java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」

可以看看使用教程:

utools快速上手心得、给你安利一款国产良心软件uTools工具–uTools 新一代效率工具平台:怎样安装和使用?详细方法?打工人必看、高效工作、提高效率、提高生产力_南北极之间的博客-CSDN博客utools快速上手心得、给你安利一款国产良心软件uTools工具!uTools 新一代效率工具平台:怎样安装和使用?详细方法?打工人必看!高效工作!提高效率!提高生产力!java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」https://blog.csdn.net/qq_22182989/article/details/124897267

1.什么是 Spring Boot?

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

2.Spring Boot 有哪些优点?

Spring Boot 主要有如下优点:

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

3.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

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

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

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

@ComponentScan:Spring组件扫描。

 
4.什么是 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,不需要任何强制转换或基于字符串的查找。

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

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,

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

筛选有效的自动配置类。

每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

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

在 Spring Boot 里面,可以使用以下几种方式来加载配置。

1)properties文件;

2)YAML文件;

3)系统环境变量;

4)命令行参数;

等等……

7.什么是 YAML?

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

8.YAML 配置的优势在哪里 ?

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

配置有序,在一些特殊的场景下,配置有序很关键
支持数组,数组中的元素可以是基本数据类型也可以是对象
简洁
相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。

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

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

10.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 项目的自动化配置。

11.什么是 Spring Profiles?

Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

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

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

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

为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。

14.比较一下 Spring Security 和 Shiro 各自的优缺点 ?

由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,主要有如下一些特点:

Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
Spring Security 功能强大;Shiro 功能简单

15.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);
    }

}

项目中前后端分离部署,所以需要解决跨域的问题。
我们使用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);
    }

}

16.什么是 CSRF 攻击?

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

17.Spring Boot 中的监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。

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

默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访问它们。安全性是使用标准的 HttpServletRequest.isUserInRole 方法实施的。 我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

19.我们如何监视所有 Spring Boot 微服务?

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。

20.什么是 WebSockets?

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

1、WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送。

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

3、单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信

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

21.什么是 Spring Data ?

Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:

SpringData 项目支持 NoSQL 存储:

MongoDB (文档数据库)
Neo4j(图形数据库)
Redis(键/值存储)
Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:

JDBC
JPA
Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。

22.什么是 Spring Batch?

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

在Spring启动中实现Spring批处理的方法是什么?

回答: 
批处理涉及大量的数据记录处理。 Spring启动批处理提供了一个可以重用的功能,对于进行批处理至关重要。 它还提供服务和功能,有助于优化和分区技术,从而实现高容量和高性能的批处理作业。

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-batch</artifactId> 
    <optional>true</optional> 
</dependency>

POM文件中的上述更改将包括应用程序中必需的包,这些包是在spring boot项目中执行批处理所必需的。

让我们转到下一个Spring Boot Interview Questions

23.什么是 FreeMarker 模板?

FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面。

24.如何集成 Spring Boot 和 ActiveMQ?

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

25.什么是 Apache Kafka?

Apache Kafka 是一个分布式发布 – 订阅消息系统。它是一个可扩展的,容错的发布 – 订阅消息系统,它使我们能够构建分布式应用程序。这是一个 Apache 顶级项目。Kafka 适合离线和在线消息消费。

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

Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

27.前后端分离,如何维护接口文档 ?

前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用 word 或者 md 来维护接口文档,但是效率太低,接口一变,所有人手上的文档都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。

28.如何重新加载 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>

没有服务器重启的情况下,在Spring启动时重新加载更改的方法是什么?

回答: 
如果没有使用开发工具启动服务器,则会在spring boot中重新加载任何更改。

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

Spring引导提供了名为DevTools的模块,可以提高Spring引导开发人员的工作效率。 它可以自动重新启动服务器,从而将更改自动部署到服务器。 这是常见的春季采访问题在采访中提出的问题。 因此,开发人员可以在Spring启动时重新加载他的更改,而无需重新启动服务器。 此程序包仅在开发模式下提供,但不在生产模式下提供。

如果应用程序在生产中运行,则会自动禁用spring-boot-devtools模块。 默认情况下,重新打包存档也会排除此模块。 因此,它不会给我们的最终产品带来任何开销。

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

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

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

有关此主题的更多信息,请参阅Spring Boot DevTools概述 。

29.您使用了哪些 starter maven 依赖项?

使用了下面的一些依赖项

spring-boot-starter-activemq

spring-boot-starter-security

这有助于增加更少的依赖关系,并减少版本的冲突。

30.Spring Boot 中的 starter 到底是什么 ?

首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter

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

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

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

32.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 ,一个可执行,一个可引用。

33.运行 Spring Boot 有哪几种方式?

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

2)用 Maven/ Gradle 插件运行

3)直接执行 main 方法运行

34.Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

35.开启 Spring Boot 特性有哪几种方式?

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

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

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

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

37.如何使用 Spring Boot 实现分页和排序?

使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的传递给存储库方法。

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

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

39.Spring Boot 中如何实现定时任务 ?

定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。

在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。

使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。

使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

======================================分界线
参考:Spring Boot Interview Questions – Spring Boot Tutorial

主要是收藏的这个网站,下面的内容。只是提示作用。强行翻译的效果有点差 

Spring Boot是微服务的最佳Java框架。 我们建议您成为Spring Boot的专家!

40.Spring Boot vs Spring MVC vs Spring – 他们如何比较?

Spring框架

Spring Framework最重要的特性是依赖注入。 所有Spring模块的核心是依赖注入或IOC控制反转。

正确使用DI或IOC时,我们可以开发松散耦合的应用程序。 松散耦合的应用程序可以轻松进行单元测试。

Spring MVC

Spring MVC Framework提供了开发Web应用程序的分离方式。 使用Dispatcher Servlet,ModelAndView和View Resolver等简单概念,可以轻松开发Web应用程序。

spring启动

Spring和Spring MVC的问题是需要的配置量。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix"> <value>/WEB-INF/views/</value> </property> 
	<property name="suffix"> <value>.jsp</value> </property> 
</bean>
<mvc:resources mapping="/webjars/**" location="/webjars/"/> 

Spring Boot通过自动配置和入门项目的组合解决了这个问题。 Spring Boot还提供了一些非功能性功能,可以更快地构建生产就绪应用程序。

有关代码示例的完整答案,请参阅 – Spring Boot vs Spring vs Spring MVC

41.什么是自动配置?

Spring和Spring MVC的问题是需要的配置量。

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <mvc:resources mapping="/webjars/**" location="/webjars/"/> 

我们能为此带来更多智慧吗? 将spring mvc jar添加到应用程序中时,我们可以自动自动配置某些bean吗?

Spring Boot查看a)CLASSPATH上可用的框架b)应用程序的现有配置。 基于这些,Spring Boot提供了使用这些框架配置应用程序所需的基本配置。 这称为自动配置。

有关代码示例的完整答案,请参阅自动配置 。

42:什么是Spring Boot Starter项目?

启动器是一组方便的依赖关系描述符,您可以在应用程序中包含这些描述符。 您可以获得所需的所有Spring和相关技术的一站式服务,而无需搜索示例代码并复制粘贴的依赖描述符。

例如,如果您想开始使用Spring和JPA进行数据库访问,只需在项目中包含spring-boot-starter-data-jpa依赖项,就可以了。

43:你能用一个例子,来解释更多 Staters 的内容?

让我们来思考一个 Stater 的例子 -Spring Boot Stater Web。

如果您想开发Web应用程序或应用程序来公开休息服务,Spring Boot Start Web是首选。 让我们使用Spring Initializr使用Spring Boot Starter Web创建一个快速项目。

Spring Boot Starter Web的依赖关系

java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)「建议收藏」

 <dependency> 
    <groupId> org.springframework.boot </groupId> 
    <artifactId> spring-boot-starter-web </artifactId> 
</dependency> 

以下屏幕截图显示了添加到我们的应用程序中的不同依赖项

Image

依赖项可以被分为:
Spring – core,beans,context,aop
Web MVC – (Spring MVC)
Jackson – for JSON Binding
Validation – Hibernate,Validation API
Enbedded Servlet Container – Tomcat
Logging – logback,slf4j

任何经典的 Web 应用程序都会使用所有这些依赖项。
Spring Boot Starter Web 预先打包了这些依赖项。
作为一个开发者,我不需要再担心这些依赖项和它们的兼容版本。
 

44:Spring Boot提供的其他Starter Project Options是什么?

Spring Boot还提供其他初始项目,包括开发特定类型应用程序的典型依赖项

  • spring-boot-starter-web-services – SOAP Web服务
  • spring-boot-starter-web – Web和RESTful应用程序
  • spring-boot-starter-test – 单元测试和集成测试
  • spring-boot-starter-jdbc – 传统的JDBC
  • spring-boot-starter-hateoas – 为您的服务添加HATEOAS功能
  • spring-boot-starter-security – 使用Spring Security进行身份验证和授权
  • spring-boot-starter-data-jpa – 带有Hibernate的Spring Data JPA
  • spring-boot-starter-data-rest – 使用Spring Data REST公开简单REST服务

45:Spring如何在短时间内创建生产就绪应用程序?

Spring Boot旨在快速实现生产就绪应用程序。 Spring Boot提供了一些开箱即用的非功能性功能,如缓存,日志记录,监控和嵌入式服务器。

  • spring-boot-starter-actuator – 使用开箱即用的监控和跟踪等高级功能
  • spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot-starter-tomcat – 选择您特定的嵌入式Servlet容器
  • spring-boot-starter-logging – 使用logback进行日志记录
  • spring-boot-starter-cache – 启用Spring Framework的缓存支持

46:Spring Boot 2和Spring 5的最低基准Java版本是什么?

Spring Boot 2.0需要Java 8或更高版本。 不再支持Java 6和7。

推荐阅读

  • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes

47:创建Spring Boot项目最简单的方法是什么?

Spring Initializr http://start.spring.io/是引导Spring Boot项目的绝佳工具。

Image

如上图所示,必须执行以下步骤

  • 启动Spring Initializr并选择以下内容
    • 选择com.in28minutes.springboot作为Group
    • 选择student-services作为神器
    • 选择以下依赖项
      • 卷筒纸
      • 执行器
      • DevTools
  • 单击“生成项目”。
  • 将项目导入Eclipse。 文件 – >导入 – >现有的Maven项目。

48:Spring Initializr是创建Spring Boot项目的唯一方法吗?

没有。

Spring Initializr可以轻松创建Spring Boot项目。 但您可以设置maven项目并添加正确的依赖项以开始。

在我们的Spring课程中,我们使用2种方法来创建项目。

  • 第一个是start.spring.io。
  • 另一个 – 手动设置项目在标题为“基本Web应用程序”的部分中使用

手动设置maven项目

以下是重要步骤:

  • 在Eclipse中,使用File – > New Maven Project创建一个新项目。
  • 添加依赖项。
  • 添加maven插件!
  • 添加Spring Boot Application类

你准备好了!

49:为什么我们需要spring-boot-maven-plugin?

spring-boot-maven-plugin提供了一些命令,使您可以将代码打包为jar或运行应用程序

  • spring-boot:run运行Spring Boot应用程序。
  • spring-boot:重新打包重新打包你的jar / war是可执行的。
  • spring-boot:start和spring-boot:启动,停止 -停止管理Spring Boot应用程序的生命周期(即集成测试)。
  • spring-boot:构建,build-info生成可由执行器使用的构建信息。

50:如何使用Spring Boot启用应用程序的自动重新加载?

使用Spring Boot开发人员工具。

将Spring Boot Developer Tools添加到项目中非常简单。

将此依赖项添加到Spring Boot Project pom.xml中

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

重启应用程序。

你们都是Set。

如果您还想自动加载页面,可以查看LiveReload

  • http://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-live-reload/。

在我的试验中,我们发现了LiveReload越野车。 如果您有更好的使用经验,请告诉我们。

51:什么和为什么嵌入式服务器?

考虑一下在虚拟机上部署应用程序(通常)所需的内容。

  • 第1步:安装Java
  • 第2步:安装Web /应用程序服务器(Tomcat / Websphere / Weblogic等)
  • 第3步:部署应用程序之战

如果我们想简化这个怎么办?

如何使服务器成为应用程序的一部分?

您只需要安装了Java的虚拟机,就可以直接在虚拟机上部署应用程序。 不是很酷吗?

这个想法是嵌入式服务器的起源。

当我们创建可部署的应用程序时,我们会将服务器(例如,tomcat)嵌入到deployable中。

例如,对于Spring Boot应用程序,您可以生成包含嵌入式Tomcat的应用程序jar。 您可以将Web应用程序作为普通Java应用程序运行!

嵌入式服务器是指我们的可部署单元包含服务器的二进制文件(例如,tomcat.jar)。

52:如何使用Spring Boot添加自定义JS代码?

在resources资源文件夹下创建名为static的文件夹。 您可以将静态内容放在该文件夹中。

任何JavaScript文件,即test.js都将驻留在/resources/static/js/test.js中 

对于您的示例,myapp.js的路径是resources \ static \ js \ myapp.js

你可以在jsp中使用它来引用它

 <script src="/js/myapp.js"></script> 

53:错误:HAL浏览器,给我未经授权的错误 – 访问此资源需要完全身份验证。 我该如何解决?

 { "timestamp": 1488656019562, "status": 401, "error": "Unauthorized", "message": "Full authentication is required to access this resource.", "path": "/beans" } 

两种选择

选项1:禁用安全性

application.properties

 management.security.enabled: FALSE 

选项2:在日志中搜索密码并将其传递到请求标头中

54:什么是Spring Data?

来自http://projects.spring.io/spring-data/

Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特​​殊特性。它使数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务变得简单易用。

为了简化,Spring Data提供了您可以使用的抽象(接口),而不管底层数据源。

一个例子如下所示

 interface TodoRepository extends CrudRepository < Todo , Long > {
  
   

您可以定义一个简单的存储库,并使用它从数据库中插入,更新,删除和检索todo实体 – 无需编写大量代码。

55:什么是Spring Data REST?

Spring Data REST可用于在Spring Data存储库周围公开HATEOAS RESTful资源。

使用JPA的示例如下所示

 @RepositoryRestResource ( collectionResourceRel = "todos" , path = "todos" ) public interface TodoRepository extends PagingAndSortingRepository < Todo , Long > {
  
   

在不编写大量代码的情况下,我们可以在Spring Data Repositories中公开RESTful API。

下面显示了一些REST服务示例:

POST

  • URL:http:// localhost:8080 / todos
  • 使用标题:内容类型:application / json
  • 请求内容
 { "user": "Jill", "desc": "Learn Hibernate", "done": false } 

响应内容

 { "user": "Jill", "desc": "Learn Hibernate", "done": false, "_links": { "self": { "href": "http://localhost:8080/todos/1" }, "todo": { "href": "http://localhost:8080/todos/1" } } } 

响应包含新创建的资源的href。

56:path =“users”,collectionResourceRel =“users”如何使用Spring Data Rest?

 @RepositoryRestResource(collectionResourceRel = "users", path = "users") public interface UserRestRepository extends PagingAndSortingRepository<User, Long> 
  • path – 要在其下导出此资源的路径段。
  • collectionResourceRel – 生成指向集合资源的链接时使用的rel值。 这在生成HATEOAS链接时使用。

57:当Spring Boot应用程序“作为Java应用程序运行”时,后台会发生什么?

如果您使用的是Eclipse IDE,Eclipse maven插件可确保只要您添加依赖项或对类文件进行更改,就会在目标文件夹中编译并准备好它! 之后它就像任何其他Java应用程序一样。

当您启动Java应用程序时,弹出启动自动配置魔法就会启动。

  • 它会在看到您正在开发Web应用程序时启动tomcat!

58:我们可以在spring-boot-starter-web中使用jetty而不是tomcat吗?

删除spring-boot-starter-web上的现有依赖项并添加它们。

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

59:如何使用Spring Boot生成WAR文件?

推荐阅读

  • https://spring.io/guides/gs/convert-jar-to-war/

这是spring文档的直接链接

  • https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging

60:如何使用Spring Boot部署到其他服务器?

你需要做两个步骤

  • 从项目中产生战争。
  • 将其部署到您最喜欢的服务器(Websphere或Weblogic或Tomcat或…)。

第1步:本入门指南应该有所帮助 – https://spring.io/guides/gs/convert-jar-to-war/

第2步:取决于您的服务器

61:RequestMapping和GetMapping有什么区别?

  • RequestMapping是通用的 – 您可以使用注释上的method属性与GET,POST,PUT或任何其他请求方法一起使用。
  • GetMapping特定于GET请求方法。 它只是RequestMapping的扩展,以提高清晰度。

62:为什么我们建议不要在实际应用中使用Spring Data Rest?

我们认为Spring Data Rest很适合快速原型设计! 在Big应用程序中使用它时要小心!

使用Spring Data REST,您可以直接将数据库权限公开为REST服务。

在设计RESTful服务时,最佳设计实践表明您的界面应该考虑两个重要的事情

  • 你的领域模型
  • 你的消费者

使用Spring Data REST,您不会考虑其中任何一个。 您只需将实体公开为REST服务。

这就是为什么我们建议将它用于快速原型设计或项目的初始演变。 对于完全进化的项目来说,这可能不是一个好主意。

63:如何在Spring Initializer中更改项目的包名?

好消息是你可以自定义它。 单击“切换到完整版”链接。 您将能够配置您想要的包名称!

64:在哪里可以找到可在application.properties中配置的完整属性列表?

这是完整的指南

  • https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

65:JPA和Hibernate有什么区别?

短篇故事

  • JPA是规范/接口
  • Hibernate是JPA实现之一

当我们使用JPA时,我们使用javax.persistence包中的注释和接口,而不使用hibernate导入包。

我们建议使用JPA注释,因为我们没有将Hibernate作为实现。 后来(我知道 – <1%Chance),我们可以使用另一个JPA实现。

66:在哪一层,交易的边界应该开始?

我们建议管理服务层中的事务。 业务事务的逻辑在业务/服务层中,您可能希望在该级别强制执行事务管理。

67:使用Spring Boot启动连接到内存数据库H2的JPA应用程序所需的依赖项是什么?

在Spring Boot项目中,只要确保类路径上存在以下依赖项,您就应该能够启动H2控制台。

  • 网络启动器
  • H2
  • 数据jpa启动器

确切的依赖关系如下所示:

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> 

一些提示:

  • 内存数据库仅在执行应用程序期间处于活动状态。 这是学习框架的有效方式。
  • 这不是您希望现实世界应用程序的行为方式。
  • 我们将在“我们如何连接到外部数据库?”这一问题的答案中解释如何连接到您选择的数据库。

68:如何在没有任何配置的情况下选择Hibernate作为JPA的默认实现?

由于Spring Boot自动配置。

这是我们添加的依赖项

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 

Starter spring-boot-starter-data-jpa对Hibernate和JPA具有传递依赖性。

当Spring Boot在类路径中看到Hibernate时,它会自动将其配置为默认的JPA实现。

69:指定数据库连接信息在哪里? 它如何知道自动连接到H2?

这就是Spring Boot Autoconfiguration的魔力。

来自https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html

Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。 例如,如果HSQLDB在您的类路径上,并且您没有手动配置任何数据库连接bean,那么我们将自动配置内存数据库

更多阅读

  • http://www.springboottutorial.com/spring-boot-auto-configuration

70:我们如何连接到MSSQL或oracle等外部数据库?

让我们考虑其中一个例子 – MySQL

步骤1 – 将mqsql连接器的依赖项添加到pom.xml

 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 

第2步 – 从pom.xml中删除H2依赖项

或者至少将其范围作为测试

 <!-- <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> --> 

第3步 – 设置我的SQL数据库

  • 有关更多信息,请访问https://github.com/in28minutes/jpa-with-hibernate#installing-and-setting-up-mysql

步骤4 – 配置与My SQL Database的连接

配置application.properties

 spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://localhost:3306/todo_example spring.datasource.username=todouser spring.datasource.password=YOUR_PASSWORD 

第5步 – 重启,你准备好了!

而已

71:Spring Boot配置的默认h2数据库名称是什么? 为什么默认数据库名称为testdb?

这是列出application.properties中所有默认值的位置

  • https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

寻找下面的财产

 spring.datasource.name=testdb # Name of the datasource. 

如果您正在使用H2内存数据库,这正是Spring Boot用于设置H2数据库的名称。

72:如果H2不在类路径中会发生什么?

你得到这个错误

 Cannot determine embedded database driver class for database type NONE 

将H2添加到pom.xml并重新启动服务器

 <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> 

73:你能否在事务管理中为ReadOnly提供一个真实的例子?

  • 当您从数据库中读取内容,用户详细信息或任何其他详细信息时,您希望在事务上设置只读,以便Hibernate不需要检查实体的更改。 这更有效率。

74:使用Spring Boot公开自定义应用程序配置的最佳方法是什么?

@Value的问题在于您可以在整个应用程序中分配配置值。 更好的选择是采用集中式方法。

您可以使用@ConfigurationProperties定义配置组件。

 @Component @ConfigurationProperties("basic") public class BasicConfiguration { private boolean value; private String message; private int number; 

可以在application.properties中配置这些值

 basic.value: true basic.message: Dynamic Message basic.number: 100 

75:spring Profiles需要什么?

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

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

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

企业应用程序开发很复杂。 您有多个环境

  • 开发
  • QA
  • 阶段
  • 生产

您希望在每个环境中具有不同的应用程序配置。

配置文件有助于为不同环境提供不同的应用程序配置。

Spring和Spring Boot提供了您可以指定的功能

  • 不同配置文件中各种环境的配置是什么?
  • 设置特定环境的活动配置文件。

Spring Boot将根据在特定环境中设置的活动配置文件来获取应用程序配置。

76:如何使用配置文件通过Spring Boot配置特定于环境的配置?

简介只是识别环境的关键。

在此示例中,我们将使用两个配置文件

  • 开发

application.properties中存在默认的应用程序配置。 让我们考虑一个例子。

application.properties

 basic.value= true basic.message= Dynamic Message basic.number= 100 

我们希望为dev配置文件自定义application.properties。 我们需要创建一个名为application-dev.properties的文件,并覆盖我们想要自定义的属性。

application-dev.properties

 basic.message: Dynamic Message in DEV 

同样,您可以配置prod配置文件的属性。

application-prod.properties

 basic.message: Dynamic Message in Prod 

配置文件特定配置后,您需要在环境中设置活动配置文件。

有多种方法可以做到这一点

  • 在VM Arguments中使用-Dspring.profiles.active = prod
  • 在application.properties中使用spring.profiles.active=prod

*************************

77:Spring和Spring Boot有什么区别?

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

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

从本质上讲,尽管Spring是不受欢迎的, Spring Boot会对平台和库有一个看法,让我们快速入门。

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

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

请查看我们的其他教程之一, 了解vanilla Spring和Spring Boot之间详细比较 。

78:什么是@SpringBootApplication注释?

回答: 
在Spring BOOT 1.2之前,使用@Configuration,@ EnableAutoConfiguration,@ ComponentScan等注释是很常见的。 @SpringBootApplication注释等同于之前提到的所有三个注释及其默认属性。 意味着单个注释现在足以支持多个功能,例如启用自动配置和执行bean的组件扫描。

@SpringBootApplication 
公共类MyApp { 
………。 
}

79:@SpringBootApplication注释在内部执行什么操作?

根据Spring Boot文档, @ SpringBootApplication注释等同于使用@ Configuration , @EnableAutoConfiguration@ComponentScan及其默认属性。 Spring Boot使开发人员可以使用单个注释而不是使用多个注释。 但是,正如我们所知,Spring提供了松散耦合的功能,我们可以根据项目需要为每个单独的注释使用这些功能。

 

80:如何在不使用basePackages过滤器的情况下排除任何包?

您可以通过不同的方式过滤任何包。 但Spring Boot为实现这一目标提供了一个棘手的选择,而无需触及组件扫描。 您可以在使用注释@SpringBootApplication时使用exclude属性。 请参阅以下代码段:

 @SpringBootApplication(exclude= {Employee.class}) public class FooAppConfiguration {} 

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

如果找到任何您不想要的特定自动配置类,则可以使用@EnableAutoConfigurationexclude属性。

 //By using "exclude" @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 

另一方面,如果类不在类路径上,则可以使用批注的excludeName属性并指定完全限定名称。

 //By using "excludeName" @EnableAutoConfiguration(excludeName={Foo.class}) 

此外,Spring Boot提供了通过使用spring.autoconfigure.exclude来控制要排除的自动配置类列表的spring.autoconfigure.exclude   属性。 您可以添加到application.properties中。 并且您可以使用逗号分隔添加多个类。

 //By using property file spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 

82:什么是Spring Boot Actuator?它的优点是什么?

这是Spring Boot中最常见的面试问题之一。 根据Spring doc:

“执行器是一个制造术语,指的是用于移动或控制某物的机械装置。执行器可以通过微小的变化产生大量的运动。”

众所周知,Spring Boot提供了许多自动配置功能,可帮助开发人员快速开发生产组件。 但是如果你考虑调试和如何调试,如果出现问题,我们总是需要分析日志并挖掘我们应用程序的数据流,以检查发生了什么。 因此,Spring Actuator可以轻松访问这些功能。 它提供了许多功能,即创建了什么bean,控制器中的映射,CPU使用率等。然后,可以自动收集和审核运行状况和度量标准。

它提供了一种非常简单的方法来访问少数生产就绪的REST端点,并从Web获取各种信息。 但是通过使用这些端点,您可以做很多事情来查看端点文档。 没有必要担心安全问题; 如果存在Spring Security,则默认使用Spring Security的内容协商策略保护这些端点。 否则,我们可以在RequestMatcher的帮助下配置自定义安全性。

Actuator为Spring启动应用程序提供了生产就绪功能。将Spring Boot应用程序变为现实。这些功能使我们能够在生产中运行时监控和管理应用程序。 生产就绪功能(如应用程序监控,收集指标,了解流量和数据库状态)对于使应用程序保持健康状态非常重要。 使用像库这样的Actuator的一个主要好处是开发人员可以访问生产级工具,而无需实现这些工具中的任何一个。 要为我们的包管理器启用Spring Boot Actuator依赖项,请在下面spring-boot-starter-actuator starter添加到您的pom.xml文件中:

<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 Actuator教程 。

83:如何启用/禁用执行器?

启用/禁用执行器很容易; 最简单的方法是使功能能够将依赖关系(Maven / Gradle)添加到spring-boot-starter-actuator,即Starter。 如果您不想启用执行器,则不要添加依赖项。

Maven依赖:

 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> 

84:什么是Spring Initializer?

这可能不是一个困难的问题,但面试官总是检查候选人的主题知识。 通常情况下,您不能总是期待您准备的问题。 然而,这几乎是所有时间都是一个非常常见的问题。

Spring Initializer是一个Web应用程序,它可以生成一个Spring Boot项目,其中包含快速启动它所需的一切。 一如既往,我们需要一个良好的项目框架; 它可以帮助您正确地创建项目结构/骨架。 您可以在此处了解有关初始化程序的更多信息

85:什么是执行器的关闭(shutdown)?
Shutdown是一个允许

应用程序正常关闭的端点

默认情况下不启用此功能。您可以在application.properties文件中使用management.endpoint.shutdown.enabled = true来启用此功能。但是如果你使用它,请小心使用。

86:是否可以在Spring启动时更改嵌入式Tomcat服务器的端口?

是的,可以更改端口。 您可以使用application.properties文件来更改端口。 但是你需要提到“ server.port ” (即server.port = 8081) 。 确保项目类路径中有application.properties; REST Spring框架将负责其余部分。 如果你提到server.port = 0 ,它会自动分配任何可用的端口。

87:我们可以在Spring Boot中覆盖或替换嵌入式Tomcat服务器吗?

是的,我们可以使用Starter依赖项将Embedded Tomcat替换为任何其他服务器。 您可以根据需要使用spring-boot-starter-jettyspring-boot-starter-undertow作为每个项目的依赖项。

88:我们可以在Spring Boot应用程序中禁用默认Web服务器吗?

Spring的主要优点是提供灵活性来构建松散耦合的应用程序。 Spring提供了在快速配置中禁用Web服务器的功能。 是的,我们可以使用application.properties来配置Web应用程序类型,即spring.main.web-application-type=none 。

 89:使用Spring 框架有什么好处?

回答: 
下面列出了一些优势点:

  • Spring引导提供了一种自以为是的配置,从而避免了大量的样板代码和配置。
  • 它的应用程序可以很容易地集成到Spring生态系统中,如Spring Security,Spring AOP,Spring事务和缓存等。
  • 它提供了Tomcat等嵌入式HTTP服务器来增强开发过程。
  • Spring启动提供了一个命令行界面,即CLI工具,用于开发和测试应用程序,这是一种快速且不那么具有侵入性的工具。
  • 通过将配置减少到最小或“无配置”方法,Spring引导减少了大量的开发时间,从而提高了生产率。

90:解释Spring启动启动POM文件?

回答: 
Starter POM文件实际上包含许多依赖项,因此项目可以在很短的时间内快速启动并运行。 它基本上是依赖描述符的组合,任何人都可以在其应用程序中包含这些依赖描述符,并且所有与项目相关 Starter POM文件还管理项目的传递依赖性。 POM文件结构来自基于Maven的应用程序。 换句话说,创建使用Spring REST创建其他API的项目的开发人员只需要包含相关的启动POM文件,该文件将导入Spring rest应用程序所需的所有依赖项。 现在不再需要框架所需的搜索和配置依赖关系的所有繁琐任务。

让我们转到下一个Spring Boot Interview Questions。

91:在自定义端口上运行Spring启动应用程序的方法是什么?

回答: 
Spring引导中有一个名为application.properties的文件。 可以自定义此文件以引入任何更改,以更改正在运行的Spring引导应用程序的行为。 如果开发人员想要在自定义端口上运行spring boot应用程序,他可以在application.properties文件中指定端口:

server.port = 8080

此条目将确保应用程序将在8080端口上运行。

92:在Spring启动应用程序中配置日志记录的方法是什么?

回答: 
开发人员可以在application.properties文件中轻松指定日志记录级别: 
Logging.level.spring.framework = Debug 
应用程序属性文件中的这一行将让spring框架记录到调试级别。 
如果开发人员想要将日志放入文件,他可以在应用程序属性中指定logger.file

Logging.file = $ {java.io.tempdirectory} /sample.log

除了上述两种方法之外,开发人员还可以在main / java / resources下创建logback.xml文件,并在文件中指定日志记录配置。 Spring启动会自动选择这个文件。。

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

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

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

  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <parent></parent></span> &lt;母体&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <groupid>
     org.springframework.boot
    </groupid></span> &lt;的groupId&gt; org.springframework.boot 
   <!--的groupId--></span>&nbsp;&nbsp;&nbsp;&nbsp;
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <artifactid>
     spring-boot-starter-parent
    </artifactid></span> 
   <artifactid的>
    弹簧引导起动父
    <!-- artifactId的-->
   </artifactid的></span>&nbsp;&nbsp;&nbsp;&nbsp;
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <version>
     2.1.1.RELEASE
    </version></span> &lt;版本&gt; 2.1.1.RELEASE 
   <!--版本--></span>
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></span> 
   <!--父--></span>

使用启动父项目很方便,但并不总是可行。 例如,如果我们公司要求所有项目都从标准POM继承,我们就不能依赖Spring Boot的启动父级。我们可以在Maven Central找到最新版本的spring-boot-starter-parent 。

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

  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <dependencymanagement></dependencymanagement></span> 
   <dependencymanagement></dependencymanagement></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <dependencies></dependencies></span> &lt;依赖性&gt;</span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <dependency></dependency></span> &lt;依赖性&gt;</span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <groupid>
     org.springframework.boot
    </groupid></span> &lt;的groupId&gt; org.springframework.boot 
   <!--的groupId--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <artifactid>
     spring-boot-dependencies
    </artifactid></span> 
   <artifactid的>
    弹簧引导依赖性
    <!-- artifactId的-->
   </artifactid的></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <version>
     2.1.1.RELEASE
    </version></span> &lt;版本&gt; 2.1.1.RELEASE 
   <!--版本--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <type>
     pom
    </type></span> &lt;类型&gt; POM 
   <!--类型--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">
    <scope>
     import
    </scope></span> &lt;范围&gt;进口
   <!--范围--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></span> 
   <!--依赖性--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></span> 
   <!--依赖--></span> 
  <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></span> 
   <!-- dependencyManagement--></span> 

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

最后,我们可以为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:使用Spring MVC构建Web的启动器,包括RESTful应用程序

有关启动器的完整列表,请参阅此存储库 。

要查找有关Spring Boot启动器的更多信息,请查看Spring启动器简介 。

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

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

1

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration</span> org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.baeldung.autoconfigure.CustomAutoConfiguration</span>

如果我们使用Maven构建一个项目,那么该文件应放在resources / META-INF目录中,该目录将在程序包阶段结束时在上述位置。

96: 如何告诉自动配置在bean存在时退回?

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

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

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

1

2

3

4

5

6

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Configuration</span> @组态</span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class CustomConfiguration {</span>公共类CustomConfiguration {</span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Bean</span> @豆</span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@ConditionalOnMissingBean</span> @ConditionalOnMissingBean</span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public CustomService service() { ... }</span> public CustomService service(){...}</span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

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

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

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

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

1

2

3

4

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><plugin></span> <插件></span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <的groupId> org.springframework.boot </的groupId></span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-maven-plugin</artifactId></span> <artifactId的>弹簧引导行家-插件</ artifactId的></span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></plugin></span> </插件></span>

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

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

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

1

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><packaging>jar</packaging></span> <包装>罐</包装></span>

如果我们不包含这个元素,它也默认为jar 。

如果我们想要构建WAR文件,请将包装元素更改为war :

1

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><packaging>war</packaging></span> <包装>战</包装></span>

并将容器依赖关系从打包文件中删除:

1

2

3

4

5

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><dependency></span> <依赖性></span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><groupId>org.springframework.boot</groupId></span> <的groupId> org.springframework.boot </的groupId></span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><artifactId>spring-boot-starter-tomcat</artifactId></span> <artifactId的>弹簧引导起动的Tomcat </ artifactId的></span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"><scope>provided</scope></span> <范围>提供</范围></span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"></dependency></span> </依赖性></span>

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

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

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

1

2

3

4

5

6

7

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootApplication</span> @SpringBootApplication</span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public class MyApplication {</span>公共类MyApplication {</span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">public static void main(String[] args) {</span> public static void main(String [] args){</span>

        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">SpringApplication.run(MyApplication.class);</span> SpringApplication.run(MyApplication.class);</span>

        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">// other statements</span> //其他陈述</span>

    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

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

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

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

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

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

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

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

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

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

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

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

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

101: 如何编写集成测试?

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

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

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

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

有关详细说明,请查看我们的Spring Boot测试教程。

可以关注一下或者点个赞吗?

谢谢!

祝一切顺利!

***********************************

参考:

https://translate.google.com/translate?hl=zh-CN&sl=en&tl=zh-CN&u=https%3A%2F%2Fwww.educba.com%2Fspring-boot-interview-questions%2F

春季采访面试问题

Spring启动面试问题和答案简介

Spring BOOT是一个非常流行的框架,它构建在Spring框架的顶层。 它提出了一种新的开发方法,可以简化Spring应用程序的引导和开发。 在典型的Spring框架中,有许多bean和元配置有多种方式,如XML ,注释和Java配置 。 Spring BOOT避免了所有配置,因此开发人员可以在很短的时间内快速启动新的Spring项目。 Spring BOOT不是解决某些问题的新方法,但它解决了与Spring框架相同的问题,但是配置很少甚至没有。 它遵循一种默认的配置方法。 它有助于减少大量的样板代码和配置,以改进开发,单元测试和集成测试过程。

现在,如果您正在寻找与Spring Boot相关的工作,那么您需要准备Spring Boot面试问题。 确实,每次采访都根据不同的工作档案而有所不同,但仍然要清楚你需要对Spring Boot有一个良好而清晰的知识。 在这里,我们准备了重要的春季采访问题和答案,这将有助于您在面试中取得成功。

以下是在采访中询问的顶级Spring Boot面试问题列表,这些问题分为两部分,如下所示:

参考:

https://translate.google.com/translate?hl=zh-CN&sl=en&u=https://www.baeldung.com/spring-boot-interview-questions&prev=search

未完待续。。。

 参考:

https://translate.google.com/translate?hl=zh-CN&sl=en&u=https://dzone.com/articles/top-10-spring-boot-interview-questions&prev=search

推荐文章

这是Spring Boot Spring面试问题和答案列表的指南,以便候选人可以轻松地打击这些Spring Boot面试问题。 在这篇文章中,我们研究了顶级的春季采访问题,这些问题经常在采访中提出。您还可以查看以下文章以了解更多信息 –

  1. iOS面试问题
  2. Bootstrap面试问题
  3. MATLAB面试问题
  4. 快速JS面试问题
  5. Bootstrap和Jquery的最佳功能
  6. Spring vs Hibernate:好处
  7. Spring vs Struts:有什么功能
  8. Hibernate面试问题必须知道

*****************************************

优秀参考文章:

https://www.google.com/search?newwindow=1&source=hp&ei=iU0lXbzXO5_I0PEP-ZGIqAs&q=Spring+boot+Summary+of+interview+questions&oq=Spring+boot+Summary+of+interview+questions&gs_l=psy-ab.3…27750.36154..37477…1.0..0.919.1783.2-2j1j6-1……0….2j1..gws-wiz…..0..0.6f_tkgeN448

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182913.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号