SpringBoot2核心功能面试题库
生成时间:2026-05-24 21:25
本轮 SpringBoot2核心功能面试题库(带答案)
【面试题】1. @SpringBootApplication注解的组合原理是什么?为什么它能替代传统的配置类?
【标准答案】@SpringBootApplication是一个组合注解,包含三个核心注解:
- @SpringBootConfiguration:本质上就是@Configuration,标记为配置类
- @EnableAutoConfiguration:开启自动配置的核心,通过@Import导入AutoConfigurationImportSelector
- @ComponentScan:默认扫描当前包及子包下的所有组件
传统方式需要写三个注解,现在一个搞定。关键点:它默认扫描启动类所在包,所以启动类要放在根包下。如果想自定义扫描范围,可以用scanBasePackages属性。
【面试题】2. SpringBoot的配置文件加载顺序是怎样的?哪些配置优先级最高?
【标准答案】加载顺序从高到低:
- 命令行参数(最高优先级)
- Java系统属性(System.getProperties())
- 操作系统环境变量
- jar包外部的application-{profile}.properties/yml
- jar包内部的application-{profile}.properties/yml
- jar包外部的application.properties/yml
- jar包内部的application.properties/yml
- @PropertySource注解加载的配置(最低优先级)
实战经验:生产环境用命令行参数覆盖配置,如--server.port=8080;多环境用Profile,application-prod.yml比application.yml优先级高。
【面试题】3. BeanPostProcessor和BeanFactoryPostProcessor有什么区别?分别在什么时机执行?
【标准答案】两者执行时机和作用完全不同:
- BeanFactoryPostProcessor:在BeanDefinition加载完成后、Bean实例化前执行,用于修改BeanDefinition的属性,比如PropertySourcesPlaceholderConfigurer解析占位符
- BeanPostProcessor:在Bean实例化后、初始化前后执行,用于对Bean实例进行增强处理
执行顺序:BeanFactoryPostProcessor → Bean实例化 → BeanPostProcessor(初始化前afterPropertiesSet前 → 初始化后)
经典案例:@Autowired由AutowiredAnnotationBeanPostProcessor处理,@ConfigurationProperties由ConfigurationPropertiesBindingPostProcessor处理。
【面试题】4. @Import注解有哪三种导入方式?分别适用什么场景?
【标准答案】三种方式:
- 直接导入配置类:@Import(DataSourceConfig.class),适合导入确定的配置类
- 导入ImportSelector实现类:@Import(MyImportSelector.class),在selectImports方法中返回要导入的类全限定名数组,适合动态选择
- 导入ImportBeanDefinitionRegistrar实现类:@Import(MyRegistrar.class),可以直接注册BeanDefinition,适合需要精细控制Bean注册的场景
源码中@EnableAutoConfiguration用的就是第二种,通过AutoConfigurationImportSelector读取spring.factories动态导入。
【面试题】5. Spring AOP什么时候用JDK动态代理,什么时候用CGLIB?
【标准答案】判断规则:
- 目标类实现了接口:默认用JDK动态代理
- 目标类没有实现接口:必须用CGLIB
- 强制使用CGLIB:spring.aop.proxy-target-class=true或@EnableAspectJAutoProxy(proxyTargetClass=true)
SpringBoot 2.x后默认proxyTargetClass=true,即优先用CGLIB。
实战建议:如果项目中接口定义规范,用JDK代理语义清晰;如果用@service注解直接代理实现类,CGLIB更合适。注意CGLIB不能代理final方法。
【面试题】6. Spring事件机制的执行流程是怎样的?如何实现异步事件?
【标准答案】核心流程:
- 定义事件类继承ApplicationEvent
- 监听器实现ApplicationListener或使用@EventListener
- 发布者调用ApplicationContext.publishEvent()发布事件
- Spring同步调用所有匹配的监听器
异步事件两种方式:
- 监听方法上加@Async,配合@EnableAsync启用异步 2.配置SimpleApplicationEventMulticaster的taskExecutor属性
注意事项:异步事件中异常不会传播到发布者,需要单独处理;事件监听器默认同步执行,性能敏感场景用异步。
【面试题】7. 拦截器(Interceptor)和过滤器(Filter)的区别是什么?执行顺序怎样?
【标准答案】区别从三个维度看:
- 所属层级:Filter属于Servlet容器,Interceptor属于Spring容器
- 拦截范围:Filter拦截所有请求包括静态资源,Interceptor只拦截Controller方法
- 功能能力:Interceptor可以注入Spring Bean,可以获取Handler方法信息
执行顺序:请求 → Filter → DispatcherServlet → Interceptor(preHandle) → Controller → Interceptor(postHandle) → 视图渲染 → Interceptor(afterCompletion) → Filter → 响应
实战场景:跨域处理、登录校验用Interceptor;请求日志、编码转换用Filter。
【面试题】8. @Transactional的传播行为有哪些?REQUIRED和REQUIRES_NEW有什么区别?
【标准答案】7种传播行为,常用4种:
- REQUIRED(默认):有事务就加入,没有就新建
- REQUIRES_NEW:总是新建事务,挂起当前事务
- NESTED:有事务就创建嵌套事务,没有就新建
- SUPPORTS:有事务就加入,没有就以非事务方式执行
REQUIRED vs REQUIRES_NEW:
- REQUIRED:方法B加入方法A的事务,A或B任一异常,整体回滚
- REQUIRES_NEW:方法B新建独立事务,B的异常不影响A(除非A捕获B的异常)
经典场景:日志记录即使业务失败也要入库,用REQUIRES_NEW。
【面试题】9. @Cacheable缓存注解的工作原理是什么?如何保证缓存一致性?
【标准答案】工作原理:
- AOP拦截标注@Cacheable的方法
- 执行前先查缓存,key由KeyGenerator生成(默认参数组合)
- 缓存命中直接返回,未命中执行方法并将结果写入缓存
- @CachePut每次执行方法并更新缓存
- @CacheEvict删除缓存
缓存一致性策略:
- 失效模式:更新数据库后立即@CacheEvict删除缓存
- 双写模式:更新数据库后@CachePut同步更新缓存
- 分布式锁:高并发场景用Redis分布式锁防止缓存穿透
生产经验:缓存key设计要包含业务标识,避免key冲突;设置合理的TTL防止脏数据。
【面试题】10. SpringBoot Actuator的核心端点有哪些?如何保障端点安全?
【标准答案】核心端点:
- /health:应用健康状态,显示数据库、Redis等组件状态
- /info:应用信息,可自定义git、build信息
- /metrics:性能指标,包括JVM内存、HTTP请求统计
- /env:环境变量和配置属性
- /beans:Spring Bean列表
- /mappings:URL映射信息
安全策略:
- management.endpoints.web.exposure.include=health,info 只暴露必要端点
- management.endpoint.health.show-details=when_authorized 敏感信息需授权
- 引入Spring Security,配置/actuator/**需要认证
- 生产环境用management.server.port修改端口,隔离内网访问
监控集成:/actuator/prometheus端点对接Prometheus,Grafana做可视化监控面板。
本文档包含10道SpringBoot2核心功能面试题,涵盖自动配置、配置管理、Bean生命周期、AOP、事件机制、Web开发、事务管理、缓存、监控等核心考点。