资讯动态

SpringBoot:核心注解全景梳理 / @xxx 叫“注解”(Annotation)

发布时间:2026/10/22 6:33:53 来源:尧图企业网站定制
xxx叫“注解”Annotation它本身不是代码逻辑而是一个“标签”。你可以在类、方法、字段上贴标签然后让别人框架、编译器根据标签做相应的事。一句话注解 贴在代码上的“标签”本身不执行逻辑只是给编译器/框架“看”的说明。你贴了标签框架就会自动帮你干活。一个生活化的类比快递箱上贴着易碎品️倒置的标签。标签本身不会保护箱子但搬运工人框架看到标签就会轻拿轻放。注解就是贴在代码上的标签框架就是看标签干活的工人。本文把SpringBoot常用注解按启动入口、配置注入、Bean注册、AOP、Web、事务、条件装配、测试八大维度整理采用多表格汇总区分Spring原生注解与SpringBoot扩展注解附带作用、使用场景与注意事项便于查阅与面试复盘。前言SpringBoot本质是Spring 自动配置 starters大量注解是对Spring原生注解的封装增强。很多注解容易混淆Component/Configuration/Bean、Value/ConfigurationProperties、Conditional系列。本文做结构化全景整理。区分说明 ✅ Spring原生注解Spring Core 自带 SpringBoot扩展注解Boot新增用于自动配置、条件装配一、应用启动类注解程序入口注解归属核心作用使用场景注意事项SpringBootApplication Boot启动类复合注解组合 3 个注解main 启动类等价Configuration EnableAutoConfiguration ComponentScanConfiguration✅ Spring标记当前类为配置类内部可写 Bean自定义 Bean 配置类配置类会被 CGLIB 代理方法调用会走容器单例EnableAutoConfiguration Boot开启 SpringBoot 自动装配根据 classpath 自动创建 Bean嵌入在 SpringBootApplication自动装配由 META-INF/spring.factoriesBoot2/ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsBoot3驱动ComponentScan✅ Spring组件扫描自动扫描Component/Service/Repository/Controller扫描指定包下 Bean默认扫描当前类所在包及子包可通过 basePackages 自定义扫描路径EnableConfigurationProperties Boot开启配置属性绑定把配置文件映射到 Properties 类自定义配置属性类需要配合ConfigurationProperties使用源码拆解SpringBootApplication是复合注解不是魔法注解只是简化开发。二、Bean注册与实例化注解对象交给Spring容器管理注解归属核心作用使用场景注意事项Component✅ Spring通用组件标记类交给Spring实例化通用工具类、普通业务组件元注解Service/Controller/Repository都是它的派生注解Service✅ Spring业务层组件语义化ComponentService业务逻辑层仅语义区分底层和Component无差别Repository✅ Spring数据访问层组件Mapper、DAO层额外开启异常转译数据库异常转为Spring DataAccessExceptionController✅ SpringMVC控制器返回视图传统Thymeleaf等页面控制器返回页面不直接返回JSON返回JSON建议用RestControllerRestController Boot复合注解Controller ResponseBodyREST接口控制器方法返回值直接序列化为JSON不跳转页面Bean✅ Spring在配置类中将方法返回对象注册为Bean第三方类无法加Component的类默认方法名beanName可用Bean(customName)指定名称默认单例Scope✅ Spring指定Bean作用域多实例场景singleton单例、prototype多例、request、session、applicationLazy✅ Spring延迟初始化Bean启动优化、解决循环依赖默认启动时创建Bean加Lazy第一次使用才实例化Primary✅ Spring多个同类型Bean冲突时优先选用此Bean同接口多实现类解决NoUniqueBeanDefinitionExceptionQualifier✅ Spring根据Bean名称精准注入同接口多个实现配合Autowired必须和Autowired一起使用指定beanName三、配置文件属性注入注解yml/properties读取注解归属核心作用使用场景注意事项Value(${key})✅ Spring读取单个配置项注入属性少量零散配置不支持复杂对象、不支持校验SpEL支持#{}ConfigurationProperties(prefix xxx) Boot批量绑定配置文件前缀映射到实体类一组相关配置数据库、线程池需要setter或者recordBoot3支持JSR303校验Validated✅ Spring开启属性校验配合JSR303注解配置类参数合法性校验需要引入validation依赖PropertySource✅ Spring加载外部properties配置文件自定义配置文件默认不加载yml只能加载propertiesBoot环境优先使用application.yml对比要点 少量配置用Value一组结构化配置优先ConfigurationProperties类型安全IDE有配置提示。四、依赖注入注解Bean之间装配注解归属核心作用使用场景注意事项Autowired✅ Spring按类型自动注入Bean字段、构造器、setter注入Spring原生默认requiredtrue找不到Bean直接报错Autowired(requiredfalse)允许nullInject✅ JSR规范JSR330标准注入注解等价Autowired规范兼容场景需要额外引入javax.inject包Resource✅ JSR规范JSR250注解默认按名称找不到再按类型名称优先注入Java原生规范不是Spring注解推荐最佳实践构造器注入Spring4.3之后如果类只有一个构造器Autowired可省略。五、Web层SpringMVC核心注解REST接口开发注解归属核心作用使用场景注意事项RequestMapping✅ SpringMVC通用请求映射可指定method、path类/方法级别路由派生注解Get/Post/Put/DeleteMappingGetMapping✅ SpringMVCGET请求映射查询接口仅接收GETPostMapping✅ SpringMVCPOST请求映射新增接口提交表单/JSONPutMapping✅ SpringMVCPUT请求映射全量更新接口幂等更新DeleteMapping✅ SpringMVCDELETE请求映射删除接口部分前端不支持DELETE可考虑POST代理RequestParam✅ SpringMVC获取URL查询参数 ?namexxx获取GET查询参数对应url?后面参数可设置required、defaultValuePathVariable✅ SpringMVC获取路径占位符 /user/{id}REST风格路径变量路径中的变量RequestBody✅ SpringMVC将请求体JSON反序列化为Java对象POST提交JSONPOST请求体GET无请求体RequestHeader✅ SpringMVC获取HTTP请求头读取token、客户端信息读取header字段RequestPart✅ SpringMVC文件上传 JSON混合提交multipart/form-data文件上传场景搭配MultipartFileResponseBody✅ SpringMVC返回对象序列化为JSON接口返回数据RestController内置该注解CrossOrigin✅ SpringMVC解决跨域CORS前后端分离跨域推荐网关统一配置不建议每个Controller加注解六、事务相关注解Spring声明式事务注解归属核心作用使用场景注意事项Transactional✅ Spring开启声明式事务Service层数据库操作底层AOP动态代理仅public方法生效内部方法调用事务失效EnableTransactionManagement✅ Spring开启事务管理Boot一般自动开启自定义场景使用SpringBoot引入jdbc/MyBatis starter默认自动开启无需手动写事务失效高频坑非public方法2. 同类内方法自调用3. 异常被try-catch捕获不抛出4. 数据库引擎不支持事务MyISAM。七、条件装配注解SpringBoot自动配置核心Boot这是SpringBoot最特色的一组注解满足条件才创建Bean自动装配底层就是大量Conditional注解。注解归属核心作用使用场景ConditionalOnClass Bootclasspath存在指定类才实例化Bean存在某个依赖才启用配置ConditionalOnMissingClass Bootclasspath不存在指定类才实例化Bean不存在依赖才启用ConditionalOnBean Boot容器存在指定Bean才实例化依赖容器中已有BeanConditionalOnMissingBean Boot容器没有该Bean才实例化用户自定义优先自定义Bean覆盖Boot默认Bean最常用ConditionalOnProperty Boot配置文件存在指定key且匹配value通过开关控制组件启用xxx.enabletrueConditionalOnResource Boot类路径存在指定资源文件才生效判断配置文件是否存在ConditionalOnWebApplication Boot当前是Web环境才生效Web相关自动配置ConditionalOnNotWebApplication Boot非Web环境生效纯后台任务、客户端程序重点ConditionalOnMissingBean是扩展SpringBoot默认行为最核心注解用户自己定义Bean会覆盖Boot默认Bean。八、AOP切面注解Spring AOP注解归属核心作用使用场景注意事项EnableAspectJAutoProxy✅ Spring开启AOP代理支持使用切面功能SpringBoot默认开启一般不用手动加可设置proxyTargetClasstrue强制CGLIBAspect✅ AspectJ标记当前类为切面类日志、鉴权、埋点切面类上标记配合Before/After等通知Pointcut✅ AspectJ定义切点表达式匹配拦截方法复用切点表达式execution表达式常用Before✅ AspectJ前置通知方法执行前执行参数校验、日志前置AfterReturning✅ AspectJ正常返回后执行记录返回结果异常时不会执行AfterThrowing✅ AspectJ抛出异常时执行异常告警、错误日志After✅ AspectJ最终通知无论正常/异常都执行资源释放Around✅ AspectJ环绕通知包裹目标方法可控制执行性能耗时统计、全链路鉴权功能最强需要手动调用proceed()九、测试相关注解SpringBoot Test注解归属核心作用使用场景SpringBootTest Boot加载完整Spring上下文做集成测试完整服务集成测试加载所有BeanWebMvcTest Boot只加载Web层上下文mock ControllerController单元测试轻量MockBean BootMock一个Bean替换容器内真实BeanMock Service依赖隔离测试AutoConfigureMockMvc Boot自动注入MockMvc模拟http请求接口单元测试十、高频注解对比汇总表面试高频对比项注解1注解2核心差异Bean注册ComponentBeanComponent标记类Bean写在配置类方法注册第三方类配置注入ValueConfigurationPropertiesValue单值ConfigurationProperties批量绑定前缀支持对象、校验、IDE提示ControllerControllerRestControllerController返回视图RestController自带ResponseBody直接返回JSON注入方式AutowiredResourceAutowired按类型Resource默认按名称JSR规范条件装配ConditionalOnBeanConditionalOnMissingBean存在Bean才创建 / 没有Bean才创建自定义覆盖默认十一、核心注解使用避坑总结SpringBootApplication只能放在启动类扫描范围以当前包为根业务配置类不要加这个注解。Transactional只对public方法生效同类内部调用事务失效。ConfigurationProperties必须有setterBoot2Boot3使用record可以不用setter。ConditionalOnMissingBean优先级用户自定义Bean SpringBoot自动配置Bean这就是我们覆盖默认组件的原理。AOP是动态代理只能拦截Spring容器中的Bean的方法静态方法、非Bean类方法无法被AOP拦截。Lazy延迟加载只对容器Bean生效解决启动耗时和循环依赖场景。十二、一句话总结SpringBoot注解体系分为两层Spring原生注解Bean管理、AOP、事务、MVC SpringBoot扩展注解自动装配、条件注解、配置绑定。 SpringBoot的核心魔力来自**EnableAutoConfiguration Conditional系列注解**实现按需装配业务开发更多使用Bean注册、Web、属性注入注解完成业务编码。十三、其他分类记忆一句话注解 贴在代码上的“标签”本身不执行逻辑只是给编译器/框架“看”的说明。你贴了标签框架就会自动帮你干活。按“谁在用这个标签”分四大类就很好记了1. Lombok 的注解 —— 给编译器看省得写样板代码Data public class BookingPageReqVO extends PageParam {Data一个顶五个自动生成 getter、setter、toString、equals、hashCode。你在这个类里找不到任何一个 getter/setter 方法但 Controller 里却能调getTitle()——就是它干的。记忆法Lombok 全家桶都是“偷懒类”——Data、Getter、Setter、Builder、NoArgsConstructor。2. Swagger 的注解 —— 给文档/前端看API 说明Schema(description 会议主题) private String title;Schema就是给接口文档写的字段说明。前端打开 Swagger 页面看到的“会议主题”四个字就来自这里。记忆法凡是io.swagger包下的都是“写文档的”。3. Spring 的注解 —— 给框架看最庞大的家族这个文件里只出现了一个 Spring 相关的DateTimeFormat(pattern FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] startTime;它的作用前端传2026-10-20 09:00:00这种字符串时Spring 自动转成LocalDateTime对象。不写的话会直接报错字符串转不了日期。Spring 注解虽多但按用途分就四小类用途代表注解一句话声明组件ComponentServiceControllerRestController“这个类归 Spring 管”依赖注入ResourceAutowired“帮我把这个对象拿过来”处理请求GetMappingPostMappingRequestParam“这个方法接 HTTP 请求”配置参数ValueConfigurationProperties“帮我读配置文件”4. 项目自定义注解 —— 给芋道框架看以后你会碰到TenantIgnore忽略租户隔离、PreAuthorize权限校验这类。它们原理和上面完全一样只是框架作者自己定义的标签。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑