螺竹编程
发布于 2024-05-19 / 4 阅读
0

Java面试题/后端框架:SpringBoot面试题

Spring核心

什么是控制反转和依赖注入?

控制反转(IoC)是一种软件设计原则,它将对象的创建和依赖关系的解析转移到容器中,而不是在对象内部进行。

依赖注入(DI)是控制反转的一种实现方式,通过容器将依赖关系注入到对象中。

Spring中的AOP是什么?它的作用是什么?

AOP(面向切面编程)是Spring Framework的一个重要特性,用于处理系统中的横切关注点。通过AOP,可以将与业务逻辑无关的功能(如日志记录、事务管理)从应用程序的核心逻辑中分离出来,提高了代码的模块化和可维护性。

SpringBoot核心

SpringBoot是什么

Spring Boot是一个用于简化Spring应用程序开发的开源框架。它基于Spring框架,提供了自动配置和约定优于配置的方式,从而使开发人员能够更快速、更轻松地创建独立的、生产级别的Spring应用程序。

SpringBoot提供了哪些核心功能?

Spring Boot 提供了以下核心功能:

  1. 快速构建:Spring Boot 提供了一些默认的配置,使得开发者可以非常快速地构建基于 Spring 框架的应用程序。

  2. 自动配置:Spring Boot 可以根据应用程序的依赖和环境自动配置各种组件,减少了繁琐的手动配置过程。

  3. 嵌入式服务器:Spring Boot 内置了多个常用的嵌入式服务器,如 Tomcat、Jetty、Undertow 等,可以方便地将应用程序打包成可执行的 JAR 文件,并直接运行。

  4. Actuator:Spring Boot 提供了 Actuator 模块,可以实时监控应用程序的运行状态,包括内存使用、CPU 使用、HTTP 请求等等。

  5. 外部化配置:Spring Boot 支持在不同环境中使用不同的配置文件,如 application.properties、application.yml 等,便于应用程序的部署和管理。

  6. Spring Boot Starter:Spring Boot Starter 是一组预定义的依赖集合,可以方便地快速构建各种类型的应用程序,如 Web 应用程序、数据访问应用程序、消息队列应用程序等等。

Spring Boot的自动配置是如何工作的?

Spring Boot的自动配置是基于Spring框架的条件化配置机制实现的。在Spring Boot中,自动配置是通过条件化注解来实现的。这些注解会根据特定的条件来判断是否需要实例化一个Bean或应用某些配置。

Spring Boot中的自动配置主要是通过以下步骤完成的:

  1. Spring Boot启动时,会扫描classpath下的所有jar包,查找包含Spring自动配置的类。

  2. Spring Boot会根据一系列的条件判断是否需要应用某些自动配置,这些条件通常包括classpath中是否存在特定的类、特定的Bean是否存在、特定的属性是否被配置等。

  3. 如果满足自动配置的条件,Spring Boot会根据预定义的规则,自动配置相应的Bean和组件,并将它们注册到Spring的应用上下文中。

  4. 如果存在多个自动配置的Bean,Spring Boot会根据优先级和条件判断来确定哪些Bean会被应用。

通过这样的机制,Spring Boot可以在启动时自动配置应用的环境和组件,从而简化应用的开发和部署工作。同时,开发人员也可以通过自定义条件化注解来扩展Spring Boot的自动配置机制,以满足特定的需求。

SpringBoot核心注解?

以下是Spring Boot中的一些核心注解:

  1. @SpringBootApplication:这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解,用于标识一个Spring Boot应用程序的主类。

  2. @RestController:用于声明一个控制器类,并将其中的方法返回的结果直接作为HTTP响应体返回给客户端,常用于构建RESTful API。

  3. @RequestMapping:用于将HTTP请求映射到控制器方法上,可以指定请求路径、HTTP请求方法、请求参数等。

  4. @Autowired:自动装配注解,用于将需要依赖注入的Bean对象自动注入到控制器、服务等组件中。

  5. @Value:属性注入注解,用于将配置文件中的属性值注入到Bean对象的属性中。

  6. @ConfigurationProperties:配置属性注解,用于将配置文件中的属性值注入到自定义的JavaBean对象中,常用于将一组属性值注入到一个对象中。

  7. @Component:通用组件注解,用于标识一个普通的Java类为Spring容器中的组件。

Spring Boot配置

SpringBoot Starter是什么?

在Spring Boot中,starter是一种依赖集合,它包含了在特定场景下使用Spring Boot所需的所有依赖项。它是一种简化Spring Boot应用程序配置的方式,可以帮助开发人员快速搭建一个基于Spring Boot的应用程序。

Spring Boot Starter通常以“spring-boot-starter-”作为前缀,并在后面添加一些描述性的单词来表示其所包含的依赖项的类型。例如,"spring-boot-starter-web"包含了构建Web应用程序所需的所有依赖项。

使用Starter可以避免手动添加许多依赖项,这些依赖项通常需要根据应用程序的需求进行选择和配置。Spring Boot Starter已经为您做好了这些工作,因此您只需要添加一个Starter到您的项目中,即可使用Starter所提供的默认配置和依赖项。

spring-boot-starter-parent的作用?

spring-boot-starter-parent 是 Spring Boot 项目的父级依赖,它提供了一些默认的配置和依赖项,使得 Spring Boot 应用程序的构建和管理变得更加简单。它是 Spring Boot 用来管理 Maven 构建的核心依赖之一。

spring-boot-starter-parent 实际上是一个 Maven POM(Project Object Model)文件,它提供了默认的 Maven 配置和依赖项,包括:

  • 默认的编译器级别和编码方式;

  • Maven 中心库的默认镜像地址;

  • Spring Boot 应用程序的默认版本号;

  • Spring Boot 的依赖管理,包括 Spring Framework、Spring Boot Starter、Spring Boot Test 等等;

  • 插件管理,包括 Maven Compiler 插件、Maven Surefire 插件、Maven Jar 插件等等。

使用 spring-boot-starter-parent 作为父级依赖可以让开发者在创建 Spring Boot 应用程序时避免重复配置,减少代码量,提高开发效率。此外,使用 spring-boot-starter-parent 还可以避免冲突和版本不一致等问题,因为它可以管理所有的 Spring Boot 相关依赖,确保它们的版本一致性。

SpringBoot配置的加载顺序是怎样的?

在Spring Boot中,配置文件的加载顺序是比较有规律的。具体的加载顺序如下:

  1. 命令行参数:Spring Boot可以通过命令行参数来指定配置文件的位置,如:java -jar app.jar --spring.config.location=classpath:/application.yml。通过这种方式指定的配置文件会优先于其他配置文件被加载。

  2. jar包外部的application-{profile}.properties/yml文件:如果项目根目录下存在application-{profile}.properties/yml文件,Spring Boot会优先加载这些文件。其中{profile}是指当前激活的Profile,如果没有激活的Profile,则会加载不带-profile后缀的文件。

  3. jar包内部的application-{profile}.properties/yml文件:如果项目根目录下不存在application-{profile}.properties/yml文件,Spring Boot会搜索jar包内部的classpath:/下的application-{profile}.properties/yml文件,如果找到则加载它们。

  4. jar包外部的application.properties/yml文件:如果项目根目录下不存在任何application-{profile}.properties/yml文件,Spring Boot会加载application.properties/yml文件。其中application.yml的优先级高于application.properties

  5. jar包内部的application.properties/yml文件:如果项目根目录下和jar包内部都不存在任何配置文件,Spring Boot会搜索classpath:/下的application.properties/yml文件,如果找到则加载它们。

需要注意的是,如果同一个配置项在多个配置文件中都有定义,那么后加载的配置文件会覆盖先加载的配置文件中的同名配置项。此外,Spring Boot还支持通过@PropertySource注解来加载其他的配置文件。

如何统一Spring Boot版本?

在一个项目中,如果你使用了多个Spring Boot模块,你可能会遇到版本不一致的问题。为了避免这个问题,你可以通过在父工程中指定Spring Boot的版本来统一管理。

在父工程的pom.xml文件中,你可以使用<dependencyManagement>元素来指定Spring Boot的版本,例如:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.5.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在这个例子中,<dependencyManagement>元素包含一个<dependency>元素,它的<groupId><artifactId>指定了Spring Boot的依赖管理模块,<version>指定了具体的版本号。<type>指定了依赖的类型为pom,<scope>指定了依赖的作用域为import。

通过这样的方式,所有子模块都可以继承父工程的Spring Boot版本,而不需要在每个子模块中都指定一遍版本号。如果你需要使用不同版本的Spring Boot,你可以在子模块中覆盖父工程中指定的版本号。

其他

如何在Spring Boot应用程序中处理异常?

在Spring Boot应用程序中处理异常可以通过以下方式:

  1. 使用@ControllerAdvice注解创建一个全局异常处理器,处理应用程序中的异常。

  2. 使用@ExceptionHandler注解在控制器中处理特定类型的异常。

  3. 自定义异常类,并在需要时抛出异常。