史上最全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注解。


相关文章
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
118 0
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
377 37
|
25天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
5月前
|
消息中间件 缓存 Java
Spring Boot最经典的20道面试题,你都会了吗?
Spring Boot最经典的20道面试题,你都会了吗?
171 0
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
100 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
5月前
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库
|
5月前
|
设计模式 NoSQL Java
网易面试:SpringBoot如何开启虚拟线程?
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 > PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: ![image.png](https:
64 0
网易面试:SpringBoot如何开启虚拟线程?
|
5月前
|
监控 NoSQL Java
【面试高频 time:】SpringBoot整合Redisson实现分布式锁
【面试高频 time:】SpringBoot整合Redisson实现分布式锁
40 0
|
5月前
|
安全 前端开发 Java
杨校老师课堂之Spring Boot框架面试题【开发工程师面试前必看】
杨校老师课堂之Spring Boot框架面试题【开发工程师面试前必看】
42 0
下一篇
无影云桌面