spring|Spring Boot常见面试题及答案

一、为什么是 spring boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手,简而言之:
SpringBoot来简化Spring应用开发,约定大于配置,去繁化简
SpringBoot来简化Spring应用开发,约定大于配置,去繁化简
SpringBoot来简化Spring应用开发,约定大于配置,去繁化简
二、为什么要用 spring boot /优缺点?
优点:

1、搭建项目快,几秒钟就可以搭建完成; 2、让测试变的简单: 内置了JUnit、Spring Boot Test等多种测试框架,方便测试; 3、Spring Boot让配置变的简单: Spring Boot的核心理念:约定大约配置,如:pring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置 4、独立运行: Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。 5、方便监控: 使用Spring Boot Actuator组件提供了应用的系统监控,可以查看应用配置的详细信息; 6.自动配置: Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring;boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。 7.无代码生成和XML配置 Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的

缺点:
Spring Boot 虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。

三、spring boot 核心配置文件是什么?
1.Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

【spring|Spring Boot常见面试题及答案】2.bootstrap 配置文件有以下几个应用场景。
●使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息; ●一些固定的不能被覆盖的属性; ●一些加密/解密的场景;

四、spring boot 配置文件有哪几种类型?它们有什么区别?
有.properties 和 .yml,它们的区别主要是书写格式不同。
1、.properties
app.user.name = javastack

2、.yml
app: user: name: javastack

另外,.yml 格式不支持 @PropertySource 注解导入配置。
五、spring boot 有哪些方式可以实现热部署?
主要有两种方式:
● Spring Loaded
● Spring-boot-devtools
六、springboot容器启动流程
看看这里
七、SpringBoot、Spring MVC和Spring有什么区别
Spring
Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。
当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。
Spring MVC
Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot
Spring和Spring MVC的问题在于需要配置大量的参数。
SpringBoot通过一个自动配置和启动的项来解决这个问题
八、什么是Spring Boot Starter
1、Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
2、Starters命名
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。
第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
九、为什么需要spring-boot-maven-plugin
spring-boot-maven-plugin提供了一些像jar一样打包或者运行应用程序的命令。
spring-boot:run 运行SpringBoot应用程序; spring-boot:repackage 重新打包你的jar包或者是war包使其可执行 spring-boot:start和spring-boot:stop管理Spring Boot应用程序的生命周期 spring-boot:build-info生成执行器可以使用的构造信息

十、什么是YAML
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
十一、SpringBoot自动配置的原理
在Spring程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.gfactories文件,改文件里配置了所有需要被创建的Spring容器中的bean
自动配置原理
十二、SpringBoot 打成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 ,一个可执行,一个可引用。
十三、运行SpringBoot有几种方式?
1、打包用命令或者放到容器中运行 mavn clean package -Dmaven.test.skip=true 2、用Maven或Gradle插件运行 <--添加依赖-->maven-war-plugin 3.0.0 3、直接执行main方法运行

十四、什么是Spring Data
Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:
1、SpringData 项目支持 NoSQL 存储:
MongoDB (文档数据库) Neo4j(图形数据库) Redis(键/值存储) Hbase(列族数据库)

2、SpringData 项目所支持的关系数据存储技术:
JDBC JPA

Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
十五、什么是FreeMarker模板?
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面。
十六、如何实现Spring Boot应用程序的安全性?
为了实现Spring Boot的安全性,使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
十七、如何使用Spring Boot实现异常处理
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。通过实现一个ControlerAdvice类,来处理控制类抛出的所有异常。
十八、Spring Boot的核心注解是哪些?他主由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
1、@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。 2、@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: 3、@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。
十九、开启 Spring Boot 特性有哪几种方式
1、继承spring-boot-starter-parent项目
2、导入spring-boot-dependencies项目依赖
二十、Spring Boot 如何定义多套不同环境配置
applcation.propertiesapplication-dev.propertiesapplication-test.propertiesapplication-prod.properties

二十一、你如何理解 Spring Boot 配置加载顺序?
1.项目内配置文件
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
spring|Spring Boot常见面试题及答案
文章图片

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。
我们也可以通过配置spring.config.location来改变默认配置。
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。
指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
2.外部配置加载顺序
SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
1.命令行参数
所有的配置都可以在命令行上进行指定;
多个配置用空格分开; –配置项=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
由jar包外向jar包内进行寻找,优先加载待profile的,再加载不带profile的。
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性

    推荐阅读