当前位置: 首页 > 科技观察

SpringBoot面试题(2020最新版)

时间:2023-03-12 06:48:00 科技观察

概述什么是SpringBoot?SpringBoot是Spring开源组织下的一个子项目。它是Spring组件的一站式解决方案。主要是简化了Spring的使用难度,省去了繁重的配置,并提供了各种starter,方便开发者快速上手。SpringBoot有哪些优点?SpringBoot主要有以下优点:简单易用,提高开发效率,为Spring开发提供更快速更广泛的入门体验。开箱即用,远离繁琐的配置。为大型项目提供一系列通用的非业务功能,如:嵌入式服务器、安全管理、运行数据监控、健康检查、外部配置等。无需代码生成,无需XML配置。避免大量Maven导入和各种版本冲突。SpringBoot的核心注解是哪个?主要由哪些注解组成?启动类上的注解是@SpringBootApplication,这也是SpringBoot的核心注解。主要组合包括以下三个注解:启动类上的注解是@SpringBootApplication,这也是SpringBoot的核心注解。主要组合包括以下三个注解:@SpringBootConfiguration:组合@Configuration注解实现配置文件的功能。@EnableAutoConfiguration:开启自动配置功能,或者关闭一个自动配置选项,比如关闭数据源自动配置功能:@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})@ComponentScan:Spring组件扫描。配置什么是JavaConfig?SpringJavaConfig是Spring社区的一个产品,它提供了一种配置SpringIoC容器的纯Java方式。所以它有助于避免XML配置。使用JavaConfig的优点是:(1)面向对象的配置。由于配置在JavaConfig中定义为类,因此用户可以充分利用Java中面向对象的特性。一个配置类可以继承另一个,覆盖它的@Bean方法等。(2)减少或消除XML配置。基于依赖注入原理的外部化配置的好处已经被证明。然而,许多开发人员不想在XML和Java之间来回切换。JavaConfig为开发人员提供了一种纯Java的方式来配置Spring容器,在概念上类似于XML配置。从技术上讲,仅使用JavaConfig配置类来配置容器是可行的,但在实践中,许多人发现将JavaConfig与XML混合搭配是理想的选择。(3)类型安全和重构友好。JavaConfig提供了一种类型安全的方式来配置Spring容器。由于Java5.0对泛型的支持,现在可以按类型而不是按名称检索bean,而无需任何强制转换或基于字符串的查找。SpringBoot自动配置的原理是什么?注解@EnableAutoConfiguration、@Configuration、@ConditionalOnClass是自动配置的核心。@EnableAutoConfiguration将定义在META-INF/spring.factories中的自动配置类导入到容器中。有效自动配置类的过滤器。每个自动配置类结合对应的xxxProperties.java读取配置文件进行自动配置。SpringBoot配置加载顺序怎么理解?在SpringBoot中,可以通过以下方式加载配置。1)属性文件;2)YAML文件;3)系统环境变量;4)命令行参数;等等...什么是YAML?YAML是一种人类可读的数据序列化语言。它通常用于配置文件。如果我们想在配置文件中添加复杂的属性,与属性文件相比,YAML文件更加结构化且不易混淆。可见YAML是有层次化的配置数据的。YAML配置有什么好处?YAML可以说是现在非常流行的一种配置文件格式。不管是前端还是后端,都能看到YAML配置。那么YAML配置与传统的properties配置相比有哪些优势呢?配置有序。在一些特殊场景下,有序配置是关键。支持数组。数组中的元素可以是基本数据类型或对象。简洁性与properties配置文件相比,YAML还有一个缺点,就是不支持@PropertySource注解导入自定义YAML配置。SpringBoot可以使用XML配置吗?SpringBoot推荐使用Java配置而不是XML配置,但是在SpringBoot中也可以使用XML配置,可以通过@ImportResource注解引入一个XML配置。springboot核心配置文件是什么?bootstrap.properties和application.properties有什么区别?单纯做SpringBoot开发,可能不太容易遇到bootstrap.properties配置文件,但是结合SpringCloud时,会经常遇到这种配置,尤其是需要加载一些远程配置文件的时候。springboot核心的两个配置文件:bootstrap(.yml或.properties):boostrap由父ApplicationContext加载,优先级高于applicationton,配置在应用上下文的bootstrap阶段生效。一般来说,我们会在SpringCloudConfig或者Nacos中使用。并且boostrap中的属性不能被覆盖;application(.yml或.properties):由ApplicatonContext加载,用于springboot项目的自动配置。什么是弹簧配置文件?SpringProfiles允许用户根据配置文件(dev、test、prod等)注册bean。因此,当应用程序在开发中运行时,只能加载某些bean,而在生产中,可以加载某些其他bean。假设我们的要求是Swagger文档仅在QA环境中可用,并且禁用所有其他文档。这可以使用配置文件来完成。SpringBoot使配置文件的使用变得非常简单。如何在自定义端口上运行SpringBoot应用程序?为了在自定义端口上运行SpringBoot应用程序,您可以在application.properties中指定端口。server.port=8090安全如何实现SpringBoot应用安全?为了实现SpringBoot的安全性,我们使用了spring-boot-starter-security依赖,并且必须添加安全配置。它需要很少的代码。配置类必须扩展WebSecurityConfigurerAdapter并覆盖其方法。比较SpringSecurity和Shiro的优缺点?由于SpringBoot官方提供了大量非常方便的开箱即用的Starters,包括SpringSecurityStarter,在SpringBoot中使用SpringSecurity更加简单,甚至只需要添加一个依赖来保护所有的接口,所以如果是SpringBoot项目,一般选择SpringSecurity。当然,这只是一个建议的组合。从纯技术的角度来看,不管你怎么组合,都没有问题。与SpringSecurity相比,Shiro有以下特点:SpringSecurity是一个重量级的安全管理框架;Shiro是一个轻量级的安全管理框架;SpringSecurity概念复杂,配置繁琐;Shiro概念简单,配置简单。安全性强大;士郎很简单。SpringBoot如何解决跨域问题?跨域可以在前端通过JSONP解决,但是JSONP只能发送GET请求,不能发送其他类型的请求。在RESTful风格的应用中,显得很鸡肋,所以推荐在后端使用(CORS,Cross-originresourcesharing)来解决跨域问题。这个解决方案并不是SpringBoot独有的。在传统的SSM框架中,可以使用CORS来解决跨域问题,但是之前我们在XML文件中配置了CORS,现在我们可以通过实现WebMvcConfigurer接口,重写addCorsMappings方法来解决跨域问题。@ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET","POST","PUT","DELETE","OPTIONS").maxAge(3600);}}项目中前后端分离部署,需要解决跨域问题。我们使用cookies来存储用户登录信息,在spring拦截器中进行权限控制。当权限不满足要求时,我们会直接返回固定的json结果给用户。用户登录后,正常使用;当用户注销或者token过期时,由于拦截器的顺序和跨域的问题,出现跨域现象。我们知道对于一个http请求,首先要经过过滤器,到达servlet之后再进行拦截器。如果我们将cors放在过滤器中,它可以在权限拦截器之前执行。@ConfigurationpublicclassCorsConfig{@BeanpublicCorsFiltercorsFilter(){CorsConfigurationcorsConfiguration=newCorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.setAllowCredentials(true);UrlBasedCors=CurationsConfigurationSourceurlBasednewUrlBasedCorsConfigurationSource();urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);returnnewCorsFilter(urlBasedCorsConfigurationSource);}}什么是CSRF攻击?CSRF代表跨站请求伪造。这是一种强制最终用户对当前经过身份验证的Web应用程序执行不需要的操作的攻击。CSRF攻击专门针对状态更改请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。SpringBoot中的监视器是什么?SpringBootActuator是SpringBoot框架中的重要功能之一。Springboot监视器可帮助您访问生产中正在运行的应用程序的当前状态。在生产环境中必须检查和监控几个指标。甚至某些外部应用程序也可能会使用这些服务来触发向相关人员发送警报消息。monitor模块公开了一组REST端点,可直接作为HTTPURL访问以检查状态。如何在SpringBoot中禁用Actuator端点安全性?默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR角色的用户才能访问它们。使用标准的HttpServletRequest.isUserInRole方法强制执行安全性。我们可以禁用安全性。仅当在防火墙后访问执行器端点时才建议禁用安全性。我们如何监控所有的SpringBoot微服务?SpringBoot提供监控端点来监控各个微服务的指标。这些端点对于获取有关应用程序的信息很有用,例如它们是否已启动以及它们的组件(如数据库等)是否正常运行。然而,使用监视器的一个主要缺点或困难是我们必须单独打开应用程序的知识点才能了解其状态或健康状况。想象一个涉及50个应用程序的微服务,管理员必须访问所有50个应用程序的执行端点。为了帮助我们处理这种情况,我们将使用位于SpringBootActuator之上的开源项目,它提供了一个WebUI,使我们能够跨多个应用程序可视化指标。集成第三方项目什么是WebSockets?WebSocket是一种计算机通信协议,可通过单个TCP连接提供全双工通信通道。1.WebSocket是双向的——使用WebSocket的客户端或者服务端都可以发起消息发送。2.WebSocket是全双工的——客户端和服务器通信相互独立。3.单一TCP连接——初始连接使用HTTP,然后将此连接升级为基于套接字的连接。然后这个单一的连接用于所有未来的通信4、Light-WebSocket消息数据交换与http相比要轻得多。什么是弹簧数据?SpringData是Spring的一个子项目。用于简化数据库访问,支持NoSQL和关系数据存储。它的主要目标是使数据库访问变得简单快捷。SpringData具有以下特点:SpringData项目支持NoSQL存储:MongoDB(文档数据库)Neo4j(图数据库)Redis(key/value存储)Hbase(列族数据库)SpringData项目支持的关系型数据存储技术:JDBCJPASpringDataJpa致力于减少数据访问层(DAO)的开发量。开发者唯一要做的就是声明持久层的接口,剩下的交给SpringDataJPA来帮你!SpringDataJPA使用规范的方法名,根据符合规范的名称来判断该方法需要实现什么样的逻辑。什么是春季批处理?SpringBootBatch提供了在处理大量记录时非常重要的可重用功能,包括日志记录/跟踪、事务管理、作业处理统计、作业重启、跳过和资源管理。它还提供了更高级的技术服务和功能,通过优化和分区技术,可以实现非常高的批处理和高性能的批处理作业。简单和复杂的大批量批处理作业都可以利用该框架以高度可扩展的方式处理大量信息。什么是FreeMarker模板?FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构生成动态网页。使用Freemarker的主要优势是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计师可以处理html页面设计。最后使用freemarker可以将这些组合起来以提供最终输出页面。SpringBoot和ActiveMQ如何整合?为了集成SpringBoot和ActiveMQ,我们使用依赖项。它只需要很少的配置,也不需要样板代码。什么是阿帕奇卡夫卡?ApacheKafka是一个分布式发布-订阅消息系统。它是一个可扩展的、容错的发布-订阅消息系统,使我们能够构建分布式应用程序。这是一个Apache顶级项目。Kafka适用于离线和在线消息消费。什么是招摇?你用SpringBoot实现了吗?Swagger广泛用于可视化API,使用SwaggerUI为前端开发人员提供在线沙箱。Swagger是一种工具、规范和完整的框架实现,用于生成RESTfulWeb服务的可视化表示。它使文档能够以与服务器相同的速度更新。当通过Swagger正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与之交互。因此,Swagger消除了调用服务时的猜测。前后端分离,接口文件如何维护?前后端分离开发越来越流行。大多数情况下,我们都是通过SpringBoot来做前后端分离开发的。必须有前后端分离的接口文档,否则前后端会深陷其中。陷入争吵。比较笨的方法是用word或者md来维护界面文档,但是效率太低了。一旦界面变了,大家的文档就得变。在SpringBoot中,常见的解决这个问题的方法是Swagger。使用Swagger,我们可以快速生成一个界面文档网站。一旦界面发生变化,文档将自动更新。所有开发工程师都可以通过访问该在线网站获得最新信息。接口文档,很方便。如何在不重启服务器的情况下重新加载SpringBoot上的更改?如何热部署SpringBoot项目?这可以使用DEV工具来实现。使用此依赖项,您可以保存任何更改,嵌入式tomcat将重新启动。SpringBoot有一个开发工具(DevTools)模块,有助于提高开发人员的工作效率。Java开发人员面临的一个主要挑战是自动将文件更改部署到服务器并自动重启服务器。开发人员可以重新加载在SpringBoot上所做的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。SpringBoot在发布第一个版本时并没有这个特性。这是开发人员最需要的功能。DevTools模块充分满足开发者的需求。该模块将在生产环境中被禁用。它还提供了H2数据库控制台,以便更好地进行应用程序测试。org.springframework.bootspring-boot-devtools您使用的是哪个启动器maven依赖项?使用了以下依赖项spring-boot-starter-activemqspring-boot-starter-security这有助于添加更少的依赖项并减少版本冲突。SpringBoot中的starter到底是什么?首先,这个Starter并不是一个新的技术点,基本是基于Spring已有的功能实现的。首先它提供了一个自动配置类,一般命名为XXXAutoConfiguration,其中通过条件注解来判断一个配置是否生效(条件注解本来就是Spring中的),然后它还提供了一系列的默认配置,还有允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入来注入这些配置属性,新注入的属性会替换默认的属性。正因为如此,我们可以直接使用很多第三方框架,只需要引入依赖即可。当然开发者也可以自定义Starter。spring-boot-starter-parent有什么用?我们都知道,在新建一个SpringBoot项目时,默认有一个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。SpringBoot制作的jar和普通的jar有什么区别?SpringBoot项目最终打包出来的jar是一个可执行的jar。这个jar可以直接通过java-jarxxx.jar命令运行。此罐不能用作普通罐。该jar被其他项目依赖,即使被依赖,里面的类也不能使用。SpringBoot的jar不能被其他项目依赖,主要是它和普通的jar结构不一样。普通的jar包,解压后直接就是包名,package就是我们的代码,而SpringBoot打包的可执行jar解压后在\BOOT-INF\classes目录下就是我们的代码,所以不能直接引用.如果一定要引用,可以在pom.xml文件中添加配置,将SpringBoot工程打包成两个jar,一个可执行,一个可引用。运行SpringBoot有哪些不同的方式?1)用命令打包或在容器中运行2)用Maven/Gradle插件运行3)直接执行main方法运行SpringBoot。它需要一个独立的容器来运行吗?你不需要它,因为内置了Tomcat/Jetty等容器。有哪些方法可以启用SpringBoot特性?1)继承spring-boot-starter-parent工程2)导入spring-boot-dependencies工程依赖如何使用SpringBoot实现异常处理?Spring提供了一种非常有用的方法来使用ControllerAdvice处理异常。我们实现了一个ControlerAdvice类来处理控制器类抛出的所有异常。如何用SpringBoot实现分页和排序?使用SpringBoot实现分页非常简单。使用SpringData-JPA可以将分页传递给存储库方法。微服务中如何实现session共享?在微服务中,一个完整的项目被拆分成多个不同的独立服务,每个服务独立部署在不同的服务器上,它们的session与物理空间是隔离的,但是很多时候,我们需要在不同的微服务之间共享session。常见的方案是SpringSession+Redis来实现session共享。所有微服务的session统一保存在Redis上。当每个微服务对session有相关的读写操作时,就会对Redis上的session进行操作。这样就实现了会话共享。SpringSession是基于Spring中的代理过滤器实现的,使得session的同步操作对开发者来说是透明的,非常简单。SpringBoot如何实现定时任务?定时任务也是一个常见的需求。SpringBoot对定时任务的支持主要来自于Spring框架。在SpringBoot中使用定时任务主要有两种方式,一种是使用Spring中的@Scheduled注解,另一种是使用第三方框架Quartz。Spring中@Scheduled的使用方式主要是通过@Scheduled注解来实现的。如果使用Quartz,只需要根据Quartz定义Job和Trigger即可。