【㊫SpringBoot】SpringBoot面试题

什么是 Spring Boot?

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

为什么要用SpringBoot?

快速开发,快速整合,配置简化、内嵌服务容器。

SpringBoot与SpringCloud 区别?

SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。

Spring Boot 有哪些优点?

Spring Boot 主要有如下优点:

  • 容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架。
  • 开箱即用,远离繁琐的配置
  • 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
SpringBoot总结起来,就是使编码变简单、配置变简单、部署变简单、监控变简单等等

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

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

  • @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项

例如:java 如关闭数据源自动配置功能

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
  • @ComponentScan:Spring组件扫描。

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

Spring Boot 支持Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,但是不管是哪一种日志框架,它都支持将日志输出到控制台或者文件中。

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

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

Spring Boot支持哪些嵌入式Web容器?

Spring Boot支持的嵌入式servlet容器有:Tomcat、Jetty、Undertow

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

  1. 继承spring-boot-starter-parent项目
  2. 导入spring-boot-dependencies项目依赖

SpringBoot事务的使用?

  • 启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的)。
  • 在使用事务的public(只有public支持事务)方法(或者类-相当于该类的所有public方法都使用)加上@Transactional注解。

Async异步调用方法?

在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步调用。

注意:需要在启动类加入@EnableAsync使异步调用@Async注解生效。
@Configuration
//主要是为了扫描范围包下的所有 @Async注解
@EnableAsync
public class AsyncConfiguration {
 
}

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

可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。

Spring Boot中如何解决跨域问题?

通过实现 WebMvcConfigurer接口然后从addCorsMappings方法解决跨域问题。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").maxAge(3600);
    }
}
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    } 
}

SpringBoot的自动配置原理是什么?

主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能

有了这个EnableAutoConfiguration的话就会:

  1. 从配置文件META_INF/Spring.factories加载可能用到的自动配置类
  2. 去重,并将exclude和excludeName属性携带的类排除
  3. 过滤,将满足条件(@Conditional)的自动配置类返回

你如何理解 Spring Boot 配置加载顺序?

在 Spring Boot 里面,可以使用以下几种方式来加载配置:

  1. properties文件;
  2. YAML文件;
  3. 系统环境变量;
  4. 命令行参数;

Spring Boot 是否可以使用 XML 配置 ?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource注解可以引入一个 XML 配置

Spring boot 核心配置文件是什么?bootstrap.properties 和application.properties 有何区别 ?

纯做 Spring Boot 开发,可能不太容易遇到bootstrap.properties配置文件,但是在结合Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

spring boot 核心的两个配置文件:bootstrap (. yml 或者 . properties),boostrap 由父 ApplicationContext 加载的,比applicaton优先加载,配置在应用程序上下文的引导阶段生效

一般来说我们在 Spring Cloud 配置就会使用这个文件,且 boostrap 里面的属性不能被覆盖;application (. yml 或者 . properties):由ApplicatonContext 加载,用于spring boot项目的自动化配置。

Spring Boot 中的监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要功能之一,Spring boot 监视器可以访问生产环境中正在运行的应用程序的当前状态。监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态

SpringBoot多数据源拆分的思路?

先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties

读取properties中的配置,使用@MapperScan注册到对应的mapper包中

SpringBoot微服务中如何实现 session 共享 ?

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,常见的方案就是 Spring Session + Redis 来实现 session 共享

将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

Spring Boot 中的 starter 到底是什么 ?

首先它提供了一个自动化配置类,一般命名为XXXAutoConfiguration,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。

正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter

spring-boot-starter-parent 有什么用 ?

我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是spring-boot-starter-parent,spring-boot-starter-parent主要有如下作用:

  • 定义了 Java 编译版本为 1.8
  • 使用 UTF-8 格式编码
  • 继承自spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
  • 执行打包操作的配置。
  • 自动化的资源过滤。
  • 自动化的插件配置。
  • 针对application.properties和application.yml的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如application-dev.properties和application-dev.yml。

Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过java -jar xxx.jar命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

Spring Boot 的 jar 无法被其他项目依赖,主要还是它和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在\BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

SpringBoot 中静态资源直接映射的优先级是怎样的?

SpringBoot 静态资源直接映射为/**,可以通过根目录来访问。/META-INF/resources/webjars/映射为/webjars/,通过访问 /webjar 访问。优先级顺序为:META-INF/resources > resources > static > public。

 

posted @ 2023-04-03 08:51  残城碎梦  阅读(58)  评论(0编辑  收藏  举报