史上最全SpringBoot面试题(一)

简介: 史上最全SpringBoot面试题(一)

一、什么是 Spring Boot?


参考回答:

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

二、 Spring Boot的优点?


参考回答:

Spring Boot 优点非常多,如:

(1)独立运行

Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

(2)简化配置

spring-boot-starter-web启动器自动依赖其他组件,减少了maven的配置。

(3)自动配置

Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。

(4)无代码生成和XML配置

Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。

(5)应用监控

Spring Boot提供一系列端点可以监控服务及应用,做健康检测。


三、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?


参考回答:

Spring Boot 中有以下两种配置文件:

(1)bootstrap (yml 或者properties)

(2)application (yml 或者properties)

bootstrap/ application 的区别:

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,另外一种是 application,bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性:

(1)boostrap 由类 ApplicationContext 加载,比 applicaton 优先加载

(2)boostrap 里面的属性不能被覆盖

bootstrap/ application 的应用场景:

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。


bootstrap 配置文件有以下几个应用场景:


(1)使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;


(2)一些固定的不能被覆盖的属性


(3)一些加密/解密的场景。

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


参考回答:
properties和yml,它们的区别主要是书写格式不同。

(1)properties

app.user.name = java

(2)yml

app:
  user:
    name: javastack

另外,yml格式不支持 @PropertySource 注解导入配置。


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


参考回答:

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

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

(2)@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:

1@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。


(3)@ComponentScan:Spring组件扫描。

六、开启 Spring Boot 特性有哪几种方式?


参考回答:

有以下两种方式:(1)继承spring-boot-starter-parent项目

1<parent>  
2<groupId>org.springframework.boot</groupId>   
3<artifactId>spring-boot-starter-parent</artifactId>
4<version>1.5.6.RELEASE</version>
5</parent>


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


1<dependencyManagement>
 2    <dependencies>
 3        <dependency>
 4            <groupId>org.springframework.boot</groupId>
 5            <artifactId>spring-boot-dependencies</artifactId>
 6            <version>1.5.6.RELEASE</version>
 7            <type>pom</type>
 8            <scope>import</scope>
 9        </dependency>
10    <dependencies>
11</dependencyManagement>


Spring Boot依赖需要注意以下几点:
1) 属性覆盖只对继承有效
Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的,如果要修改里面组件的版本,只需要添加如下属性覆盖即可,但这种方式只对继承有效,导入的方式无效。

1<properties>
2    <slf4j.version>1.7.25<slf4j.version>
3</properties>


2) 如果导入的方式要实现版本的升级,达到上面的效果,这样也可以做到,把要升级的组件依赖放到Spring Boot之前。


aca59fa0d895e08e8bedba3e9ff9b4cd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

注意:要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。


七、Spring Boot 需要独立的容器运行吗?


参考回答:

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


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


参考回答:

(1)打包用命令或者放到容器中运行。
(2)用 Maven/Gradle 插件运行。
(3)直接执行 main 方法运行。


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


参考回答:

Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。

1org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader)
 1public static List<String> loadFactoryNames(Class<?> factoryClass,ClassLoader classLoader){
 2
 3        String factoryClassName = factoryClass.getName();
 4        try{
 5            Enumeration<URL> urls = (classLoader!=null?classLoader.getResources(FACTORIES_RESOURCE_LOCATION):lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
 6
 7            List<String> result = new ArrayList<String>();
 8
 9            while(urls.hasMoreElements()){
10                    URL url = urls.nextElement();
11                    Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
12                    String factoryClassNames = properties.getProperty(factoryClassName);
13                    result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
14
15            }
16            return result;
17        }catch(IOException ex){
18
19            throw new IllegalArgumentException("Unable to load ["+factoryClass.getName()+"] factories from location ["+FACTORIES_RESOURCE_LOCATION+"]",ex);
20
21    }
22
23}

这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类。

1/**
2 * The location to look for factories.
3 * <p>Can be present in multiple JAR files.
4 */
5
6public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

查看Spring Boot自带的自动配置的包:spring-boot-autoconfigure-1.5.6.RELEASE.jar,打开其中的META-INF/spring.factories文件会找到自动配置的映射。

ae483dae4d7c7b79ff50447ea81c7163_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


再来看看数据源自动配置的实现注解


606bac3dfce7277833a15010de8bb875_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。


十、如何在 Spring Boot 启动的时候运行一些特定的代码?


参考回答:


如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。
(1)CommandLineRunner:启动获取命令行参数
f0a833432d839cb28a4e8134fa7b6a16_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

(2)ApplicationRunner:启动获取应用启动的时候参数
65df0ed1b569761a54e78b872a1592e8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

使用方式:
06132685e85cef9b83940b1b41e4c300_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

或者这样:
66e93a111e9f5baee338634efcd84e00_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

启动顺序:

如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解。


相关文章
|
2月前
|
Java 应用服务中间件 数据库连接
面试官:SpringBoot如何优雅停机?
面试官:SpringBoot如何优雅停机?
146 0
|
3月前
|
消息中间件 Java Kafka
Spring Boot面试题
Spring Boot 是一套快速开发框架,随着微服务架构应用不断普及,Spring Boot 的研发技术的掌握已经成为研发人员必会技能。与此同时,Spring Boot 开源生态建设能力非常强大,提供了很多应用组件,让Spring Boot 有丰富的三方开源软件的使用。
72 0
Spring Boot面试题
|
2月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
138 0
|
5天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
13 0
|
1月前
|
Java 应用服务中间件 微服务
Spring Boot常见面试题总结
Spring Boot常见面试题总结
21 1
|
2月前
|
XML Java 数据格式
Spring Boot面试讲解
Spring Boot面试讲解
15 0
|
2月前
|
XML Java 数据格式
【springboot原理篇】Bean的加载方式,面试必看
【springboot原理篇】Bean的加载方式,面试必看
|
4月前
|
缓存 NoSQL Java
面试官:SpringBoot如何实现缓存预热?
面试官:SpringBoot如何实现缓存预热?
86 0
|
4月前
|
XML 开发框架 监控
面试题:springboot比spring有哪些优点?
面试题:springboot比spring有哪些优点?
86 0
|
4月前
|
Java 数据库连接 Spring
面试题:springboot的自定义配置有哪些
面试题:springboot的自定义配置有哪些
21 0