这是我面试了很多中大厂总结出来的高频面试题,如果对你有帮助,希望大家点点赞,你们的点赞是我创作的动力。

什么是 Spring Boot?

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

SpringBoot的优点:

  • 独立运行,Spring Boot 而且内嵌了各种 servlet 容器(Tomcat、Jetty 等),Spring Boot 只要打成一个可执行的 jar 包就能独立运行,java -jar xxx.jar。
  • 简化配置,spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
  • 自动装配,Spring Boot 扫描所有jar包的META-INF/spring.factories,自动装配类
  • 应用监控,Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。

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

核心配置文件 application 和 bootstrap。

bootstrap的优先级高于application,如果有一些固定的不能被覆盖的属性,建议放在bootstrap,反之可以放在application,application更容易理解。

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

.properties 和 .yml,本质区别就是书写格式不同。

  • properties
server.port = 8080
  • yml
server:port: 8080

注意:yml 格式不支持 @PropertySource 注解导入配置。

运行 Spring Boot 有哪几种方式?

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

2)用 Maven/ Gradle 插件运行

3)直接执行 main 方法运行

SpringBoot的核心注解是什么?由那些注解组成?

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

主要组合包含了以下 3 个注解:

  • @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
  • @ComponentScan:Spring组件扫描。

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

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

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = cache.get(classLoader);if (result != null) {return result;}try {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result = new LinkedMultiValueMap<>();while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {List<String> factoryClassNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray((String) entry.getValue()));result.addAll((String) entry.getKey(), factoryClassNames);}}cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}
}

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

你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。

第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

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

如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。

如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以通过@Order注解控制

Spring Boot 有哪几种读取配置的方式?

  • @Value
@Component
public class HttpClientParam {@Value("${http.maxTotal}")private Integer maxTotal;public String getMaxTotal() {return maxTotal;}public void setMaxTotal(String maxTotal) {this.maxTotal = maxTotal;}
}
  • @ConfigurationProperties
/*** HttpClient连接池* * @author hzy**/
@Configuration
@ConfigurationProperties(prefix = "http")
public class HttpClientParam {private Integer maxTotal;private Integer defaultMaxPerRoute;private Integer connectTimeout;private Integer connectionRequestTimeout;private Integer socketTimeout;public Integer getMaxTotal() {return maxTotal;}public void setMaxTotal(Integer maxTotal) {this.maxTotal = maxTotal;}public Integer getDefaultMaxPerRoute() {return defaultMaxPerRoute;}public void setDefaultMaxPerRoute(Integer defaultMaxPerRoute) {this.defaultMaxPerRoute = defaultMaxPerRoute;}public Integer getConnectTimeout() {return connectTimeout;}public void setConnectTimeout(Integer connectTimeout) {this.connectTimeout = connectTimeout;}public Integer getConnectionRequestTimeout() {return connectionRequestTimeout;}public void setConnectionRequestTimeout(Integer connectionRequestTimeout) {this.connectionRequestTimeout = connectionRequestTimeout;}public Integer getSocketTimeout() {return socketTimeout;}public void setSocketTimeout(Integer socketTimeout) {this.socketTimeout = socketTimeout;}}
http:# 最大连接数maxTotal: 100# 并发数defaultMaxPerRoute: 20connectTimeout: 10000connectionRequestTimeout: 500socketTimeout: 10000
  • @PropertySource+@Value
@Component
@PropertySource(value = { "config/http-config.properties"})
public class HttpClientParam {@Value("${http.maxTotal}")private Integer maxTotal;public String getMaxTotal() {return maxTotal;}public void setMaxTotal(String maxTotal) {this.maxTotal = maxTotal;}
}

Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。

spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。

属性配置日志

Spring Boot支持属性配置日志参数,这个不是很灵活,不细讲。

参考配置:

# LOGGING
logging.config= # Location of the logging configuration file. For instance `classpath:logback.xml` for Logback
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name. For instance `myapp.log`
logging.level.*= # Log levels severity mapping. For instance `logging.level.org.springframework=DEBUG`
logging.path= # Location of the log file. For instance `/var/log`
logging.pattern.console= # Appender pattern for output to the console. Only supported with the default logback setup.
logging.pattern.file= # Appender pattern for output to the file. Only supported with the default logback setup.
logging.pattern.level= # Appender pattern for log level (default %5p). Only supported with the default logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.

如:

logging.level.root=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

自定义日志文件

根据不同的日志框架,默认加载的日志配置文件的文件名,放在资源根目录下,其他的目录及文件名不能被加载。

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

既然默认自带了Logback框架,Logback也是最优秀的日志框架,往资源目录下创建一个logback-spring.xml即可,下面是一个参考配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><springProperty scope="context" name="APP_NAME" source="spring.application.name"/><springProperty scope="context" name="APP_PORT" source="server.port"/><springProperty scope="context" name="DEFAULT_APP_PORT" source="spring.application.port"/><property name="OS_NAME" value="${os.name}"/><if condition='property("OS_NAME").contains("Windows")'><then><property name="LOG_PATH" value="${LOG_PATH:-E:/logs}" /></then><else><property name="LOG_PATH" value="${LOG_PATH:-/log}" /></else></if>       <property name="LOG_DIR" value="${APP_NAME:-system}" /><property name="APP_PORT" value="${APP_PORT:-${DEFAULT_APP_PORT:-0}}" /><if condition='!property("APP_PORT").equals("0")'><then><property name="LOG_DIR" value="${LOG_DIR}-${APP_PORT}" /></then></if><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名 --><FileNamePattern>${LOG_PATH}/${LOG_DIR}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数 --><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 按照每天生成日志文件 error级别 --><appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter>   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名 --><FileNamePattern>${LOG_PATH}/${LOG_DIR}/error.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数 --><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!--myibatis log configure --><logger name="com.apache.ibatis" level="TRACE" /><logger name="java.sql.Connection" level="DEBUG" /><logger name="java.sql.Statement" level="DEBUG" /><logger name="java.sql.PreparedStatement" level="DEBUG" /><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /><appender-ref ref="FILE-ERROR" /></root></configuration>

强烈推荐使用logback-spring.xml作为文件名,因为logback.xml加载太早。

日志初始化在ApplicationContext创建之前,所以@PropertySources加载的配置是读取不到的,系统环境变量、Spring Environment及application,bootstrap配置文件中的信息可以读取到。

读取系统环境属性:

<property name = "LOG_PATH" value = "${LOG_PATH:-E:/logs}" />

读取当前应用Environment中的属性:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"defaultValue="localhost"/>

Spring Boot也支持通过springProfile来加载不同profiles下的配置。

<springProfile name="staging"><!-- configuration to be enabled when the "staging" profile is active -->
</springProfile><springProfile name="dev, staging"><!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile><springProfile name="!production"><!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

SpringBoot 实现热部署有哪几种方式?

主要有两种方式:

  • Spring Loaded
  • Spring-boot-devtools

2021最新Spring Boot 面试题相关推荐

  1. 【2021最新版】Spring Boot面试题总结(92道题含答案解析)

    文章目录 1.什么是Spring Boot? 2.为什么要用SpringBoot? 3.Spring Boot有哪些优点? 4.Spring Boot的核心注解是哪个?它主要由哪几个注解组成的? 5. ...

  2. 【金三银四】Spring Boot面试题(2021最新版)

    目录 前言 1. 什么是SpringBoot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spr ...

  3. Spring Boot面试题(2020最新版)

    转载自  Spring Boot面试题(2020最新版) 概述 什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主 ...

  4. 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人

    转载自  紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只 ...

  5. 2021最新Spring Security知识梳理

    2021最新Spring Security知识梳理 一.SpringSecurity 框架简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spri ...

  6. Spring Boot 进阶,Spring Boot面试题高频出处

    上一篇带领大家初步了解了如何使用 Spring Boot 搭建框架,通过 Spring Boot 和传统的 SpringMVC 架构的对比,我们清晰地发现 Spring Boot 的好处,它使我们的代 ...

  7. Spring Boot 面试题

    转载自  Spring Boot 面试题 问题一 什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面 ...

  8. Spring Boot面试题

    转载自 Spring Boot面试题 Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一Spring Boot.Spring ...

  9. Spring Boot 面试题整理

    Spring Boot 面试题整理 2018年08月12日 22:32:35 Time_sg 阅读数 19380 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文 ...

最新文章

  1. 开发视频监控系统纪实 四 开康开发dll 修正
  2. Javascript Array对象
  3. asp.net application,session,static 几种变量生命周期及用法 收藏
  4. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
  5. 前端新人如何有效地提高自己
  6. dp------最长公共子序列问题
  7. Linux 命令(95)—— test 命令
  8. 海洋磁力探测-G882海洋磁力仪内业处理软件MAP2000 操作指南
  9. vue3前端获取文件md5码
  10. Pic3D裸眼3D贴膜诞生
  11. sql 2000及SP4 安装
  12. 多版本CUDA安装切换及CUDA卸载方法
  13. PCB阻焊油墨知识汇总
  14. 年会模板汇总:PPT、策划案、游戏节目、流程、邀请函、背景音乐、主题词
  15. 【转】UWP 和 WPF 对比
  16. springboot整合dubbox+zookeeper
  17. 解决Qt 5程序运行时界面假死的方法
  18. python神经网络
  19. 【重构前端知识体系之HTML】讲讲对HTML5的一大特性——语义化的理解
  20. 计算机操作员绘图员,常用通用职业工种分类表.PDF

热门文章

  1. 一篇毕业设计论文 | 面向对象的软件测试
  2. 基本光照与阴影(一)
  3. android 树叶飘落动画,逼真的HTML5树叶飘落动画
  4. Cmd模式下的入侵技术大全
  5. 1.2 Python介绍
  6. AMD锐龙7000系列CPU命名混乱?三分钟帮你看明白
  7. matlab不连续分段函数,分段函数画出的曲面不连续如何办?
  8. 像素游戏画法_点画法遇到像素化
  9. Python使用pypinyin实现中文拼音转换教程
  10. 浙江省高校计算机等级考试二级Python 程序设计题0|2023备考