2021最新Spring Boot 面试题
这是我面试了很多中大厂总结出来的高频面试题,如果对你有帮助,希望大家点点赞,你们的点赞是我创作的动力。
什么是 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 面试题相关推荐
- 【2021最新版】Spring Boot面试题总结(92道题含答案解析)
文章目录 1.什么是Spring Boot? 2.为什么要用SpringBoot? 3.Spring Boot有哪些优点? 4.Spring Boot的核心注解是哪个?它主要由哪几个注解组成的? 5. ...
- 【金三银四】Spring Boot面试题(2021最新版)
目录 前言 1. 什么是SpringBoot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spr ...
- Spring Boot面试题(2020最新版)
转载自 Spring Boot面试题(2020最新版) 概述 什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主 ...
- 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人
转载自 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只 ...
- 2021最新Spring Security知识梳理
2021最新Spring Security知识梳理 一.SpringSecurity 框架简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spri ...
- Spring Boot 进阶,Spring Boot面试题高频出处
上一篇带领大家初步了解了如何使用 Spring Boot 搭建框架,通过 Spring Boot 和传统的 SpringMVC 架构的对比,我们清晰地发现 Spring Boot 的好处,它使我们的代 ...
- Spring Boot 面试题
转载自 Spring Boot 面试题 问题一 什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面 ...
- Spring Boot面试题
转载自 Spring Boot面试题 Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一Spring Boot.Spring ...
- Spring Boot 面试题整理
Spring Boot 面试题整理 2018年08月12日 22:32:35 Time_sg 阅读数 19380 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文 ...
最新文章
- 开发视频监控系统纪实 四 开康开发dll 修正
- Javascript Array对象
- asp.net application,session,static 几种变量生命周期及用法 收藏
- oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
- 前端新人如何有效地提高自己
- dp------最长公共子序列问题
- Linux 命令(95)—— test 命令
- 海洋磁力探测-G882海洋磁力仪内业处理软件MAP2000 操作指南
- vue3前端获取文件md5码
- Pic3D裸眼3D贴膜诞生
- sql 2000及SP4 安装
- 多版本CUDA安装切换及CUDA卸载方法
- PCB阻焊油墨知识汇总
- 年会模板汇总:PPT、策划案、游戏节目、流程、邀请函、背景音乐、主题词
- 【转】UWP 和 WPF 对比
- springboot整合dubbox+zookeeper
- 解决Qt 5程序运行时界面假死的方法
- python神经网络
- 【重构前端知识体系之HTML】讲讲对HTML5的一大特性——语义化的理解
- 计算机操作员绘图员,常用通用职业工种分类表.PDF