SpringBoot2核心功能面试题库
生成时间: 2026-05-21 23:50
本轮 SpringBoot2核心功能面试题库(带答案)
【面试题】1. @SpringBootApplication注解的组成部分及作用是什么?
【标准答案】 @SpringBootApplication是一个组合注解,它包含了三个核心注解:
- @SpringBootConfiguration:本质上就是@Configuration,表明这是一个配置类
- @EnableAutoConfiguration:开启自动配置,这是SpringBoot的核心
- @ComponentScan:启用组件扫描,默认扫描当前包及子包
面试时可以补充:这个注解简化了配置,让我们不需要手动写这三个注解。如果你想自定义扫描路径,可以用scanBasePackages属性。另外,exclude属性可以排除不需要自动配置的类。
【面试题】2. SpringBoot自动配置原理是什么?
【标准答案】 自动配置的核心流程:
- @EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector
- 这个Selector会扫描META-INF/spring.factories(老版本)或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(新版本)
- 加载所有自动配置类的全限定名
- 每个配置类通过条件注解判断是否生效,比如@ConditionalOnClass检查类路径是否有某个类,@ConditionalOnMissingBean检查容器中是否已有该Bean
- 只有满足条件的配置才会真正生效
关键点:条件注解是核心,它让配置"按需加载",避免创建不需要的Bean。
【面试题】3. 如何开发一个自定义的SpringBoot Starter?
【标准答案】 开发步骤:
- 创建两个模块:starter模块(依赖管理)和autoconfigure模块(自动配置)
- autoconfigure模块中编写:
- 配置类(@Configuration)
- 属性类(@ConfigurationProperties绑定配置)
- 条件注解控制Bean创建
- 在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中配置自动配置类的全限定名
- starter模块只需依赖autoconfigure模块,作为一个"空壳"做依赖管理
面试加分点:提一下命名规范,官方starter是spring-boot-starter-xxx,自定义starter建议xxx-spring-boot-starter。还有就是一定要用条件注解,避免强制依赖导致启动失败。
【面试题】4. SpringBoot配置文件加载顺序和优先级是什么?
【标准答案】 加载顺序(从高到低优先级):
- 命令行参数
- Java系统属性(System.getProperties())
- 操作系统环境变量
- jar包外部的application-{profile}.properties/yml
- jar包内部的application-{profile}.properties/yml
- jar包外部的application.properties/yml
- jar包内部的application.properties/yml
- @Configuration配置类中的@PropertySource
- 默认属性(SpringApplication.setDefaultProperties)
关键点:外层覆盖内层,profile配置覆盖默认配置,命令行参数优先级最高。面试时可以举例:生产环境用java -jar app.jar --server.port=8081来覆盖端口。
【面试题】5. @ConfigurationProperties和@Value的区别是什么?
【标准答案】 主要区别:
- 绑定方式:@ConfigurationProperties支持批量绑定,一个类对应一组配置;@Value是逐个字段注入
- 松散绑定:@ConfigurationProperties支持松散绑定,person.first-name可以映射到firstName属性;@Value不支持
- SpEL表达式:@Value支持SpEL(#{...});@ConfigurationProperties不支持
- 校验:@ConfigurationProperties配合@Validated可以校验配置值;@Value需要手动校验
- 复杂对象:@ConfigurationProperties支持Map、List等复杂类型;@Value处理复杂类型很麻烦
推荐:配置较多时用@ConfigurationProperties,代码更清晰;单个值且需要SpEL时用@Value。
【面试题】6. BeanFactory和ApplicationContext有什么区别?
【标准答案】 两者是继承关系,ApplicationContext继承自BeanFactory,区别:
- 功能范围:BeanFactory只提供基础的Bean管理(获取、创建);ApplicationContext是高级容器,提供国际化、事件发布、资源加载等更多功能
- 初始化时机:BeanFactory是延迟初始化,getBean时才创建;ApplicationContext启动时就会初始化所有单例Bean(除非@Lazy)
- 扩展能力:ApplicationContext自动注册BeanPostProcessor、BeanFactoryPostProcessor;BeanFactory需要手动注册
SpringBoot使用的是AnnotationConfigServletWebServerApplicationContext,属于ApplicationContext的子类。面试时强调:我们开发中基本都用ApplicationContext,BeanFactory更多是框架内部使用。
【面试题】7. BeanPostProcessor和BeanFactoryPostProcessor的区别?
【标准答案】 执行时机和作用不同:
BeanFactoryPostProcessor:
- 执行时机:BeanDefinition加载完成后,Bean实例化之前
- 作用:修改BeanDefinition的属性,比如修改属性值、作用域等
- 典型应用:PropertySourcesPlaceholderConfigurer解析${...}占位符
BeanPostProcessor:
- 执行时机:Bean实例化后,初始化前后
- 作用:对Bean实例进行增强,比如AOP代理、属性注入
- 典型应用:AutowiredAnnotationBeanPostProcessor处理@Autowired
记忆口诀:FactoryPostProcessor处理Definition,PostProcessor处理实例。
【面试题】8. Spring AOP中JDK动态代理和CGLIB代理的区别?
【标准答案】 两种代理方式:
JDK动态代理:
- 基于接口,要求目标类实现接口
- 通过反射生成代理对象
- Spring默认:如果目标类实现接口,优先用JDK
CGLIB代理:
- 基于继承,通过生成子类实现代理
- 可以代理没有接口的类
- 不能代理final方法和final类
SpringBoot 2.x默认使用CGLIB(spring.aop.proxy-target-class=true)。
面试加分:提一下性能差异——JDK在调用时稍快,CGLIB在创建代理对象时稍快。但实际差距很小,不用太纠结。关键是理解两种方式的原理。
【面试题】9. Spring事件机制的使用场景和实现方式?
【标准答案】 使用场景:解耦业务逻辑,比如用户注册成功后发送邮件、记录日志、发放优惠券等,这些操作可以用事件异步处理。
实现步骤:
- 定义事件:继承ApplicationEventjava
public class UserRegisterEvent extends ApplicationEvent { private String username; } - 发布事件:注入ApplicationEventPublisher,调用publishEvent()
- 监听事件:
- 方式一:实现ApplicationListener<UserRegisterEvent>
- 方式二:@EventListener注解(推荐)
- 异步事件:在@EventListener方法上加@Async,需要配置@EnableAsync
注意:默认是同步执行,发布事件后等待所有监听器执行完毕。异步事件需要注意事务边界问题。
【面试题】10. @Transactional注解的传播行为和隔离级别有哪些?
【标准答案】 传播行为(7种,常用3种):
- REQUIRED(默认):有事务就加入,没有就新建
- REQUIRES_NEW:总是新建事务,挂起当前事务
- NESTED:有事务就创建嵌套事务(保存点),没有就新建
其他:SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER
隔离级别(5种):
- DEFAULT:使用数据库默认隔离级别
- READ_UNCOMMITTED:读未提交
- READ_COMMITTED:读已提交
- REPEATABLE_READ:可重复读
- SERIALIZABLE:串行化
面试加分点:提一下失效场景——方法不是public、同类调用不走代理、异常被catch吞掉、抛出检查异常默认不回滚(需要rollbackFor=Exception.class)。
本面试题库覆盖知识点: 自动配置原理、自定义Starter、配置管理、Bean生命周期、AOP代理、事件机制、事务管理