Spring Boot 常见面试题汇总

一、核心概念

1. Spring Boot 优点

  • 快速创建独立、生产级的Spring应用

  • 内嵌服务器(Tomcat/Jetty/Undertow),无需WAR部署

  • 自动配置,简化配置

  • 提供生产就绪特性(健康检查、指标、外部配置)

  • 无代码生成,无需XML配置

2. 核心注解

复制代码
@SpringBootApplication
// 等价于:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

3. 自动配置原理

复制代码
// 1. spring.factories 中定义自动配置类
// 2. @Conditional 条件注解控制加载
// 3. 通过 spring-boot-autoconfigure 实现

二、自动配置

1. 条件注解

复制代码
@ConditionalOnClass     // 类路径存在指定类
@ConditionalOnMissingClass
@ConditionalOnBean      // 容器中存在指定Bean
@ConditionalOnMissingBean
@ConditionalOnProperty   // 配置属性存在
@ConditionalOnResource   // 资源存在
@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
@ConditionalOnExpression // SpEL表达式

2. 禁用自动配置

复制代码
// 方式1:注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

// 方式2:配置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

3. 自定义 Starter

复制代码
# 1. 创建 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.MyAutoConfiguration

# 2. 创建配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
    // 自动配置逻辑
}

三、配置管理

1. 配置文件优先级

复制代码
# 1. 命令行参数
# 2. 系统环境变量
# 3. 外部配置文件(application-{profile}.yml)
# 4. 内部配置文件(application-{profile}.yml)
# 5. @ConfigurationProperties
# 6. 默认值

2. 多环境配置

复制代码
# application.yml
spring:
  profiles:
    active: @activatedProperties@  # Maven属性

# application-dev.yml
# application-prod.yml
# application-test.yml

3. 配置绑定

复制代码
// 方式1:@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "myapp")
@Data
public class MyConfig {
    private String name;
    private int port;
    private List<String> hosts;
}

// application.yml
myapp:
  name: demo
  port: 8080
  hosts:
    - host1
    - host2

四、Web开发

1. RESTful API

复制代码
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
    
    @PostMapping
    public User createUser(@Valid @RequestBody User user) {
        return userService.save(user);
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, 
                          @RequestBody User user) {
        return userService.update(id, user);
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

2. 全局异常处理

复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e) {
        return Result.error(e.getMessage());
    }
    
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidation(MethodArgumentNotValidException e) {
        String message = e.getBindingResult()
                        .getFieldErrors()
                        .stream()
                        .map(FieldError::getDefaultMessage)
                        .collect(Collectors.joining(","));
        return Result.error(message);
    }
}

3. 拦截器与过滤器

复制代码
// 拦截器
@Component
public class AuthInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) {
        // 鉴权逻辑
        return true;
    }
}

// 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private AuthInterceptor authInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

五、数据访问

1. 整合 MyBatis

复制代码
# application.yml
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true

2. 多数据源配置

复制代码
@Configuration
public class DataSourceConfig {
    
    @Bean
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public SqlSessionFactory primarySqlSessionFactory(
            @Qualifier("primaryDataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
}

3. 事务管理

复制代码
@Service
public class UserService {
    
    @Transactional(rollbackFor = Exception.class)
    public void createUser(User user) {
        // 业务逻辑
        userRepository.save(user);
        // 异常时回滚
    }
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // 事务传播
    }
}

六、缓存

1. 整合 Redis

复制代码
spring:
  redis:
    host: localhost
    port: 6379
    password: 
    database: 0
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

2. 缓存注解

复制代码
@Service
@CacheConfig(cacheNames = "users")
public class UserService {
    
    @Cacheable(key = "#id")
    public User getUser(Long id) {
        return userRepository.findById(id);
    }
    
    @CachePut(key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }
    
    @CacheEvict(key = "#id")
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
    
    @Caching(evict = {
        @CacheEvict(key = "#user.id"),
        @CacheEvict(key = "'list'")
    })
    public void update(User user) {
        // 更新操作
    }
}

七、安全

1. Spring Security 配置

复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

2. JWT 集成

复制代码
@Component
public class JwtTokenUtil {
    
    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }
}

八、消息队列

1. 整合 RabbitMQ

复制代码
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

2. 生产者

复制代码
@Component
public class RabbitProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
    }
}

3. 消费者

复制代码
@Component
@RabbitListener(queues = "queueName")
public class RabbitConsumer {
    
    @RabbitHandler
    public void process(String message) {
        // 处理消息
    }
}

九、监控与管理

1. Actuator 端点

复制代码
management:
  endpoints:
    web:
      exposure:
        include: "*"  # 暴露所有端点
  endpoint:
    health:
      show-details: always

常用端点:

  • /actuator/health- 健康检查

  • /actuator/info- 应用信息

  • /actuator/metrics- 指标

  • /actuator/loggers- 日志级别

  • /actuator/beans- Bean信息

  • /actuator/mappings- 请求映射

2. 自定义健康检查

复制代码
@Component
public class CustomHealthIndicator implements HealthIndicator {
    
    @Override
    public Health health() {
        // 检查逻辑
        boolean isHealthy = checkService();
        
        if (isHealthy) {
            return Health.up()
                    .withDetail("service", "available")
                    .build();
        } else {
            return Health.down()
                    .withDetail("service", "unavailable")
                    .build();
        }
    }
}

十、测试

1. 单元测试

复制代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest {
    
    @MockBean
    private UserRepository userRepository;
    
    @Autowired
    private UserService userService;
    
    @Test
    public void testGetUser() {
        User mockUser = new User();
        mockUser.setId(1L);
        mockUser.setName("test");
        
        when(userRepository.findById(1L))
            .thenReturn(Optional.of(mockUser));
        
        User result = userService.getUser(1L);
        assertEquals("test", result.getName());
    }
}

2. 集成测试

复制代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserService userService;
    
    @Test
    public void testGetUser() throws Exception {
        when(userService.getUser(1L))
            .thenReturn(new User(1L, "test"));
        
        mockMvc.perform(get("/api/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("test"));
    }
}

十一、部署与优化

1. 打包部署

复制代码
# 打包
mvn clean package

# 运行
java -jar target/myapp.jar

# 指定配置
java -jar myapp.jar --spring.profiles.active=prod

2. Docker 部署

复制代码
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

3. 性能优化

复制代码
# 应用优化
server:
  tomcat:
    max-threads: 200
    min-spare-threads: 10
    
# JVM参数
java -Xms512m -Xmx1024m -XX:+UseG1GC -jar app.jar

十二、常见问题

1. 循环依赖

复制代码
// 场景:A依赖B,B依赖A
// 解决方案:
// 1. 使用@Lazy延迟加载
@Component
public class A {
    @Autowired
    @Lazy
    private B b;
}

// 2. 使用Setter/构造器注入
// 3. 使用@PostConstruct

2. Bean 作用域

复制代码
@Scope("singleton")    // 单例(默认)
@Scope("prototype")    // 原型
@Scope("request")      // 请求
@Scope("session")      // 会话
@Scope("application")  // 应用

3. 启动流程

复制代码
1. 加载 SpringApplication
2. 运行 run() 方法
3. 准备环境 Environment
4. 创建 ApplicationContext
5. 执行 ApplicationContextInitializer
6. 加载 BeanDefinitions
7. refresh() 刷新上下文
8. 执行 Runner
9. 启动完成

十三、新版本特性(2.x/3.x)

1. Spring Boot 2.x

  • 响应式编程(WebFlux)

  • Actuator 重构

  • Micrometer 集成

  • 支持 Java 11

  • 自动配置改进

2. Spring Boot 3.x

  • 基于 Spring Framework 6

  • 支持 Java 17+

  • 迁移到 Jakarta EE 9+

  • 原生镜像支持(GraalVM)

  • 改进的 AOT 处理


面试准备建议

  1. 深入理解自动配置原理

  2. 掌握常用注解和配置

  3. 熟悉各模块整合(MyBatis、Redis、MQ等)

  4. 了解性能优化和监控

  5. 准备实际项目经验

  6. 关注版本更新和新特性

  7. 掌握问题排查和调试技巧

高频问题

  • Spring Boot启动流程

  • 自动配置实现原理

  • 如何自定义Starter

  • 多环境配置

  • 事务管理

  • 缓存使用

  • 异常处理

  • 性能监控

  • 部署方案

相关推荐
fygfh.2 小时前
Linux开发中进程与线程的创建与生命周期
java·linux·服务器
小旭95272 小时前
【超详细】Spring 核心知识点全解析(IOC+AOP)
java·后端·spring·maven·intellij-idea
李白的粉2 小时前
基于springboot的阿博图书馆管理系统
java·spring boot·后端·毕业设计·课程设计·源代码·图书馆管理系统
缘空如是2 小时前
基础工具包之pdf操作
java·pdf·搜索和水印
ren049182 小时前
Spring Framework、SpringBoot、Mybatis、Freemarker
spring boot·spring·mybatis
tsyjjOvO2 小时前
Spring 核心知识点全解析(IOC+AOP)
java·后端·spring
absunique2 小时前
Spring boot 3.3.1 官方文档 中文
java·数据库·spring boot
召田最帅boy2 小时前
Spring Boot博客系统集成AI智能摘要功能实战
人工智能·spring boot·后端
96772 小时前
spring boot 终端运行指令以及这个查询端口是否被占用,以及释放端口的命令
java·spring boot·后端