SpringBoot常见面试题总结

发布于:2025-06-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

SpringBoot优缺点

优点:

缺点:

SpringBoot自动配置原理

自动配置核心原理

自动配置的工作流程

SpringBoot配置文件注入

SpringBoot的profile加载

什么是 Profile?

核心用途

激活 Profile 的方式

1. 配置文件中指定

2. 命令行参数

3. 环境变量

4. IDE 启动配置

5. 代码中动态设置

@Profile 注解与条件配置

1. Bean 级别的 Profile 控制

2. 类级别的 Profile 控制

3. 组合 Profile

SpringBoot项目内部配置文件加载顺序

SpringBoot日志关系

1. 日志抽象层

2. 日志实现层

Springboot热部署

DevTools工作原理

启用 JRebel 热部署

SpringBoot的监控


SpringBoot优缺点

优点:

快速开发:通过自动配置和大量开箱即用功能,让开发者可以快速启动和运行一个应用程序,无需进行繁琐的配置工作。

独立运行:SpringBoot应用可以打包成独立的JAR文件,内嵌Web容器,使得应用可以通过java -jar命令直接运行,无需外部服务器。

生产级功能:SpringBoot提供一系列生产级功能,如监控、健康检查、外部化配置、指标收集、日志管理,帮助开发者更好管理和监控应用。

微服务与云原生支持:天然适配SpringCloud生态(服务发现、配置中心、负载均衡等),支持容器化部署(Docker、Kubernetes)和无服务器架构(Serverless)。

丰富的插件生态:拥有庞大的社区支持和生态系统,开发者可以方便地找到文档、教程、插件和第三方库

缺点:

依赖版本冲突:起步依赖管理大量第三方库,若手动引入不兼容版本可能会导致冲突。

自动配置的局限性:自动配置的“黑盒”特性可能导致调试困难。

应用体积与启动时间:嵌入式服务器和依赖会导致JAR包体积增大,并且首次启动时间会较长,在开发环境频繁重启时会影响效率。

过度依赖自动配置:过度依赖SpringBoot的自动配置可能会导致开发者对底层细节缺乏了解,从而在需要深入定制和优化时遇到困难。

SpringBoot自动配置原理

自动配置核心原理

1.基于条件的配置

  • 核心思想:根据类路径中的依赖、配置属性或 Bean 的存在情况,动态决定是否加载特定配置。
  • 关键注解
    • @ConditionalOnClass:当类路径中存在指定类时生效。
    • @ConditionalOnMissingBean:当容器中不存在指定 Bean 时生效。
    • @ConditionalOnProperty:当配置属性满足指定条件时生效。
    • @ConditionalOnWebApplication:在 Web 应用环境中生效。

2.自动配置的触发点

@SpringBootApplication注解是启动自动配置的核心

  • @SpringBootApplication包含三个关键注解:
    • @EnableAutoConfiguration:启用自动配置机制。
    • @ComponentScan:扫描@Component@Service等组件。
    • @Configuration:允许在类中定义 Bean。

自动配置的工作流程

  1. 启动触发@SpringBootApplication启用自动配置。
  2. 加载配置类:通过spring.factories加载候选配置类。
  3. 条件过滤:根据@Conditional注解筛选符合条件的配置类。
  4. 属性绑定:将外部配置(如application.properties)绑定到配置类。
  5. Bean 注册:将符合条件的配置类中的 Bean 注册到容器。

SpringBoot配置文件注入

Spring Boot 按以下顺序加载配置(后加载的覆盖先加载的):

  1. 默认属性:通过SpringApplication.setDefaultProperties设置。
  2. 配置文件application.propertiesapplication.yml
  3. 多环境配置文件application-{profile}.properties/yml
  4. @PropertySource:自定义配置文件。
  5. 命令行参数
  6. JNDI 属性:来自java:comp/env
  7. 环境变量
  8. 测试配置@TestPropertySource

SpringBoot的profile加载

在 Spring Boot 中,Profile 是一种强大的机制,用于在不同环境(如开发、测试、生产)中加载特定的配置。通过 Profile,开发者可以轻松切换不同环境的配置,而无需修改代码。

什么是 Profile?
  • Profile 是 Spring 框架提供的一种机制,用于根据环境(如devtestprod)加载不同的配置。
  • 每个 Profile 可以有独立的配置文件(如application-dev.properties)或配置类。
核心用途
  • 环境隔离:不同环境使用不同的数据库、服务器端口等配置。
  • 安全管理:生产环境的敏感信息(如密码、密钥)与开发环境分离。
  • 功能开关:在测试环境启用某些特性,生产环境禁用。

激活 Profile 的方式

1. 配置文件中指定
# application.properties
spring.profiles.active=dev
2. 命令行参数
java -jar myapp.jar --spring.profiles.active=prod
3. 环境变量
# Linux/macOS
export SPRING_PROFILES_ACTIVE=dev

# Windows
set SPRING_PROFILES_ACTIVE=dev
4. IDE 启动配置

在 IDE 的运行配置中添加--spring.profiles.active=test

5. 代码中动态设置
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApp.class);
        app.setAdditionalProfiles("dev"); // 激活dev profile
        app.run(args);
    }
}

@Profile 注解与条件配置

1. Bean 级别的 Profile 控制
@Configuration
public class AppConfig {
    @Bean
    @Profile("dev") // 仅在dev profile激活时创建
    public DataSource devDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/dev_db")
            .build();
    }
    
    @Bean
    @Profile("prod") // 仅在prod profile激活时创建
    public DataSource prodDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://prod-server:3306/prod_db")
            .build();
    }
}
2. 类级别的 Profile 控制
@Configuration
@Profile("!test") // 非test环境加载
public class ProductionConfig {
    // ...
}
3. 组合 Profile
@Profile({"dev", "qa"}) // 同时支持dev和qa环境
public class DevQaConfig {
    // ...
}

SpringBoot项目内部配置文件加载顺序

  1. 外部配置 > 内部配置
    (命令行参数 > 环境变量 > 配置文件)

  2. 特定 Profile > 通用配置
    application-prod.properties > application.properties

  3. 后加载的配置 > 先加载的配置
    (如/config目录 > 资源目录,YAML 中靠后的文档 > 靠前的文档)

SpringBoot日志关系

1. 日志抽象层
  • SLF4J(Simple Logging Facade for Java)
    Spring Boot 默认使用的日志门面,提供统一的日志 API(如LoggerFactory.getLogger()),不负责具体实现。
2. 日志实现层
  • Logback
    Spring Boot 默认的日志实现,与 SLF4J 无缝集成,配置灵活(支持 XML/Groovy)。
  • Log4j2
    高性能日志框架,支持异步日志、JSON 格式输出,需手动引入依赖。

Spring Boot 默认使用 Logback 作为日志实现,并且提供了一个默认的配置文件logback-spring.xml。如果你没有提供自定义的配置文件,Spring Boot 会使用默认的配置。可以通过application.propertiesapplication.yml文件来配置日志级别和日志输出格式。

如果你需要更复杂的日志配置,可以创建一个logback-spring.xml文件,并将其放在src/main/resources目录下。Spring Boot 会自动加载该配置文件。

Springboot热部署

在 Spring Boot 中实现热部署主要有两种主流方案:使用内置的 DevTools 和集成 JRebel 插件。

DevTools工作原理
  • DevTools 使用两个类加载器:基础类加载器(加载不变的类如 Spring 框架类)和重启类加载器(加载应用代码)。
  • 当监测到类路径变化时,重启类加载器会被重新加载,实现快速重启(通常 1-2 秒)。
启用 JRebel 热部署
  • 在 IDE 中启动应用时,选择Run with JRebel
  • 修改代码后,JRebel 会自动将变更推送到运行中的 JVM,无需重启。

SpringBoot的监控

Spring Boot 监控体系通过 Actuator 提供基础能力,结合第三方工具(如 Prometheus、Grafana、ELK)构建完整的监控链路。建议根据项目规模和需求选择合适的工具组合,并遵循以下原则:

  1. 最小化监控成本:避免采集无用指标。
  2. 关注业务指标:如转化率、响应时间、错误率。
  3. 自动化告警:及时发现并响应系统异常。
  4. 持续优化:根据监控数据调整系统参数和架构。


网站公告

今日签到

点亮在社区的每一天
去签到