2021最新Spring Boot 面试题

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> loadSpringFactories(@Nullable ClassLoader classLoader) {

MultiValueMap<String, String> result = cache.get(classLoader);

if (result != null) {

return result;

}

try {

Enumeration 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 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: 20

connectTimeout: 10000

connectionRequestTimeout: 500

socketTimeout: 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

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 logging.level.org.springframework.web=DEBUG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值