2025年Spring Boot面试题大全(精选120题)

2025年Spring Boot面试题大全(精选120题)

1~20题答案

一、基础概念与核心特性

1. Spring, Spring MVC, Spring Boot的关系是什么?

Spring是一个综合性的框架,提供依赖注入、AOP等核心功能;Spring MVC是Spring的Web模块,用于构建MVC模式的Web应用;Spring Boot基于Spring,通过自动配置和Starter简化开发,支持快速部署和独立运行。

2. Spring Boot的核心特性有哪些?如何简化Spring应用开发?
  • 自动配置:根据依赖自动配置应用,减少手动配置。
  • Starter:预定义的依赖集合(如spring-boot-starter-web),简化依赖管理。
  • Actuator:提供监控和管理端点(如/health/metrics)。
  • 外部化配置:支持application.propertiesapplication.yml等配置方式,适配不同环境。
  • 内嵌容器:默认集成Tomcat,支持快速部署为可执行JAR。
3. 什么是Spring Boot的“约定大于配置”原则?

通过默认约定(如H2数据库自动配置、端口默认8080)减少手动配置,基于行业最佳实践提升开发效率,同时允许通过覆盖默认配置实现灵活定制。

4. Spring Boot的默认嵌入式服务器是什么?如何切换为Jetty或Undertow?
  • 默认嵌入式服务器是Tomcat。
  • 切换步骤
    • Maven项目:排除spring-boot-starter-tomcat,添加对应依赖(如spring-boot-starter-jetty)。
    • Gradle项目:通过excludeimplementation配置实现切换。
5. @SpringBootApplication注解的作用是什么?它由哪些注解组合而成?
  • 标识Spring Boot应用的入口类,启用自动配置和组件扫描。
  • 组合注解:@Configuration(声明配置类)、@EnableAutoConfiguration(启用自动配置)、@ComponentScan(扫描组件)。
6. Spring Boot的自动配置是如何实现的?其底层机制是什么?
  • 通过@EnableAutoConfiguration触发,加载META-INF/spring.factories中的配置类。
  • 使用@Conditional系列注解按条件配置Bean(如存在某个类时生效)。
  • 配置属性通过@ConfigurationProperties绑定,支持外部化配置。
7. 什么是Spring Boot Starter?列举常用的Starter并说明其作用。
  • Starter是预定义的依赖集合,简化依赖管理。
  • 常用Starter:
    • spring-boot-starter-web:构建Web应用(含Tomcat和Spring MVC)。
    • spring-boot-starter-data-jpa:集成JPA实现数据持久化。
    • spring-boot-starter-security:实现安全控制。
    • spring-boot-starter-test:集成测试框架(如JUnit、Mockito)。
8. Spring Boot如何支持微服务架构?与Spring Cloud的关系是什么?
  • Spring Boot简化微服务开发,Spring Cloud提供服务治理(如Eureka服务注册、Ribbon负载均衡)。
  • Spring Cloud基于Spring Boot,二者相辅相成:Spring Boot负责快速开发,Spring Cloud解决分布式系统挑战。
9. Spring Boot Actuator的作用是什么?列举常用的Actuator端点。
  • 提供监控和管理功能,常用端点:
    • /health:检查应用健康状态。
    • /metrics:获取JVM内存、HTTP请求统计等指标。
    • /env:查看环境变量和配置属性。
    • /loggers:动态修改日志级别。
10. Spring Boot内嵌容器的优势是什么?如何自定义容器配置?
- **优势**:独立运行,无需外部服务器,简化部署。  
- **自定义配置**:  
  - 通过`application.properties`调整端口、线程池等参数(如`server.port=8080`)。  
  - 高级调优:自定义配置类(如调整Tomcat连接数、超时时间)。

二、配置与依赖管理

11. Spring Boot支持哪些配置文件格式?application.properties与application.yml的区别是什么?
- 支持`.properties`和`.yml`格式。  
- `.yml`通过层级结构提升可读性,适合复杂配置;`.properties`键值对简单直观。
12. 如何通过配置文件设置不同环境的参数(如开发、生产环境)?
- 使用`application-{profile}.properties`(如`application-dev.properties`)。  
- 激活Profile:通过`spring.profiles.active=dev`指定环境。
13. @ConfigurationProperties注解的作用是什么?如何与配置文件绑定?
- 将配置文件属性绑定到Java类,支持类型安全配置。  
- 示例:`@ConfigurationProperties(prefix = "spring.datasource")`绑定数据源配置。
14. 如何解决配置文件中的属性覆盖问题?
- 使用`@Primary`注解标记优先Bean。  
- 通过`spring.config.location`指定外部配置文件路径,覆盖默认配置。
15. Spring Boot如何管理第三方库的依赖?Maven与Gradle的配置差异是什么?
- 通过Starter管理常用依赖,Maven使用`pom.xml`,Gradle使用`build.gradle`。  
- Maven依赖管理更成熟,Gradle脚本更简洁、构建速度更快。
16. 如何排除自动配置中的某个类?
- 使用`@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})`排除特定自动配置类。
17. Spring Boot多模块项目中如何共享配置?
- 将公共配置提取到独立模块,通过`@ImportResource`或`@Configuration`导入。
18. 如何通过命令行参数覆盖配置文件中的属性?
- 启动时添加`--key=value`参数(如`java -jar app.jar --server.port=9090`)。
19. Spring Boot如何集成外部配置中心(如Spring Cloud Config)?
- 添加`spring-cloud-starter-config`依赖,配置中心化配置仓库(如Git),通过`@RefreshScope`动态刷新配置。
20. @Profile注解的作用是什么?如何结合配置文件使用?
- 根据环境激活不同Bean或配置。  
- 示例:`@Profile("dev")`仅在开发环境生效,结合`application-dev.properties`使用。

21~40题答案

三、数据访问与持久化

21. Spring Boot中如何配置多数据源?
  • 步骤
    1. 定义多个DataSource Bean,使用@Qualifier区分。
    2. 配置多个JdbcTemplateJpaTransactionManager,绑定对应数据源。
    3. 通过@Primary标记默认数据源,避免冲突。
  • 示例
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource dataSource1() {
          return DataSourceBuilder.create().build(); }
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource dataSource2() {
          return DataSourceBuilder.create().build(); }
    
22. JPA与MyBatis在Spring Boot中的集成方式有何不同?
  • JPA:通过spring-boot-starter-data-jpa自动配置,使用JpaRepository接口,支持面向对象的查询(如findByName)。
  • MyBatis:需手动配置SqlSessionFactory和Mapper接口,通过XML或注解编写SQL,灵活性更高。
23. 如何通过@Transactional注解管理事务?其传播行为与隔离级别如何配置?
  • 传播行为@Transactional(propagation = Propagation.REQUIRED)(默认,加入当前事务)。
  • 隔离级别@Transactional(isolation = Isolation.READ_COMMITTED)
  • 超时与回滚timeout = 30(秒),rollbackFor = Exception.class
24. Spring Data JPA的核心接口有哪些?如何实现自定义查询?
  • 核心接口CrudRepository(基础CRUD)、PagingAndSortingRepository(分页排序)、JpaRepository(JPA扩展)。
  • 自定义查询
    • 方法名解析:findByEmailAndActive(String email, boolean active)
    • @Query注解:编写JPQL或原生SQL。
25. 如何解决数据库连接池的配置问题(如HikariCP)?
  • 配置参数
    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.connection-timeout=30000
    
  • 监控:通过Actuator的/metrics端点查看连接池状态。
26. Spring Boot中如何实现分布式事务?
  • 方案
    • 使用Seata框架,通过@GlobalTransactional注解标记全局事务。
    • 集成JTA(如Atomikos),但复杂度较高。
27. 如何配置JPA的审计功能(如创建时间、更新时间自动填充)?
  • 步骤
    1. 实体类添加@CreatedDate@LastModifiedDate注解。
    2. 启用@EnableJpaAuditing,配置审计Bean。
  • 示例
    @Entity
    @EntityListeners(AuditingEntityListener.class)
    public class User {
         
        @CreatedDate
        private LocalDateTime createTime;
    }
    
28. Spring Boot如何集成MongoDB或Redis等NoSQL数据库?
  • MongoDB:添加spring-boot-starter-data-mongodb依赖,配置spring.data.mongodb.uri
  • Redis:添加spring-boot-starter-data-redis依赖,配置spring.redis.hostspring.redis.port,使用StringRedisTemplateRedisTemplate操作数据。
29. 如何通过JdbcTemplate执行原生SQL查询?
  • 步骤
    1. 自动注入JdbcTemplate
    2. 使用queryForObjectupdate等方法执行SQL。
  • 示例
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public User getUser(Long id) {
         
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{
         id}, (rs, rowNum) -> {
         
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setName(rs.getString("name"));
            return user;
        });
    }
    
30. Spring Batch在Spring Boot中的应用场景是什么?
  • 场景:批量处理数据(如ETL、报表生成),支持任务分片、重启、事务管理。
  • 配置:通过@EnableBatchProcessing启用,定义JobStep

四、Web开发与RESTful API

31. Spring Boot中如何创建一个RESTful控制器?
  • 步骤
    1. 使用@RestController注解类。
    2. 通过@RequestMapping@GetMapping等注解定义API路径。
  • 示例
    @RestController
    @RequestMapping("/api/users")
    public class UserController {
         
        @GetMapping("/{id}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值