SpringBoot整理和面试

阿里云教程3个月前发布
17 0 0

一、什么是 SpringBoot?

SpringBoot 是 Spring 生态下的快速开发脚手架,核心目标是 “简化 Spring 应用的开发、配置、部署流程”

它并非替代 Spring,而是基于 Spring 框架,通过 “约定优于配置(Convention over Configuration)” 的设计思想,整合了 Spring 核心、Spring MVC、嵌入式服务器、依赖管理等功能,让开发者无需手动配置大量 XML 或注解,就能快速搭建可运行的生产级应用。

简单说:SpringBoot = Spring 核心 + 自动配置 + 起步依赖 + 嵌入式服务器 + 监控支持

SpringBoot整理和面试

二、SpringBoot 核心及原理

1. 三大核心特性

(1)自动配置(AutoConfiguration)

核心目标:根据项目依赖(如引入 spring-boot-starter-web),自动配置 Spring 容器中的 Bean(如DispatcherServlet、DataSource),无需手动编写配置。

实现原理

a. 核心注解 @EnableAutoConfiguration(被 @SpringBootApplication 包含)触发自动配置;

b. Spring 启动时,通过 SpringFactoriesLoader 扫描类路径下
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(SpringBoot 2.7+ 版本,旧版本是 spring.factories),加载所有自动配置类(如 WebMvcAutoConfiguration、
DataSourceAutoConfiguration);

c. 自动配置类通过 条件注解(@Conditional 系列) 判断是否生效(如 @ConditionalOnClass 检查依赖是否存在、@ConditionalOnMissingBean 检查用户是否自定义了该 Bean);

d. 生效的自动配置类通过 @Bean 向容器注入默认配置的组件。

(2)起步依赖(Starter Dependencies)

核心目标:简化 Maven/Gradle 依赖管理,避免手动导入多个相关依赖(如 Spring MVC + 嵌入式 Tomcat + Jackson)。

实现原理

○ 起步依赖是 “依赖聚合”,每个 Starter(如 spring-boot-starter-web)内部已包含该场景所需的所有核心依赖,且版本由 SpringBoot 统一管理(避免版本冲突);

○ 命名规范:官方 Starter 命名为 spring-boot-starter-xxx(如
spring-boot-starter-data-jpa),第三方 Starter 一般命名为 xxx-spring-boot-starter(如
mybatis-spring-boot-starter)。

(3)嵌入式服务器(Embedded Server)

核心目标:无需额外部署外部服务器(如 Tomcat、Jetty),应用可直接通过 java -jar 启动。

默认支持:Tomcat(默认)、Jetty、Undertow,可通过排除默认依赖、引入对应 Starter 切换(如切换为 Jetty)。

原理:SpringBoot 将服务器封装为依赖,启动时通过 ServerFactory 自动创建服务器实例并绑定端口。

2. 其他核心组件

外部化配置(Externalized Configuration):支持多种配置方式(
application.properties/yml、环境变量、命令行参数等),通过 @Value 或 @ConfigurationProperties 注入配置,方便多环境切换。

Actuator:提供生产级监控能力(如健康检查、指标统计、日志查看),通过
spring-boot-starter-actuator 依赖启用,访问 /actuator/* 端点获取信息。

SpringBoot Application 主类:标注 @SpringBootApplication 的类是启动入口,通过 SpringApplication.run(Application.class, args) 启动 Spring 容器,触发自动配置和组件扫描。

三、SpringBoot 应用场景

SpringBoot 是 Java 后端开发的“万能脚手架”,核心应用场景如下:

1. 微服务基石:SpringCloud 微服务生态的核心组件(如 Eureka、Gateway、Feign)均基于 SpringBoot 开发,每个微服务实例本质是一个 SpringBoot 应用;

2. Web 应用开发:快速搭建 RESTful API、前后端分离项目后端、管理系统(如 SpringBoot + Vue/React);

3. 数据处理应用:整合 MyBatis、JPA、Redis 等数据层框架,开发数据查询、批量处理、缓存服务;

4. 企业级应用:整合 Spring Security(权限)、Shiro、Activiti(工作流)等组件,开发 OA、CRM、ERP 等系统;

5. 云原生应用:支持 Docker 容器化、K8s 部署,天然适配云环境(如阿里云、AWS);

6. 定时任务/消息队列消费者:简单搭建定时任务(@Scheduled)、RabbitMQ/Kafka 消息消费者。

四、SpringBoot 优点和缺点

优点

1. 开发效率极高:自动配置替代繁琐配置,起步依赖简化依赖管理,无需手动整合 Spring 组件;

2. 开箱即用:内置嵌入式服务器,java -jar 直接启动,无需部署外部服务器;

3. 生态完善:无缝兼容 Spring 所有生态(Spring MVC、Spring Data、Spring Security),且支持主流第三方框架(MyBatis、Redis、RabbitMQ);

4. 生产级支持:Actuator 监控、健康检查、日志集成(SLF4J/Logback)、多环境配置,直接满足生产需求;

5. 兼容性好:支持 Java 8+,兼容各种开发工具(IDEA、Eclipse),部署方式灵活(Jar 包、War 包、容器化);

6. 降低学习成本:对 Spring 新手友善,无需深入理解 Spring 底层配置即可开发应用。

缺点

1. 灵活性不足:“约定优于配置”导致自定义复杂配置时,需要覆盖默认约定,反而比原生 Spring 繁琐(如复杂的数据源路由、自定义 Spring MVC 拦截器链);

2. 包体积较大:嵌入式服务器 + 自动依赖导致 Jar 包体积一般在 20MB+,不适合对体积敏感的场景(如嵌入式设备);

3. 底层封装过深:问题排查难度高(如自动配置失效时,需要深入理解自动配置原理才能定位);

4. 学习曲线隐形:看似简单,但要掌握自定义配置、原理、优化,仍需扎实的 Spring 基础;

5. 版本迭代快:部分旧版本 Starter 或自定义配置可能在新版本中不兼容(如 SpringBoot 2.x 与 1.x 差异较大)。

五、如何搭建 SpringBoot 框架

搭建方式有 2 种:Spring Initializr(推荐)手动搭建,以下以 Maven + Java 8 为例。

方式 1:Spring Initializr(IDEA 集成,最快)

1. 打开 IDEA → New Project → 选择 Spring Initializr(默认使用官方地址 https://start.spring.io);

2. 填写项目信息:

○ Group(组织名,如 com.example)、Artifact(项目名,如 springboot-demo);

○ 版本(如 2.7.15,稳定版)、Java 版本(8);

3. 选择依赖:

○ 必选:Spring Web(Web 应用核心,包含 Spring MVC + Tomcat);

○ 可选:Spring Data JPA(数据访问)、Redis(缓存)、Actuator(监控);

4. 点击 Finish,IDEA 自动生成项目结构和配置文件。

方式 2:手动搭建(理解底层依赖)

步骤 1:创建 Maven 项目

新建普通 Maven 项目,在 pom.xml 中添加 SpringBoot 核心依赖:

XML
<!– 1. 继承 SpringBoot 父工程(统一依赖版本) –>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.7.15</version> <!– 稳定版 –>

<relativePath/>

</parent>

<!– 2. 添加起步依赖(Web 场景) –>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

</dependencies>

<!– 3. 打包插件(支持 java -jar 启动) –>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

步骤 2:创建主启动类

在 src/main/java/com/example 下创建主类(必须包含 @SpringBootApplication 注解):

package com.example;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

// 核心注解:= @SpringBootConfiguration + @EnableAutoConfiguration +

@ComponentScan

@SpringBootApplication

public class SpringBootDemoApplication {

public static void main(String[] args) {

// 启动 Spring 容器

SpringApplication.run(SpringBootDemoApplication.class, args);

}

}

步骤 3:创建测试接口

创建 Controller 类,编写一个简单的 RESTful 接口:

Java
package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController // = @Controller + @ResponseBody

public class HelloController {

@GetMapping(“/hello”)

public String hello() {

return “Hello SpringBoot!”;

}

}

步骤 4:启动并测试

1. 运行主类的 main 方法;

2. 启动成功后,访问
http://localhost:8080/hello,页面显示 Hello SpringBoot! 即搭建成功。

步骤 5:自定义配置(可选)

在 src/main/resources 下创建 application.yml(推荐,比 properties 简洁),修改端口、应用名:

spring:

application:

name: springboot-demo # 应用名

server:

port: 8081 # 端口改为 8081

六、SpringBoot 常见面试题(基础 + 进阶 + 高级)

(一)基础面试题

1. SpringBoot 是什么?它的核心优势是什么?

答案:SpringBoot 是 Spring 生态的快速开发脚手架,核心是“约定优于配置”,无需手动整合 Spring 组件和配置 XML。核心优势:① 自动配置;② 起步依赖;③ 嵌入式服务器;④ 开箱即用的生产级支持;⑤ 开发效率高。

2. @SpringBootApplication 注解包含哪些核心注解?各自作用是什么?

答案:@SpringBootApplication 是复合注解,包含 3 个核心注解:

a. @SpringBootConfiguration:标记当前类是配置类,等价于 @Configuration;

b. @EnableAutoConfiguration:触发自动配置,加载类路径下的自动配置类;

c. @ComponentScan:扫描当前包及其子包下的组件(@Controller、@Service、@Repository 等),默认扫描主启动类所在包。

3. SpringBoot 支持哪些配置文件格式?优先级是什么?

答案:支持 3 种格式:

a. application.properties(键值对格式);

b. application.yml(yaml 格式,推荐,简洁);

c. application.yaml(与 yml 等价)。优先级:application.properties > application.yml > application.yaml(同目录下,高优先级覆盖低优先级);多环境配置:通过 spring.profiles.active=dev 激活 application-dev.yml 等环境配置文件。

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

答案:核心流程:

a. 主启动类的 @EnableAutoConfiguration 注解触发自动配置;

b. SpringFactoriesLoader 扫描
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加载所有自动配置类;

c. 自动配置类通过 @Conditional 系列注解(如 @ConditionalOnClass、@ConditionalOnMissingBean)判断是否生效;

d. 生效的自动配置类通过 @Bean 向 Spring 容器注入默认组件(如 DispatcherServlet)。

5. 什么是 SpringBoot Starter?举几个常用的 Starter 例子。

答案:Starter 是“依赖聚合包”,整合某一场景所需的所有核心依赖,避免手动导入多个依赖。常用 Starter:

○ spring-boot-starter-web:Web 应用(Spring MVC + Tomcat);


spring-boot-starter-data-jpa:JPA 数据访问;

○ spring-boot-starter-redis:Redis 缓存;


spring-boot-starter-security:权限控制;


spring-boot-starter-actuator:应用监控。

(二)进阶面试题

1. 如何禁用 SpringBoot 的某个自动配置类?

答案:2 种方式:

a. 用 @SpringBootApplication 的 exclude 属性:@SpringBootApplication(exclude =
DataSourceAutoConfiguration.class)(禁用数据源自动配置);

b. 在配置文件中指定:
spring.autoconfigure.exclude=
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration。

2. SpringBoot 嵌入式服务器有哪些?如何切换嵌入式服务器?

答案:默认支持 Tomcat(默认)、Jetty、Undertow。切换方式(以切换为 Jetty 为例):

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

<!– 排除默认 Tomcat 依赖 –>

<exclusions>

<exclusion>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-tomcat</artifactId>

</exclusion>

</exclusions>

</dependency>

<!– 引入 Jetty 依赖 –>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jetty</artifactId>

</dependency>

3. 如何自定义 SpringBoot Starter?

答案:核心步骤(以 my-starter 为例):

a. 命名规范:第三方 Starter 命名为 xxx-spring-boot-starter;

b. 创建 Maven 项目,引入核心依赖(spring-boot-autoconfigure、spring-boot-starter);

c. 编写自动配置类(如 MyAutoConfiguration),用 @Conditional 注解控制生效条件,用 @Bean 注入组件;

d. 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中注册自动配置类;

e. 打包发布,其他项目引入该 Starter 即可自动生效。

4. SpringBoot 如何实现多环境配置?

答案:3 种常用方式:

a. 多配置文件:创建 application-dev.yml(开发)、application-test.yml(测试)、application-prod.yml(生产),通过 spring.profiles.active=dev 激活;

b. 命令行参数:启动时指定 java -jar app.jar –spring.profiles.active=prod;

c. 环境变量:设置系统环境变量 SPRING_PROFILES_ACTIVE=prod(SpringBoot 自动读取环境变量)。

5. SpringBoot Actuator 的作用是什么?常用端点有哪些?

答案:Actuator 提供生产级监控能力,暴露 HTTP 端点获取应用运行状态。常用端点:

○ /actuator/health:健康检查(默认开启);

○ /actuator/info:应用信息(需配置 info.* 属性);

○ /actuator/metrics:系统指标(如 JVM 内存、CPU 使用率);

○ /actuator/loggers:日志配置;

○ /actuator/shutdown:关闭应用(默认禁用,需开启
management.endpoint.shutdown.enabled=true)。

(三)高级面试题

1. SpringBoot 的启动流程是什么?

答案:核心流程(简化版):

a. 执行主类 main 方法,调用 SpringApplication.run();

b. 初始化 SpringApplication 实例:设置应用类型(Web/非 Web)、加载初始化器(
ApplicationContextInitializer)、监听器(ApplicationListener);

c. 启动应用:触发 ApplicationStartingEvent 事件;

d. 准备环境:加载配置文件、环境变量,触发
ApplicationEnvironmentPreparedEvent;

e. 创建 ApplicationContext(Spring 容器):Web 应用默认创建
AnnotationConfigServletWebServerApplicationContext;

f. 刷新容器:

▪ 执行 BeanFactoryPostProcessor(后置处理器);

▪ 扫描并注册组件(@Component 等);

▪ 执行自动配置(@EnableAutoConfiguration);

▪ 初始化 Bean(执行 @PostConstruct、依赖注入);

g. 启动嵌入式服务器:创建 Tomcat/Jetty 实例,绑定端口;

h. 触发 ApplicationStartedEvent、ApplicationReadyEvent 事件,应用启动完成。

2. 如何优化 SpringBoot 应用的启动速度?

答案:核心优化方向:

a. 依赖优化:移除不必要的 Starter,避免冗余依赖;

b. 关闭无用自动配置:排除不需要的自动配置类(如
DataSourceAutoConfiguration 若无需数据库);

c. 延迟初始化:开启
spring.main.lazy-initialization=true,非必要 Bean 延迟到首次使用时初始化;

d. 优化 JVM 参数:调整堆内存(-Xms2g -Xmx2g)、使用 G1 垃圾回收器(-XX:+UseG1GC);

e. 减少组件扫描范围:指定 @ComponentScan(basePackages = “com.example.core”),避免扫描无关包;

f. 打包优化:使用 spring-boot-maven-plugin 的 layers 功能,分离依赖和业务代码,加速容器部署。

3. SpringBoot 中 @Conditional 注解的作用是什么?常见的条件注解有哪些?

答案:@Conditional 是 Spring 的条件注解,用于控制 Bean 或配置类是否生效,是自动配置的核心。常见条件注解:

○ @ConditionalOnClass:类路径下存在指定类时生效;

○ @ConditionalOnMissingClass:类路径下不存在指定类时生效;

○ @ConditionalOnBean:容器中存在指定 Bean 时生效;

○ @ConditionalOnMissingBean:容器中不存在指定 Bean 时生效(用户自定义 Bean 优先);

○ @ConditionalOnProperty:配置文件中存在指定属性且值匹配时生效(如 @ConditionalOnProperty(prefix = “spring.datasource”, name = “url”));

○ @
ConditionalOnWebApplication:Web 应用环境下生效。

4. SpringBoot 如何处理跨域问题?

答案:3 种常用方式:

a. 全局配置(推荐):实现 WebMvcConfigurer 接口,重写 addCorsMappings:

@Configuration

public class CorsConfig implements WebMvcConfigurer {

@Override

public void addCorsMappings(CorsRegistry registry) {

registry.addMapping(“/**”) // 所有接口

.allowedOrigins(“*”) // 允许所有源(生产环境指定具体域名)

.allowedMethods(“GET”, “POST”, “PUT”, “DELETE”) // 允许请

.allowedHeaders(“*”) // 允许所有请求头

.maxAge(3600); // 预检请求缓存时间
}

}

b. 局部注解:在 Controller 或方法上添加 @CrossOrigin;

c. 过滤器:自定义 CorsFilter,手动设置跨域响应头。

5. 微服务架构中,SpringBoot 应用如何实现配置中心和服务发现?

答案:结合 SpringCloud 组件实现:

a. 配置中心:使用 SpringCloud Config 或 Nacos Config,将配置聚焦存储(Git/Nacos 服务器),SpringBoot 应用通过
spring-cloud-starter-config 或
spring-cloud-starter-alibaba-nacos-config 依赖拉取配置,支持动态刷新;

b. 服务发现:使用 Eureka、Nacos 或 Consul,SpringBoot 应用通过
spring-cloud-starter-netflix-eureka-client 或
spring-cloud-starter-alibaba-nacos-discovery 依赖注册到服务注册中心,其他服务通过 Feign/Gateway 调用。

© 版权声明

相关文章

暂无评论

none
暂无评论...