【Spring注解】Spring生态常见注解——面试高频考点总结

简介: 本文系统梳理Spring生态高频面试注解考点,直击本质——注解只是表象,核心考察IOC容器、Bean生命周期、MVC流程、AOP代理、自动配置与事务机制等底层原理。涵盖@Component/@Configuration、@Autowired/@Resource、@RestController、@Transactional、@SpringBootApplication、@RequestBody等七大类注解的辨析、原理、坑点 及 TOP10 必背题。

Spring生态常见注解面试高频考点总结

面试考察核心:注解是Spring生态的语法糖,面试官真正考察的是注解背后的IOC容器、Bean生命周期、MVC执行流程、AOP代理机制、自动配置原理、事务管理机制,而非单纯记忆注解功能。


一、Spring IOC核心组件注解

(@Component、@Controller、@Service、@Repository、@Configuration)

基础必问考点

  1. @Component、@Controller、@Service、@Repository的区别与联系
    • 核心联系:4个注解的元注解均包含@Component,本质都是将类注册为Spring Bean,功能上无本质区别。
    • 核心区别:语义化分层,便于代码可读性和Spring后续扩展;仅@Repository有额外功能:将数据库层的原生异常转换为Spring统一的DataAccessException异常体系。
  2. @Component和@Configuration的核心区别
    • @Component:Lite轻量级模式,类中@Bean方法不会被CGLIB代理,多次调用会生成多个实例,无法保证单例。
    • @Configuration:Full全模式,类会被CGLIB动态代理,类中@Bean方法无论调用多少次,都会从IOC容器中获取单例Bean,保证Bean的单例性。
  3. @ComponentScan的核心作用与默认规则
    • 核心作用:指定扫描包路径,自动识别并注册带@Component及其派生注解的类为Spring Bean。
    • 默认规则:@SpringBootApplication中默认扫描启动类所在包及其子包,超出该路径的组件不会被自动注册。
  4. 元注解的定义,以及组件注解的核心元注解
    • 元注解:标注注解的注解,核心包括@Target(作用域)、@Retention(生命周期)、@Documented@Inherited
    • 所有组件注解的核心元注解均包含@Component,实现注解的派生与继承。

进阶深挖考点

  1. 如何自定义@Component派生注解?(给自定义注解添加元注解@Component,即可实现和@Service一样的Bean注册功能)
  2. @ComponentScan的过滤规则:includeFiltersexcludeFilters的使用,以及TypeFilter的5种类型(注解、赋值、正则、自定义等)。
  3. Spring容器识别组件注解的底层流程:ClassPathBeanDefinitionScanner扫描→解析注解生成BeanDefinition→注册到IOC容器。
  4. @Configuration的Full模式和Lite模式的底层实现,以及各自的适用场景。

踩坑避坑考点

  1. @Component标注在接口上不生效:Spring仅扫描并实例化类,接口需要FactoryBean(如MyBatis的@Mapper)才能生成代理对象。
  2. @Configuration类中@Bean方法为private/static,会导致单例失效:private方法无法被CGLIB代理,static方法属于类,不会走代理逻辑。
  3. 组件注解不生效90%的原因:类不在@ComponentScan的扫描路径内。

二、依赖注入注解

(@Autowired、@Qualifier、@Resource、@Primary)

基础必问考点

  1. @Autowired和@Resource的核心区别(超高频,每场面试必问)
维度 @Autowired @Resource
所属框架 Spring Framework JSR-250 Java官方标准
注入规则 默认按类型(byType)匹配,同类型多Bean时按名称(byName)匹配 默认按名称(byName)匹配,找不到名称再按类型(byType)匹配
核心属性 required(是否必须注入) name(指定Bean名称)、type(指定Bean类型)
作用域 构造器、方法、字段、参数 字段、setter方法
  1. @Qualifier的核心作用
    配合@Autowired使用,强制按名称(byName)指定注入的Bean,解决同类型多个Bean的注入冲突问题。
  2. @Primary的核心作用,与@Qualifier的优先级
    • 作用:当存在多个同类型Bean时,标注@Primary的Bean为默认优先注入的Bean。
    • 优先级:@Qualifier > @Primary@Qualifier是强制指定,优先级更高。
  3. @Autowired的注入流程
    按类型匹配Bean→匹配到多个Bean时,按参数名称匹配→匹配不到且required=true时抛出异常。

进阶深挖考点

  1. @Autowired标注在构造器、setter、字段上的区别,以及推荐用法
    • 字段注入:写法最简单,但无法保证依赖不可变,不便于单元测试,Spring官方不推荐。
    • 构造器注入:Spring 4.3+单构造器可省略@Autowired,能保证依赖不可变、不为空,便于测试,是Spring官方推荐的注入方式。
    • setter注入:适用于可选依赖、可动态修改的依赖。
  2. 循环依赖问题:@Autowired字段注入能解决循环依赖,构造器注入不能的底层原因
    字段注入是先实例化Bean,再给字段注入依赖,可通过Spring三级缓存提前暴露半成品Bean;构造器注入是实例化Bean时就需要依赖,无法提前暴露,因此无法解决循环依赖。
  3. @Autowired标注在静态字段上不生效的原因
    静态字段属于类,在JVM类加载时就完成初始化;而Spring依赖注入是基于对象实例,容器启动时静态变量已初始化完成,无法注入。

踩坑避坑考点

  1. @Autowired注入对象为null的高频原因
    • 类没有被Spring管理(没加组件注解);
    • 手动new了类的对象,而非从Spring容器获取;
    • 标注在静态字段上;
    • 多例Bean的注入时机问题。
  2. 同类型多个Bean注入时,仅加@Autowired会启动报错,需配合@Qualifier/@Primary/@Resource解决。
  3. @Resource指定了name属性后,若对应名称的Bean不存在,会直接抛出异常,不会再按类型匹配。

三、Spring MVC/Web层注解

(@Controller、@RestController、@RequestMapping、@GetMapping等、@RequestBody、@RequestParam、@PathVariable、@RestControllerAdvice、@ExceptionHandler)

基础必问考点

  1. @Controller和@RestController的核心区别(超高频)
    @RestController = @Controller + @ResponseBody,标注@RestController的类,所有方法默认将返回值写入HTTP响应体,不会被视图解析器解析为视图,专门用于前后端分离的RESTful API开发。
  2. @RequestBody、@RequestParam、@PathVariable的核心区别
注解 参数来源 核心适用场景 支持的HTTP方法
@RequestBody HTTP请求体 接收POST/PUT请求的JSON/XML复杂对象 主要POST/PUT(GET无请求体)
@RequestParam URL查询参数、表单参数 接收简单类型的查询条件(如?page=1&size=10) 所有HTTP方法
@PathVariable URL路径占位符 RESTful风格的资源定位(如/users/{id}) 所有HTTP方法
  1. @RequestMapping和@GetMapping/@PostMapping等注解的区别
    @GetMapping/@PostMapping/@PutMapping/@DeleteMapping@RequestMapping的HTTP方法特化版本,本质是@RequestMapping(method = 对应HTTP方法),简化写法,强制限定HTTP方法,语义更清晰。
  2. @ResponseBody的核心作用与底层原理
    作用:将方法返回值直接写入HTTP响应体,不走视图解析器。
    底层:通过HttpMessageConverter(消息转换器)将Java对象序列化为JSON/XML格式,根据请求的Accept和响应的Content-Type匹配对应的转换器。
  3. 全局异常处理注解的核心用法
    • @RestControllerAdvice@ControllerAdvice + @ResponseBody,用于定义RESTful服务的全局异常处理、全局数据绑定、全局数据预处理。
    • @ExceptionHandler:标注异常处理方法,指定要处理的异常类型,匹配规则为异常类型越精准,优先级越高

进阶深挖考点

  1. @RequestBody只能在一个方法中使用一次的底层原因
    HTTP请求体的输入流只能读取一次,读取完成后流会关闭,因此一个方法中只能有一个@RequestBody参数。
  2. @RequestMapping的consumes和produces属性的作用
    • consumes:限制请求的Content-Type,只有匹配的请求才会进入该方法。
    • produces:指定响应的Content-Type和编码,同时告诉客户端返回的数据格式。
  3. 全局异常处理的执行流程
    DispatcherServlet捕获请求处理过程中的异常→遍历@RestControllerAdvice类中的@ExceptionHandler方法→匹配最贴合的异常类型→执行方法并将返回值写入响应体。
  4. @ExceptionHandler无法捕获Filter中异常的原因
    Filter的执行顺序在DispatcherServlet之前,异常抛出时还未进入Spring MVC的处理流程,因此无法被全局异常处理器捕获。

踩坑避坑考点

  1. @RequestBody接收参数报415 Unsupported Media Type
    高频原因:请求头未加Content-Type: application/json,或项目中没有引入JSON序列化依赖(如jackson-databind),没有对应的消息转换器。
  2. @RequestBody接收参数报400 Bad Request
    高频原因:JSON格式错误、Java对象字段类型与JSON不匹配、缺少必填字段、开启了参数校验但校验不通过。
  3. @RestControllerAdvice不生效
    高频原因:类不在Spring扫描路径内、异常被try-catch吃掉未抛出、异常类型匹配错误。
  4. GET方法中使用@RequestBody不生效:GET请求规范中无请求体,浏览器和服务器会忽略GET请求的请求体内容。

四、Spring Boot启动与配置注解

(@SpringBootApplication、@EnableAutoConfiguration、@Import、@Conditional、@Value、@ConfigurationProperties)

基础必问考点

  1. @SpringBootApplication的组成与核心作用(超高频,Spring Boot必问)
    该注解是组合注解,核心由3个注解组成:
    • @SpringBootConfiguration:本质是@Configuration,标注启动类为配置类。
    • @EnableAutoConfiguration:开启Spring Boot自动配置,是Spring Boot的核心。
    • @ComponentScan:开启组件扫描,默认扫描启动类所在包及子包。
  2. @EnableAutoConfiguration的核心原理(超高频)
    基于Java SPI机制,加载META-INF/spring.factories文件中配置的所有自动配置类,结合@Conditional系列条件注解,按需装配符合条件的自动配置类,实现“约定大于配置”。
  3. @Value和@ConfigurationProperties的核心区别
维度 @Value @ConfigurationProperties
注入方式 单个字段逐个注入 批量注入配置文件中的属性,绑定到Java类
类型安全 不支持,类型不匹配仅运行时报错 支持,编译期即可发现类型不匹配问题
松散绑定 不支持 完美支持(驼峰、短横线、下划线、大写均可匹配)
SpEL表达式 支持 不支持
复杂类型封装 不支持(如Map、对象嵌套) 完美支持
  1. @Import注解的核心作用与3种使用方式
    作用:手动向Spring容器中导入组件,实现模块化配置。
    3种用法:
    1. 导入普通类或配置类;
    2. 导入ImportSelector实现类,批量导入类名;
    3. 导入ImportBeanDefinitionRegistrar实现类,手动注册BeanDefinition。
  2. @Conditional注解的核心作用,以及Spring Boot的派生注解
    作用:按条件装配Bean,只有满足指定条件,才会将Bean注册到容器中,是Spring Boot自动配置的核心。
    常用派生注解:@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty@ConditionalOnMissingClass等。

进阶深挖考点

  1. Spring Boot自动配置的完整执行流程
    启动类加载@SpringBootApplication→开启@EnableAutoConfiguration→通过@Import导入AutoConfigurationImportSelector→加载spring.factories中的自动配置类→通过@Conditional过滤不符合条件的配置类→将符合条件的配置类注册到IOC容器。
  2. 自定义Spring Boot Starter的核心步骤与注解使用
    核心步骤:定义配置属性类(@ConfigurationProperties)→定义自动配置类(@Configuration+@Conditional)→SPI配置spring.factories→打包引入。
  3. @ConditionalOnBean和@ConditionalOnMissingBean的执行顺序陷阱
    这两个注解的执行结果依赖Bean的注册顺序,因此自动配置类通常会配合@AutoConfigureAfter/@AutoConfigureBefore控制加载顺序,避免条件判断失效。
  4. @ConfigurationProperties的开启方式
    两种方式:给绑定类加@Component注解,或在配置类上加@EnableConfigurationProperties(绑定类.class)

踩坑避坑考点

  1. @Value注入为null的高频原因
    类没被Spring管理、标注在静态字段上、EL表达式写错、配置文件未被加载。
  2. @ConfigurationProperties不生效的高频原因
    没开启绑定、prefix属性写错、字段没有对应的getter/setter方法、配置文件中属性名不匹配。
  3. 自定义自动配置类不生效spring.factories配置错误、@Conditional条件不满足、类不在扫描路径内。
  4. @ConditionalOnMissingBean不生效:Bean注册顺序错误,自动配置类先于自定义Bean加载,导致条件判断失效。

五、事务与AOP注解

(@Transactional、@Aspect、@Pointcut、@Before/@Around等)

基础必问考点

  1. @Transactional注解的核心作用与底层原理
    作用:开启Spring声明式事务管理,保证方法内的数据库操作要么全部成功、要么全部回滚。
    底层:基于Spring AOP动态代理,在目标方法执行前开启事务,执行成功提交事务,抛出异常回滚事务。
  2. @Transactional的核心属性(超高频)
    • propagation:事务传播行为,默认REQUIRED(当前有事务就加入,没有就新建);
    • isolation:事务隔离级别,默认使用数据库的默认隔离级别;
    • rollbackFor:指定触发回滚的异常类型,默认仅回滚RuntimeExceptionError
    • readOnly:是否为只读事务,默认false;
    • timeout:事务超时时间。
  3. Spring事务7种传播行为,核心3种的区别
    • REQUIRED:默认值,支持当前事务,没有就新建,最常用;
    • REQUIRES_NEW:新建独立事务,挂起当前事务,内外事务互不影响;
    • NESTED:嵌套事务,基于保存点,外部事务回滚会影响内部,内部回滚不影响外部。
  4. AOP的5种通知类型与对应注解
    • @Before:前置通知,目标方法执行前执行;
    • @Around:环绕通知,目标方法执行前后执行,可控制目标方法是否执行,功能最强;
    • @After:后置通知,目标方法执行后(无论是否抛出异常)执行;
    • @AfterReturning:返回通知,目标方法正常执行并返回后执行;
    • @AfterThrowing:异常通知,目标方法抛出异常后执行。
  5. @Pointcut的核心作用
    定义切入点表达式,复用切入点规则,指定要拦截的目标方法,常用表达式类型:execution(方法匹配)、@annotation(注解匹配)、within(类匹配)。

进阶深挖考点

  1. @Transactional注解失效的10+种场景(超高频,必背)
    高频失效场景:
    1. 标注在非public方法上(Spring AOP仅拦截public方法);
    2. 同一个类内,非事务方法调用事务方法(this调用,不走代理对象,无法被AOP拦截);
    3. 异常被try-catch吃掉,没有抛出;
    4. 未指定rollbackFor = Exception.class,抛出检查异常时不回滚;
    5. 数据库引擎不支持事务(如MySQL的MyISAM引擎);
    6. 标注在static/final方法上(无法被CGLIB代理);
    7. 传播行为配置错误;
    8. 多线程场景下,事务不在同一个线程中(事务基于ThreadLocal实现);
    9. 类没被Spring管理。
  2. Spring AOP的两种代理模式区别
    • JDK动态代理:基于接口实现,要求目标类必须实现接口,生成接口的实现类代理;
    • CGLIB动态代理:基于继承实现,生成目标类的子类代理,无需实现接口;
    • Spring默认规则:Spring Boot 2.x+默认使用CGLIB代理,目标类实现接口时使用JDK代理,无接口时使用CGLIB代理。
  3. 多个切面的执行顺序控制:通过@Order注解指定,值越小,切面优先级越高,前置通知先执行,后置通知后执行。
  4. readOnly=true的底层优化:告诉Spring该事务没有数据修改操作,数据库层面会做优化,如MySQL的只读事务会避免锁等待,提升查询性能。

踩坑避坑考点

  1. 异常被catch住后,即使手动抛出异常,也必须是rollbackFor指定的异常类型,否则不会回滚。
  2. @Around通知必须调用ProceedingJoinPoint.proceed()方法,否则目标方法不会执行。
  3. 切入点表达式写错,导致切面不生效,最常见的是包路径、方法返回值、参数匹配错误。
  4. 嵌套事务中,传播行为配置错误,导致事务回滚不符合预期。

六、MyBatis/MyBatis-Plus注解

(@Mapper、@Select/@Insert等、@TableName、@TableId、@TableField)

基础必问考点

  1. @Mapper注解的核心作用,与@Repository的区别
    • @Mapper:MyBatis注解,标注Mapper接口,MyBatis会自动生成接口的JDK动态代理实现类,注册为Spring Bean。
    • @Repository:Spring注解,仅标注DAO层组件,无法生成Mapper代理对象,必须配合@MapperScan扫描才能生效。
  2. @Mapper和@MapperScan的区别
    • @Mapper:单个接口标注,需要给每个Mapper接口都加注解;
    • @MapperScan:批量扫描指定包路径下的所有Mapper接口,无需逐个加@Mapper注解。
  3. @TableName、@TableId、@TableField的核心作用
    • @TableName:标注实体类,指定对应的数据库表名,解决实体类名与表名不一致的问题。
    • @TableId:标注主键字段,指定主键字段名和主键生成策略,常用策略:AUTO(数据库自增)、ASSIGN_ID(雪花算法)。
    • @TableField:标注非主键字段,指定字段名、是否为表字段(exist)、自动填充策略(fill)等。
  4. @Select/@Insert/@Update/@Delete注解的作用
    直接在Mapper接口方法上标注SQL语句,替代XML映射文件,适用于简单的CRUD操作,复杂SQL仍推荐使用XML。

进阶深挖考点

  1. MyBatis Mapper接口的底层原理
    基于JDK动态代理,启动时扫描Mapper接口,生成MapperProxy代理对象,代理对象调用SqlSession实现SQL的执行与结果映射。
  2. @Insert注解获取自增主键的方式
    添加属性useGeneratedKeys = truekeyProperty = "主键字段名",执行插入后会将自增主键回写到实体类中。
  3. MyBatis-Plus自动填充功能的实现
    实现MetaObjectHandler接口,重写插入/更新填充方法,同时给实体类字段添加@TableField(fill = FieldFill.INSERT/UPDATE)注解。
  4. @TableField(exist = false)的使用场景
    标注实体类中不属于数据库表的字段,避免MP生成SQL时拼接该字段,常用于关联查询的扩展字段。

踩坑避坑考点

  1. @Mapper注解不生效:没加@MapperScan、扫描包路径错误、接口方法与XML中的id不匹配。
  2. @TableId自增策略不生效:数据库表主键未设置自增、MP全局配置覆盖了注解配置。
  3. @TableField自动填充不生效:未实现MetaObjectHandlerfill属性配置错误、字段类型不匹配。
  4. 注解中写动态SQL不生效:动态SQL必须用<script>标签包裹,否则MyBatis无法解析。
  5. 下划线转驼峰不生效:未开启mybatis.configuration.map-underscore-to-camel-case = true配置。

七、【重点】面试终极高频TOP10必背考点

  1. @Autowired和@Resource的核心区别
  2. @Controller和@RestController的核心区别
  3. @SpringBootApplication的组成与@EnableAutoConfiguration的底层原理
  4. @Transactional的失效场景与核心属性
  5. @Component和@Configuration的区别
  6. @RequestBody、@RequestParam、@PathVariable的区别
  7. Spring AOP的5种通知类型与执行顺序
  8. @Value和@ConfigurationProperties的区别
  9. Spring事务的传播行为与隔离级别
  10. @Mapper和@Repository的区别

(注:十大高频考点的答案均在上文)

相关文章
|
10天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11182 104
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
10天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
5798 136
|
8天前
|
人工智能 并行计算 Linux
本地私有化AI助手搭建指南:Ollama+Qwen3.5-27B+OpenClaw阿里云/本地部署流程
本文提供的全流程方案,从Ollama安装、Qwen3.5-27B部署,到OpenClaw全平台安装与模型对接,再到RTX 4090专属优化,覆盖了搭建过程的每一个关键环节,所有代码命令可直接复制执行。使用过程中,建议优先使用本地模型保障隐私,按需切换云端模型补充功能,同时注重显卡温度与显存占用监控,确保系统稳定运行。
2002 6
|
6天前
|
人工智能 自然语言处理 供应链
【最新】阿里云ClawHub Skill扫描:3万个AI Agent技能中的安全度量
阿里云扫描3万+AI Skill,发现AI检测引擎可识别80%+威胁,远高于传统引擎。
1407 3
|
7天前
|
人工智能 Linux API
离线AI部署终极手册:OpenClaw+Ollama本地模型匹配、全环境搭建与问题一站式解决
在本地私有化部署AI智能体,已成为隐私敏感、低成本、稳定运行的主流方案。OpenClaw作为轻量化可扩展Agent框架,搭配Ollama本地大模型运行工具,可实现完全离线、无API依赖、无流量费用的个人数字助理。但很多用户在实践中面临三大难题:**不知道自己硬件能跑什么模型、显存/内存频繁爆仓、Skills功能因模型不支持工具调用而失效**。
3367 7