Skip to content

SpringBoot2核心功能面试题库 ​

生成时间: 2026-05-21 23:50


本轮 SpringBoot2核心功能面试题库(带答案) ​

【面试题】1. @SpringBootApplication注解的组成部分及作用是什么? ​

【标准答案】 @SpringBootApplication是一个组合注解,它包含了三个核心注解:

  1. @SpringBootConfiguration:本质上就是@Configuration,表明这是一个配置类
  2. @EnableAutoConfiguration:开启自动配置,这是SpringBoot的核心
  3. @ComponentScan:启用组件扫描,默认扫描当前包及子包

面试时可以补充:这个注解简化了配置,让我们不需要手动写这三个注解。如果你想自定义扫描路径,可以用scanBasePackages属性。另外,exclude属性可以排除不需要自动配置的类。

【面试题】2. SpringBoot自动配置原理是什么? ​

【标准答案】 自动配置的核心流程:

  1. @EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector
  2. 这个Selector会扫描META-INF/spring.factories(老版本)或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(新版本)
  3. 加载所有自动配置类的全限定名
  4. 每个配置类通过条件注解判断是否生效,比如@ConditionalOnClass检查类路径是否有某个类,@ConditionalOnMissingBean检查容器中是否已有该Bean
  5. 只有满足条件的配置才会真正生效

关键点:条件注解是核心,它让配置"按需加载",避免创建不需要的Bean。

【面试题】3. 如何开发一个自定义的SpringBoot Starter? ​

【标准答案】 开发步骤:

  1. 创建两个模块:starter模块(依赖管理)和autoconfigure模块(自动配置)
  2. autoconfigure模块中编写:
    • 配置类(@Configuration)
    • 属性类(@ConfigurationProperties绑定配置)
    • 条件注解控制Bean创建
  3. 在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中配置自动配置类的全限定名
  4. starter模块只需依赖autoconfigure模块,作为一个"空壳"做依赖管理

面试加分点:提一下命名规范,官方starter是spring-boot-starter-xxx,自定义starter建议xxx-spring-boot-starter。还有就是一定要用条件注解,避免强制依赖导致启动失败。

【面试题】4. SpringBoot配置文件加载顺序和优先级是什么? ​

【标准答案】 加载顺序(从高到低优先级):

  1. 命令行参数
  2. Java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. jar包外部的application-{profile}.properties/yml
  5. jar包内部的application-{profile}.properties/yml
  6. jar包外部的application.properties/yml
  7. jar包内部的application.properties/yml
  8. @Configuration配置类中的@PropertySource
  9. 默认属性(SpringApplication.setDefaultProperties)

关键点:外层覆盖内层,profile配置覆盖默认配置,命令行参数优先级最高。面试时可以举例:生产环境用java -jar app.jar --server.port=8081来覆盖端口。

【面试题】5. @ConfigurationProperties和@Value的区别是什么? ​

【标准答案】 主要区别:

  1. 绑定方式:@ConfigurationProperties支持批量绑定,一个类对应一组配置;@Value是逐个字段注入
  2. 松散绑定:@ConfigurationProperties支持松散绑定,person.first-name可以映射到firstName属性;@Value不支持
  3. SpEL表达式:@Value支持SpEL(#{...});@ConfigurationProperties不支持
  4. 校验:@ConfigurationProperties配合@Validated可以校验配置值;@Value需要手动校验
  5. 复杂对象:@ConfigurationProperties支持Map、List等复杂类型;@Value处理复杂类型很麻烦

推荐:配置较多时用@ConfigurationProperties,代码更清晰;单个值且需要SpEL时用@Value。

【面试题】6. BeanFactory和ApplicationContext有什么区别? ​

【标准答案】 两者是继承关系,ApplicationContext继承自BeanFactory,区别:

  1. 功能范围:BeanFactory只提供基础的Bean管理(获取、创建);ApplicationContext是高级容器,提供国际化、事件发布、资源加载等更多功能
  2. 初始化时机:BeanFactory是延迟初始化,getBean时才创建;ApplicationContext启动时就会初始化所有单例Bean(除非@Lazy)
  3. 扩展能力:ApplicationContext自动注册BeanPostProcessor、BeanFactoryPostProcessor;BeanFactory需要手动注册

SpringBoot使用的是AnnotationConfigServletWebServerApplicationContext,属于ApplicationContext的子类。面试时强调:我们开发中基本都用ApplicationContext,BeanFactory更多是框架内部使用。

【面试题】7. BeanPostProcessor和BeanFactoryPostProcessor的区别? ​

【标准答案】 执行时机和作用不同:

  1. BeanFactoryPostProcessor:

    • 执行时机:BeanDefinition加载完成后,Bean实例化之前
    • 作用:修改BeanDefinition的属性,比如修改属性值、作用域等
    • 典型应用:PropertySourcesPlaceholderConfigurer解析${...}占位符
  2. BeanPostProcessor:

    • 执行时机:Bean实例化后,初始化前后
    • 作用:对Bean实例进行增强,比如AOP代理、属性注入
    • 典型应用:AutowiredAnnotationBeanPostProcessor处理@Autowired

记忆口诀:FactoryPostProcessor处理Definition,PostProcessor处理实例。

【面试题】8. Spring AOP中JDK动态代理和CGLIB代理的区别? ​

【标准答案】 两种代理方式:

  1. JDK动态代理:

    • 基于接口,要求目标类实现接口
    • 通过反射生成代理对象
    • Spring默认:如果目标类实现接口,优先用JDK
  2. CGLIB代理:

    • 基于继承,通过生成子类实现代理
    • 可以代理没有接口的类
    • 不能代理final方法和final类

SpringBoot 2.x默认使用CGLIB(spring.aop.proxy-target-class=true)。

面试加分:提一下性能差异——JDK在调用时稍快,CGLIB在创建代理对象时稍快。但实际差距很小,不用太纠结。关键是理解两种方式的原理。

【面试题】9. Spring事件机制的使用场景和实现方式? ​

【标准答案】 使用场景:解耦业务逻辑,比如用户注册成功后发送邮件、记录日志、发放优惠券等,这些操作可以用事件异步处理。

实现步骤:

  1. 定义事件:继承ApplicationEvent
    java
    public class UserRegisterEvent extends ApplicationEvent {
        private String username;
    }
  2. 发布事件:注入ApplicationEventPublisher,调用publishEvent()
  3. 监听事件:
    • 方式一:实现ApplicationListener<UserRegisterEvent>
    • 方式二:@EventListener注解(推荐)
  4. 异步事件:在@EventListener方法上加@Async,需要配置@EnableAsync

注意:默认是同步执行,发布事件后等待所有监听器执行完毕。异步事件需要注意事务边界问题。

【面试题】10. @Transactional注解的传播行为和隔离级别有哪些? ​

【标准答案】 传播行为(7种,常用3种):

  1. REQUIRED(默认):有事务就加入,没有就新建
  2. REQUIRES_NEW:总是新建事务,挂起当前事务
  3. NESTED:有事务就创建嵌套事务(保存点),没有就新建

其他:SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER

隔离级别(5种):

  1. DEFAULT:使用数据库默认隔离级别
  2. READ_UNCOMMITTED:读未提交
  3. READ_COMMITTED:读已提交
  4. REPEATABLE_READ:可重复读
  5. SERIALIZABLE:串行化

面试加分点:提一下失效场景——方法不是public、同类调用不走代理、异常被catch吞掉、抛出检查异常默认不回滚(需要rollbackFor=Exception.class)。


本面试题库覆盖知识点: 自动配置原理、自定义Starter、配置管理、Bean生命周期、AOP代理、事件机制、事务管理