当前位置: 首页 > news >正文

Spring Boot 常用注解面试题深度解析

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

      • Spring Boot 常用注解面试题深度解析
        • 一、核心启动注解(必考)
        • 二、Bean 管理与依赖注入
        • 三、Spring MVC 注解
        • 四、配置与属性绑定
        • 五、高级特性注解
        • 六、事务与测试
        • 七、生产实践与高频问题
        • 高频面试题汇总
      • 总结:Spring Boot 注解学习路径


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

Spring Boot 常用注解面试题深度解析

在这里插入图片描述

以下精选 25+ 高频注解面试题,涵盖核心原理、实战技巧及源码级分析,助你轻松应对面试挑战。


一、核心启动注解(必考)
  1. @SpringBootApplication 的作用是什么?包含哪些关键注解?

    • 核心作用:开启自动配置 + 组件扫描 + 配置类声明
    • 元注解组成:
      @SpringBootConfiguration  // 声明为配置类
      @EnableAutoConfiguration  // 启用自动配置
      @ComponentScan            // 包扫描(默认当前包及其子包)
      
  2. @EnableAutoConfiguration 如何实现自动装配?

    1. 加载 META-INF/spring.factories 中的配置类
    2. 通过 @Conditional 系列注解按条件装配 Bean
    3. 核心流程:
      graph LR
      A[启动类] --> B[@SpringBootApplication]
      B --> C[@EnableAutoConfiguration]
      C --> D[AutoConfigurationImportSelector]
      D --> E[加载spring.factories]
      E --> F[过滤@Conditional条件]
      F --> G[注册Bean定义]
      

二、Bean 管理与依赖注入
  1. @Component@Bean 的区别?
    对比表

    特性@Component@Bean
    作用目标类声明方法声明
    控制权Spring 自动实例化开发者手动创建对象
    适用场景自定义类第三方库组件
    依赖注入支持 @Autowired需在配置类中使用
  2. @Autowired@Resource 的区别?

    • @Autowired
      • 按类型注入 → byType
      • 支持 @Qualifier 指定名称
      • 是 Spring 原生注解
    • @Resource
      • 默认按名称注入 → byName(失败时回退到 byType)
      • JDK 原生注解(javax.annotation
    // 示例
    @Autowired @Qualifier("mysqlService") 
    private DataService service1;@Resource(name = "oracleService") 
    private DataService service2;
    

三、Spring MVC 注解
  1. @RestController@Controller 的区别?

    • @Controller
      • 需要配合 @ResponseBody 返回 JSON
      • 通常返回视图名称
    • @RestController = @Controller + @ResponseBody
      • 所有方法自动 JSON 序列化
    // 传统写法
    @Controller
    public class OldController {@ResponseBodypublic User getUser() { /* ... */ }
    }// 现代写法
    @RestController
    public class NewController {@GetMapping("/user")public User getUser() { /* ... */ } // 自动转JSON
    }
    
  2. @PathVariable@RequestParam 的应用场景?
    对比

    注解位置示例 URL获取方式
    @PathVariableURL 路径/users/{id}id = 123
    @RequestParam查询字符串/search?keyword=Springkeyword = "Spring"

四、配置与属性绑定
  1. @Value@ConfigurationProperties 如何选择?

    • @Value
      • 适合单个属性注入
      • 支持 SpEL 表达式
      @Value("${server.port}") 
      private int port;
      
    • @ConfigurationProperties
      • 批量绑定属性到对象
      • 支持类型安全校验
      @ConfigurationProperties(prefix = "datasource")
      public class DataSourceConfig {private String url;private String username;// getters/setters
      }
      
  2. @PropertySource 加载自定义配置的注意事项?

    • 默认不支持 YAML 文件(需配合 YamlPropertySourceFactory
    • 多文件加载顺序决定属性覆盖关系
    @Configuration
    @PropertySource(value = "classpath:custom.properties", encoding = "UTF-8")
    public class AppConfig { /* ... */ }
    

五、高级特性注解
  1. @Conditional 系列注解的工作原理?(重点)
    核心条件注解

    注解激活条件
    @ConditionalOnClass类路径存在指定类
    @ConditionalOnBeanSpring 容器存在指定 Bean
    @ConditionalOnProperty配置属性匹配条件
    @ConditionalOnWebApplication当前是 Web 应用

    源码解析

    // 自定义条件
    public class EnvCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String env = context.getEnvironment().getProperty("app.env");return "prod".equals(env);}
    }// 使用示例
    @Bean
    @Conditional(EnvCondition.class)
    public Service prodService() { /* ... */ }
    
  2. @Async 实现异步调用的线程池配置?
    最佳实践

    @Configuration
    @EnableAsync
    public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-");return executor;}
    }// 使用
    @Service
    public class EmailService {@Async("taskExecutor") // 指定线程池public void sendEmail() { /* ... */ }
    }
    

六、事务与测试
  1. @Transactional 在类和方法上的优先级?
    规则

    • 方法注解 > 类注解
    • 接口注解无效(需基于类代理)
    @Service
    @Transactional // 类级别默认事务
    public class UserService {public void updateProfile() { /* 使用类事务 */ }@Transactional(propagation = Propagation.REQUIRES_NEW)public void auditLog() { /* 独立事务 */ }
    }
    
  2. @SpringBootTest@WebMvcTest 的区别?
    对比

    测试注解测试范围启动容器适用场景
    @SpringBootTest完整集成测试服务层/DAO层测试
    @WebMvcTest仅Web MVC层控制器单元测试
    @DataJpaTest仅JPA组件仓库层测试
    // 控制器测试示例
    @WebMvcTest(UserController.class)
    public class UserControllerTest {@Autowired MockMvc mvc;@MockBean UserService userService;@Testvoid getUserTest() throws Exception {mvc.perform(get("/users/1")).andExpect(status().isOk());}
    }
    

七、生产实践与高频问题
  1. 如何自定义 Starter?
    关键步骤

    1. 创建 xxx-spring-boot-autoconfigure 模块
    2. 编写自动配置类:
      @Configuration
      @ConditionalOnClass(MyService.class)
      @EnableConfigurationProperties(MyProperties.class)
      public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyProperties props) {return new MyService(props);}
      }
      
    3. META-INF/spring.factories 注册:
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration
      
  2. @ControllerAdvice 的三种用法?

    @ControllerAdvice
    public class GlobalHandler {// 1. 异常处理@ExceptionHandler(NotFoundException.class)public ResponseEntity<Error> handleNotFound(NotFoundException ex) {return ResponseEntity.status(404).body(new Error(ex.getMessage()));}// 2. 数据绑定预处理@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(...));}// 3. 模型数据增强@ModelAttributepublic void addCommonModel(Model model) {model.addAttribute("appName", "MyApp");}
    }
    

高频面试题汇总
  1. @SpringBootApplication 的三个核心注解分别起什么作用?
  2. @Autowired 注入失败有哪些可能原因?

    答:未扫描包、多个实现类未限定、Bean未创建、静态字段注入等

  3. 如何让 @Scheduled 定时任务在集群中只执行一次?

    答:配合 @ConditionalOnProperty 或分布式锁(如 Redis Lock)

  4. @Transactional 失效的常见场景?

    答:自调用、非 public 方法、异常类型错误、数据库引擎不支持

  5. @RequestParam vs @RequestBody 的区别?

    答:前者处理 URL 参数,后者处理 JSON/XML 请求体


总结:Spring Boot 注解学习路径

  1. 基础层
    • 启动注解:@SpringBootApplication
    • Bean 管理:@Component, @Bean, @Autowired
  2. Web 层
    • REST 控制:@RestController, @GetMapping
    • 参数处理:@PathVariable, @RequestBody
  3. 数据层
    • 数据访问:@Repository, @Transactional
    • 配置绑定:@ConfigurationProperties
  4. 高级特性
    • 条件装配:@Conditional 系列
    • 异步处理:@Async, @EnableAsync
  5. 测试与生产
    • 测试切片:@WebMvcTest, @DataJpaTest
    • 全局处理:@ControllerAdvice, @RestControllerAdvice

掌握这些注解的原理和应用场景,不仅能轻松应对面试,更能构建健壮高效的 Spring Boot 应用。


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

  • 从二叉树到 STL:揭开 set 容器的本质与用法
  • SDC命令详解:使用set_fanout_load命令进行约束
  • 为什么需要自动下载浏览器驱动?
  • VBA信息获取与处理专题五第一节:利用CDO发送简单邮件
  • 大模型微调技术全景图:从全量更新到参数高效适配
  • NumPy数组操作完全指南:从入门到精通
  • 云服务器Xshell登录拒绝访问排查
  • pg数据库表里面id值,使用sql语句赋值,唯一性
  • Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
  • 八皇后问题深度解析
  • 攻防世界-XCTF-Web安全最佳刷题路线
  • 《状压DP》题集
  • hbase资源和数据权限控制
  • 【Linux基础知识系列】第十一篇-Linux系统安全
  • 【VLAs篇】02:Impromptu VLA—用于驱动视觉-语言-动作模型的开放权重和开放数据
  • CSS3相关知识点
  • 使用ReactNative加载Svga动画支持三端【Android/IOS/Harmony】
  • React 新项目
  • SpringBoot自动化部署全攻略:CI/CD高效实践与避坑指南
  • 企业配电系统安全升级,从局放监测开始
  • 海口有哪几家是做网站的/网络营销是做什么的工作
  • 做问卷的网站有那些/拼多多代运营公司十大排名
  • 外贸自助建站/外贸网站建站平台
  • soho网站建设/广州百度seo
  • 智慧团建电脑版登录/优化关键词有哪些方法
  • 做网站站长交加盟费/搜索引擎广告案例