SpringBoot面试题整理

1、什么是SpringBoot?

Spring Boot是Pivotal公司推出的一个全新框架,其目的是为了简化Spring项目的初始搭建以及开发过程。html

2、SpringBoot有什么特色?

1)内置服务器,默认使用tomcat服务器前端

2)开箱即用,减小繁琐的配置过程java

3)上手容易,提升开发效率程序员

4)可避免大量Maven导入和版本冲突web

3、SpringBoot的核心注解是哪一个?它主要由哪几个注解组成的?

Spring Boot核心注解是@SpringBootApplication,它主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan组成。spring

@SpringBootConfiguration:继承自@Configuration,两者功能也一致,标注当前类是配置类。数据库

@EnableAutoConfiguration:这个注释启用了Spring Boot的自动配置功能,能够自动为您配置不少东西。apache

@ComponentScan:根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中json

  • 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器
  • 经过includeFilters加入扫描路径下没有以上注解的类加入spring容器
  • 经过excludeFilters过滤出不用加入spring容器的类
  • 自定义增长了@Component注解的注解方式

4、SpringBoot自动配置的原理是什么?

@EnableAutoConfiguration实现自动配置,其内部实际上就是去加载MMETA-INF/spring.factories文件的信息,而后筛选出以@EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置。bootstrap

5、什么是YAML?

YAML是一种数据序列化语言,一般用于配置文件,例如application.yml。

6、YAML优点在哪里?

(1)配置有序

(2)树形结构,清晰明了

(3)支持数组,数组中的元素能够是基本数据和对象

7、SpringBoot是否可使用XML配置 ?

Spring Boot推荐使用Java配置,可是一样也可使用XML配置。

8、spring boot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?

spring boot核心配置文件是application.properties或者application.yml。

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

9、什么是Spring Profiles?

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

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

在项目的配置文件中能够自定义运行的端口。

application.properties

# 自定义端口
server.port = 8081

application.yml

# 自定义端口
server:
	port: 8081

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

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

12、比较一下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 功能简单

十3、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);
    }
}

十4、什么是CSRF攻击?

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

十5、Spring Boot中的监视器是什么?

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

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

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

十7、咱们如何监视全部Spring Boot微服务?

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

十8、什么是WebSockets?

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

一、WebSocket 是双向的 -使用 WebSocket 客户端或服务器能够发起消息发送。

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

三、单个 TCP 链接 -初始链接使用 HTTP,而后将此链接升级到基于套接字的链接。而后这个单一链接用于全部将来的通讯。

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

十9、什么是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经过规范方法的名字,根据符合规范的名字来肯定方法须要实现什么样的逻辑。

二10、什么是Spring Batch?

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

二11、什么是FreeMarker模板?

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

二12、如何集成Spring Boot和ActiveMQ?

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

二十3、什么是Apache Kafka?

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

二十4、什么是 Swagger?你用Spring Boot实现了它吗?

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

二十6、先后端分离,如何维护接口文档 ?

先后端分离开发日益流行,大部分状况下,咱们都是经过Spring Boot作先后端分离开发,先后端分离必定会有接口文档,否则会先后端会深深陷入到扯皮中。一个比较笨的方法就是使用word或者md来维护接口文档,可是效率过低,接口一变,全部人手上的文档都得变。在Spring Boot中,这个问题常见的解决方案是Swagger ,使用Swagger咱们能够快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,全部开发工程师访问这一个在线网站就能够获取到最新的接口文档,很是方便。

二十7、如何从新加载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>

二十8、Spring Boot 中的 starter 究竟是什么 ?

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

二十9、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。

三10、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 ,一个可执行,一个可引用。

三11、运行Spring Boot有哪几种方式?

1)直接运行main文件

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

3)用Maven/Gradle插件运行

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

能够不须要,由于Spring Boot有内嵌服务器tomcat

三十3、开启Spring Boot特性有哪几种方式?

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

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

三十4、如何使用Spring Boot实现异常处理?

Spring提供了一种使用ControllerAdvice处理异常的很是有用的方法。咱们经过实现一个 ControlerAdvice类,来处理控制器类抛出的全部异常。

三十5、如何使用 Spring Boot 实现分页和排序?

使用Spring Data-JPA能够实现将可分页的传递给存储库方法。

三十6、微服务中如何实现session共享 ?

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

三十7、Spring Boot中如何实现定时任务 ?

定时任务也是一个常见的需求,Spring Boot中对于定时任务的支持主要仍是来自Spring框架。在Spring Boot中使用定时任务主要有两种不一样的方式,一个就是使用Spring中的@Scheduled注解,另外一个则是使用第三方框架Quartz。

相关文章
相关标签/搜索