SpringBoot面试题

182 阅读7分钟

我只是个小白,刚刚入行一年,学到的一些知识点,目前整理一些可能遇到的面试题,如果有帮助,可拿走,如果有被冒犯到,请联系我进行删除,谢谢!

1、谈谈你对SpringBoot的理解?什么是SpringBoot?

SpringBoot是spring开源组织下的子项目,是spring组件一站式的解决方案,主要是简化了使用spring框架的难度,简省了繁琐的配置并提供一些强大的功能 ( 各种启动器,自动配置,应用监控等 ) 使开发者能快速上手.

SpringBoot的核心理念是约定优于配置

2、为什么需要Spring Boot?

Spring Boot简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置提供默认设置,存放默认配置的包就是启动器starter,这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。

3、说出Spring Boot 的优点

  1. 创建独立的Spring应用,为所有Spring的开发者提供一个非常快速的,广泛接受的入门体验.
  2. 直接嵌入应用服务器,如 tomcat,jetty,undertow等; 不需要去部署war包
  3. 提供固定的场景启动器依赖去简化组件配置; 实现开箱即用 ( 启动器starter- 其实就是SpringBoot提供的一个jar包 ) ,通过自己设置参数 ( .properties 或 .yml 的配置文件 ) ,即可快速使用
  4. 自动的配置Spring和其他有需要的第三方依赖 提供了一些大型项目中常见的非功能性特性 ,如 内嵌服务器,安全,指标,健康检测,外部化配置等.
  5. 绝对没有代码生成,也无需XML配置

4、Spring Boot的配置文件有哪几种格式?它们有什么区别?

SpringBoot提供两种文件格式的全局配置文件,并且文件名是固定的,均以“application”为文件名,这是SpringBoot设置理念:约定优于配置,格式分别是application.properties和application.yml

在全局配置文件中可以自定义属性

application.properties

这种文件格式的配置文件,在使用快速向导创建SpringBoot应用的时候,默认就在resources目录下创建了,因此它是默认的全局配置文件,这种语法是“key=value”的形式;多级属性之间使用点连接;

application.yml

这种配置文件是以YAML(YAML Ain't Markup Language)语言的文件,文件语法使用空白缩进,分行组织数据,yml文件采取树状结构,进行读写操作,以数据为中心,比json、xml等更适合做配置文件。

两种配置文件的区别

  • 内容格式比较:

properties文件语法是“key=value”的形式,对应复杂属性数据,是以“ . ”号连接层级关系的。结构上没有分层效果;

yml文件采用树状结构,有明显的分层效果,语法是以“key:(空格)value”的形式,以空间的缩进来控制层级关系,只要是左对齐的一列数据,都是属于同一层级的。

  • 执行顺序:

工程中同时存在application.properties文件和application.yml文件,properties内容生效。

  • yml不支持@PropertySource注解导入配置

多环境下的配置文件配置

在开发过程中一个项目可能同时具备多套运行环境。

根据每套环境的配置,我们可以生成多套application-XXX.properties(yml)属性文件,然后在application.properties(yml)属性文件中通过属性spring.profiles.active激活某一个application-XXX.properties(yml)文件。

spring.profiles.active = dev

5、什么是YAML?

YAML: 是一种简洁的非标记语言(YAML Ain’tMarkup Language),YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁,作为配置文件,比json更加简洁

YAML的设计目标:

  • 人类容易阅读
  • 可用于不同程序间的数据交换
  • 适合描述程序所使用的数据结构,特别是脚本语言
  • 丰富的表达能力与可扩展性
  • 易于使用

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

启动类上面的注解是@SpringBootApplication,它是 SpringBoot 的核心注解

核心注解主要由以下三个注解组成

  1. @SpringBootConfiguration: 这个注解标注在某类上,说明这个类是个springboot配置类

  2. @EnableAutoConfiguration: 这个注解就是springboot能实现自动配置的关键

    @EnableAutoConfiguration也是一个组合注解,作用是借助@Import来收集所有符合自动配置条件的bean定义,并加载到IOC容器。

    主要的注解是:

    • @AutoConfigurationPackage:自动配置包,将主程序类所在包及所有子包下的组件扫描到spring容器中
      • @Import(AutoConfigurationPackages.Registrar.class):给容器中导入某个组件类
  3. @ComponentScan:这个注解是组件扫描,组件扫描就是扫描指定的包下的类,并加载符和条件的组件。相当于Spring的配置文件中使用过的标签<context:component-scan base-package="com.xxxxxx"/>

7、什么是Spring Boot Starter?

SpringBoot将日常企业应用研发中的各种场景都抽取处理,做成了一个个的starter(启动器) , starter中整合了该场景下各种可能用到的依赖,用户只需要在Maven中引入starter依赖, SpringBoot 就能自动扫描到要加载的信息,并启动相应的默认配置,starter提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰,所有这些starter都遵循着约定的默认配置,并允许使用和调整这些配置,即遵循"约定优于配置"的原则,

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

@EnableAutoConfiguration注解 ,@Configuration注解 和@ConditionalOnClass注解组成了Spring Boot 自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置, 具体是通过maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建在spring 容器中的bean.

9、你如何理解 Spring Boot 配置加载顺序?

Spring Boot配置加载顺序优先级是:properties文件、YAML文件、系统环境变量、命令行参数

10、Spring Boot 是否可以使用XML配置?

SpringBoot提倡零配置 即无xml文件配置。但是在实际的项目中可能由于某些特殊要求必须使用xml配置。

可以使用Spring提供的@ImportResource来加载xml配置文件

11、Spring、SpringBoot、SpringMVC的区别?

SpringBoot是一个基于Spring的框架集合

spring mvc 只是spring 处理web层请求的一个模块。因此他们的关系大概就是这样: spring mvc<spring <springboot.Spring 框架就像一个家族,有众多衍生产品例如 boot、seurity、ipa等等。但他们的基础都是Spring的IOC和AOP

Spring MVC是基于Servlet的一个MVC框架主要解决WEB开发的问题

Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring 的解决方案,而是和Spring 框架紧密结合用于提升Spring开发者体验的工具。

或者:

SpringBoot概念:

SpringBoot是spring开源组织下的子项目,是spring组件一站式的解决方案,主要是简化了使用spring框架的难度,简省了繁琐的配置并提供一些强大的功能 ( 各种启动器,自动配置,应用监控等 ) 使开发者能快速上手。SpringBoot的核心理念是约定优于配置

Spring概念:

Spring是最受欢迎的企业级java应用程序开发框架,是为了解决企业应用开发的复杂性而创建的。

Spring是一个分层的javaSE/EE full-stack(一站式)轻量级、开源、容器框架。Spring框架有两个核心,一个是IOC(控制反转)一个是AOP(面向切面)

SpringMVC概念:

  1. SpringMVC是一种基于java的**、实现MVC设计模型的请求驱动类型的、**轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

  2. SpringMVC是目前最主流的轻量级MVC框架,通过一套注解让一个简单的java类成为处理请求的控制器,无需实现任何接口,同时还支持RESTful编程风格的请求。