SpringBoot面试题
- 为什么要用SpringBoot
- 因为SpringBoot的优点非常多
- 独立运行:SpringBoot内嵌了各种servlet容器,如Tomcat、Jetty等,现在不再需要打成war包部署到容器中,SpringBoot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内
- 简化配置:SpringBoot提供了很多starter依赖,可以快速集成其他框架和组件,大大简化了配置过程。
- 自动配置:SpringBoot的自动配置非常强大,可以根据类路径下的jar包、类文件和注解来自动配置bean,减少了手动配置的工作量。
- 无代码生成和XML配置:SpringBoot使用条件注解和自动配置来完成所有的配置工作,避免了代码生成和繁琐的XML配置文件,让开发更加简洁、清晰。
- 应用监控:SpringBoot提供了很多有用的端点和指标,可以用来监控和管理应用程序,包括健康检查、性能监控、日志查看等。此外,SpringBoot还可以与Actuator集成,提供更加丰富的监控功能。
- 因为SpringBoot的优点非常多
- SpringBoot的核心注解是哪个?它主要由哪几个注解组成的
- SpringBoot的核心注解是
@SpringBootApplication
,它主要是由三个注解组成,分别是@Configuration
:声明当前类是一个配置类@EnableAutoConfiguration
:开启SpringBoot的自动配置功能@ComponentScan
:开启组件扫描,会自动扫描当前包及其子包下的所有类,并注册为Spring的Bean
- 这三个注解组合在一起,可以让SpringBoot自动配置并启动应用程序。除此之外,SpringBoot还有很多其他注解,如
@RestController
、@Service
、@Repository
等,它们可以帮助我们更方便地创建控制器、服务层、数据访问层等组件
- SpringBoot的核心注解是
- 运行SpringBoot应用程序有哪几种方式
- 运行SpringBoot应用程序有以下几种方式
- 在IDE中运行:在集成开发环境(IDE)中,可以通过直接运行应用程序的主类来启动SpringBoot程序(main方法)
- 打包成可执行JAR包运行:SpringBoot提供了一种将应用程序打包成可执行的JAR包的方式,例如使用Maven插件,可以轻松将应用程序打包成一个单独的JAR文件,然后在命令行中运行该JAR文件即可启动应用程序
1
java -jar xxx.jar
- 在容器中运行:可以将SpringBoot应用程序部署到Web容器中,如Tomcat、Jetty等,然后启动容器即可运行应用程序。在部署时需要将应用程序打成WAR包,并将WAR包部署到相应的容器中
- 运行SpringBoot应用程序有以下几种方式
- 如何理解SpringBoot中的starters
- SpringBoot中的staters(启动器)是一种依赖管理的方式,它是一组预定义的依赖关系,可以方便地将常用的依赖库和框架引入到项目中。使用starters可以避免在pom.xml中一个一个引入依赖的麻烦,检查依赖管理的过程。(就好比你去steam的创意工坊找mod,一个一个找也太麻烦了,此时你就可以选择找一个常用mod合集)
- 如何在SpringBoot启动时运行一些特定的代码
- 在SpringBoot启动时,可以通过实现
ApplicationRunner
或CommandLineRunner
接口来运行一些特定的代码。这两个接口都是SpringBoot提供的回调接口,它们的作用是在SpringBoot应用程序启动完成之后,自动回调其中的run方法。在这个方法中可以编写一些初始化代码,如加载配置文件、初始化缓存等ApplicationRunner
接口的run方法中传入了一个ApplicationArguments
对象,可以用来获取命令行参数和选项等信息CommandLineRunner
接口的run方法中传入一个String
数组,可以用来获取命令行参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
public class MyRunner implements ApplicationRunner, CommandLineRunner {
public void run(ApplicationArguments args) throws Exception {
// 在此编写初始化代码,可以使用args获取命令行参数和选项等信息
}
public void run(String... args) throws Exception {
// 在此编写初始化代码,可以使用args获取命令行参数
}
}- 例如在上述代码中,
MyRunner
类实现了ApplicationRunner
和CommandLineRunner
接口,并重写了他们的run()
方法,在这里可以编写一些初始化代码。同时MyRunner
类使用@Component
注解,表示它是一个Spring的组件,可以被自动扫描并注册到Spring容器中。当SpringBoot应用程序启动时,run()
方法会被自动回调,从而执行其中的代码
- 在SpringBoot启动时,可以通过实现
- SpringBoot需要独立的容器运行吗
- 不需要。SpringBoot应用程序已经被打包成可执行的jar文件,可以独立完成,不需要外部容器。在启动应用程序时,SpringBoot会内嵌一个Tomcat、Jetty或Undertow等Servlet容器,从而可以直接运行Web应用程序,而不需要单独安装和配置外部的Servlet容器。这种方式成为嵌入式Servlet容器
- 当然,如果需要在生产环境中部署SpringBoot应用程序,可以将其打包成war包,然后部署到外部的Servlet容器中,如Tomcat、Jetty、WebSphere等,但这种部署方式失去了SpringBoot嵌入式容器的优势
- SpringBoot中的监视器是什么
- SpringBoot中的监视器(monitor)是一个内置的功能,它可以让开发者实时监控应用程序的运行状况和性能指标。监视器是基于SpringBootActuator模块实现的,可以通过HTTP接口或JMX访问
- 监视器可以提供一下几个功能
- 健康检查:通过访问
/actuator/health
接口,可以获取应用程序的健康状况。如果应用程序正常运行,会返回一个HTTP 200 OK
响应;如果应用程序异常,会返回一个HTTP 503 Service Unavailable
响应 - 指标监控:通过访问
/actuator/metrics
接口,可以获取应用程序的各种指标,如内存使用情况、CPU占用率、HTTP请求数等 - 环境信息:通过访问
/actuator/env
接口,可以获取应用程序的环境信息,如操作系统、Java版本、系统属性等 - 配置信息:通过访问
/actuator/configprops
接口,可以获取应用程序的配置信息,包括SpringBoot自动配置的所有Bean和其属性 - 执行器端点:除了以上几个端点,SpringBoot还提供了一系列执行器端点,可以访问应用程序内部状态和功能,如
/actuator/beans
、/actuator/mappings
、/actuator/trace
等
- 健康检查:通过访问
- 监视器功能可以通过在pom.xml文件中引入
spring-boot-starter-actuator
依赖实现,该依赖会自动配置Actuator模块,并启用所有的端点。可以通过配置文件或@Endpoint
注解对端点进行自定义配置
- 如何使用SpringBoot实现异常处理
- 在SpringBoot中,可以使用
@ControllerAdvice
注解定义一个全局异常处理器,来统一处理应用程序中的异常,具体实现步骤如下- 定义一个异常处理类,并使用
@ControllerAdvice
注解来标注,例如1
2
3
4
5
6
7
8
public class GlobalExceptionHandler {
public ResponseEntity<String> handleException(Exception e){
// 处理异常,并返回合适的HTTP响应
}
} - 在处理方法中定义
@ExceptionHandler
注解,指定需要处理的异常类型。可以使用多个@ExceptionHandler
注解定义不同的处理方法来处理不同类型的异常 - 处理异常,并返回合适的HTTP响应,可以返回一个自定义的错误信息、一个HTTP错误码,或者其他合适的响应
- 定义一个异常处理类,并使用
- 在SpringBoot中,可以使用
- SpringBoot中常用的starter有哪些
spring-boot-starter-web
:用于构建Web应用程序,包括Spring MVC、Tomcat容器等。spring-boot-starter-data-jpa
:用于使用JPA和Hibernate进行持久化操作。spring-boot-starter-data-redis
:用于使用Redis进行数据缓存和持久化操作。spring-boot-starter-security
:用于构建安全的Web应用程序,包括Spring Security、OAuth2等。spring-boot-starter-actuator
:用于监视应用程序的运行状况和性能指标,包括健康检查、指标监控、环境信息、配置信息等。spring-boot-starter-test
:用于构建测试应用程序,包括JUnit、Mockito、Hamcrest等。spring-boot-starter-log4j2
:用于使用Log4j2进行日志记录。spring-boot-starter-logging
:用于使用SLF4J和Logback进行日志记录。spring-boot-starter-amqp
:用于使用AMQP进行消息队列和消息总线操作。
- SpringBoot实现热部署有哪几种方式
- 在SpringBoot中,可以通过以下几种方式来实现热部署
- 使用
SpringBoot DevTools
:SpringBoot DevTools
提供了许多开发工具,包括自动重启、热部署等功能。只需将spring-boot-devtools
依赖添加到项目中即可启用该功能 - 使用
Spring Loaded
:Spring Loaded
是一个轻量级的Java类热部署工具,可以让开发者在不停止和重新启动应用程序的情况下更新Java类,只需将spring-loaded
依赖添加到项目中即可启用该功能 - 使用
JRebel
:JRebel
是一款商业化的Java类热部署工具,需要将JRebel插件集成到开发环境中才能使用
- 使用
- 在SpringBoot中,可以通过以下几种方式来实现热部署
- 如何理解SpringBoot配置加载顺序
在Spring Boot中,配置文件的加载顺序是非常重要的,不同的加载顺序可以对应不同的配置场景。Spring Boot的配置加载顺序如下:
命令行参数:Spring Boot可以通过命令行参数来动态地修改配置。例如,可以使用
--server.port=8080
来指定应用程序的端口号。Java系统属性:可以通过-D参数设置Java系统属性,这些属性可以在Spring Boot应用程序中直接使用。例如,可以使用
-Dapp.version=1.0.0
来设置应用程序版本号。OS环境变量:Spring Boot可以读取操作系统的环境变量,这些环境变量可以在应用程序中直接使用。例如,可以使用
export APP_NAME=myapp
来设置应用程序名称。application.properties
或application.yml
文件:Spring Boot会自动加载application.properties或application.yml文件中的配置。其中,application.properties文件使用key=value的格式,application.yml文件使用YAML格式。这些配置文件可以放置在src/main/resources目录下或classpath的根目录下。指定的配置文件:可以通过
spring.config.name
和spring.config.location
属性来指定要加载的配置文件。例如,可以使用--spring.config.name=myconfig
、--spring.config.location=/etc/myapp/
来加载指定的配置文件。通过
@ConfigurationProperties
注解加载配置:可以使用@ConfigurationProperties
注解来将配置文件中的属性映射到Java类中。
- SpringBoot的核心配置文件有哪几个?他们的区别是什么
- 在SpringBoot中,有以下两种核心配置文件
- application.yml:这是SpringBoot应用程序的主要配置文件,其中包含了应用程序中的各种配置属性,如数据库连接、端口号等
- bootstrap.yml:它的主要应用场景是当应用程序需要连接到外部服务时,可以将连接属性(如用户名、密码、端口等)配置在bootstrap文件中,以便在应用程序启动时就能够加载这些属性。这样做可以避免将敏感信息直接暴露在应用程序的配置文件中,提高应用程序的安全性。例如我们使用SpringCloud Config作为应用程序的配置服务器,那么我们需要在bootstrap中配置如下属性
1
2
3
4
5
6spring:
cloud:
config:
uri: http://localhost:8888
username: user
password: password- 这些属性将在应用程序启动时加载,并用于与配置服务器进行通信,以获取应用程序的配置信息。由于这些属性是保存在bootstrap文件中的,因此可以避免在应用程序配置文件中直接暴露这些属性。
- 在SpringBoot中,有以下两种核心配置文件
- 如何集成SpringBoot和ActiveMQ
- 要集成SpringBoot和ActiveMQ,需要进行以下步骤
- 添加ActiveMQ依赖,在SpringBoot项目的pom.xml文件中添加如下依赖
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency> - 配置ActiveMQ连接,在application.yml中配置ActiveMQ的连接信息,例如
1
2
3
4
5spring:
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin - 创建JMS消息队列或主题:可以使用@Bean注解创建Queue或Topic对象,例如
1
2
3
4
public Queue myQueue() {
return new ActiveMQQueue("my-queue");
} - 发送和接收JMS消息:可以使用JmsTemplate来发送和接收JMS消息,例如
1
2
3
4
5
6
7
8
9
10
11
private JmsTemplate jmsTemplate;
public void sendMessage(String message) {
jmsTemplate.convertAndSend("my-queue", message);
}
public void receiveMessage(String message) {
System.out.println("Received message: " + message);
}
- 添加ActiveMQ依赖,在SpringBoot项目的pom.xml文件中添加如下依赖
- 要集成SpringBoot和ActiveMQ,需要进行以下步骤