SpringBoot的核心优势之一是注解驱动开发,通过注解替代传统XML配置,大幅简化开发流程。以下是Web开发中SpringBoot最常用的注解,按「核心/Web/配置/依赖注入/事务/数据访问/AOP/校验/其他」维度分类详解,包含作用、核心属性、使用示例、注意事项,覆盖90%以上的开发场景。
一、核心启动注解(必用)
1. @SpringBootApplication
核心作用:SpringBoot应用的入口注解,用于标记主类,整合了3个核心注解的功能,是启动类的标配。
底层组成:
@SpringBootConfiguration:替代@Configuration,标记当前类为配置类;@EnableAutoConfiguration:核心!开启自动配置(SpringBoot根据依赖自动配置Bean,如引入spring-boot-starter-web则自动配置Tomcat、SpringMVC);@ComponentScan:扫描当前包及其子包下的@Component、@Service、@Controller等注解,将类注册为Bean。
使用示例:
1 |
|
注意:
- 启动类需放在根包下(如
com.demo),否则@ComponentScan无法扫描子包的Bean; - 如需自定义扫描包,可加
@ComponentScan(basePackages = "com.xxx")。
二、Web开发核心注解
1. @Controller & @RestController
| 注解 | 作用 | 区别 |
|---|---|---|
| @Controller | 标记类为SpringMVC的控制器,处理HTTP请求,需配合@ResponseBody返回JSON |
默认返回视图(如jsp/html) |
| @RestController | 组合注解(@Controller + @ResponseBody),直接返回JSON/XML等数据 |
无需额外加@ResponseBody |
使用示例:
1 | // 传统控制器(返回视图) |
2. @RequestMapping(及变体)
核心作用:映射HTTP请求到控制器方法,支持指定URL、请求方法、请求头、参数等。
常用变体(简化版):
@GetMapping:仅处理GET请求(method = RequestMethod.GET);@PostMapping:仅处理POST请求;@PutMapping/@DeleteMapping/@PatchMapping:对应PUT/DELETE/PATCH请求。
核心属性:
value/path:请求URL(如/user);method:请求方法(GET/POST等);params:限定请求参数(如params = "id",仅含id参数时匹配);headers:限定请求头(如headers = "Content-Type=application/json");produces:指定响应类型(如produces = "application/json;charset=UTF-8")。
使用示例:
1 |
|
3. 请求参数绑定注解
| 注解 | 作用 | 示例 |
|---|---|---|
| @RequestParam | 绑定URL请求参数(如/user?id=1)到方法参数 |
@RequestParam Long id |
| @PathVariable | 绑定URL路径变量(如/user/1)到方法参数 |
@PathVariable Long id |
| @RequestBody | 绑定HTTP请求体(JSON/XML)到Java对象(POST/PUT请求常用) | @RequestBody User user |
| @RequestHeader | 绑定请求头参数到方法参数 | @RequestHeader String token |
| @CookieValue | 绑定Cookie值到方法参数 | @CookieValue String JSESSIONID |
关键注意:
@RequestParam可加required = false(非必传)、defaultValue = "0"(默认值);@RequestBody仅能绑定一个请求体,且请求头需为Content-Type: application/json;@PathVariable需保证URL中的变量名与参数名一致,不一致则加@PathVariable("uid") Long id。
4. @CrossOrigin
作用:解决跨域问题(前后端分离场景必备),标记在类/方法上,允许指定源的跨域请求。
核心属性:
origins:允许的跨域源(如"http://localhost:8080","*"表示所有);maxAge:预检请求(OPTIONS)的缓存时间(秒);allowedHeaders:允许的请求头;methods:允许的请求方法。
示例:
1 | // 类级别:所有方法允许跨域 |
三、配置相关注解
1. @Configuration & @Bean
@Configuration:标记类为配置类,替代传统XML配置文件(如applicationContext.xml)。
@Bean:标记方法,返回值将注册为Spring容器中的Bean,默认名称为方法名,可通过name/value指定。
使用示例:
1 | // 配置类 |
注意:@Bean方法默认是单例的,如需多例,配合@Scope("prototype")。
2. @Value
作用:读取配置文件(如application.yml/application.properties)中的值,注入到字段/方法参数。
语法:
- 直接取值:
@Value("${app.name}"); - 默认值:
@Value("${app.port:8080}")(配置不存在时用8080); - SpEL表达式:
@Value("#{10+20}")(计算值30)。
示例:
1 |
|
3. @ConfigurationProperties
作用:批量绑定配置文件中的属性到Java类(比@Value更适合复杂配置),常用前缀统一管理。
使用步骤:
- 加注解指定前缀;
- 类需有
setter方法(或用Lombok的@Data); - 加
@Component(或在配置类加@EnableConfigurationProperties)注册为Bean。
示例:
1 | # application.yml |
1 | // Lombok,自动生成setter/getter |
4. @PropertySource
作用:加载自定义配置文件(非默认的application.yml/properties),如config/db.properties。
示例:
1 |
|
四、依赖注入注解
1. @Autowired
核心作用:自动注入Spring容器中的Bean,按类型匹配(默认必须存在,否则报错)。
核心属性:
required = false:允许Bean不存在,注入null;- 配合
@Qualifier:按名称匹配(解决同类型多Bean问题)。
示例:
1 | // 接口 |
2. @Resource
作用:JDK自带的注入注解(非Spring),默认按名称匹配,无匹配则按类型。
区别于@Autowired:
| 维度 | @Autowired | @Resource |
|---|---|---|
| 来源 | Spring注解 | JDK javax.annotation |
| 匹配规则 | 默认按类型 | 默认按名称(name属性) |
| 依赖配置 | 需配合@Qualifier指定名称 | 直接用name属性指定名称 |
示例:
1 |
|
3. @Primary
作用:标记Bean为「优先候选」,当同类型多Bean时,@Autowired会优先注入标记的Bean。
4. @Scope
作用:指定Bean的作用域,默认singleton(单例)。
常用值:
singleton:单例(默认),容器中仅一个实例;prototype:多例,每次获取创建新实例;request:每个HTTP请求创建一个实例;session:每个HTTP会话创建一个实例。
示例:
1 |
|
五、事务管理注解
@Transactional
核心作用:声明式事务管理,标记在类/方法上,Spring自动管理事务(提交/回滚)。
核心属性:
| 属性 | 作用 | 常用值 |
|---|---|---|
| propagation | 事务传播行为(嵌套事务规则) | REQUIRED(默认)、REQUIRES_NEW等 |
| isolation | 事务隔离级别 | READ_COMMITTED(默认)、REPEATABLE_READ等 |
| rollbackFor | 指定触发回滚的异常类型(默认仅运行时异常回滚) | Exception.class、RuntimeException.class |
| noRollbackFor | 指定不回滚的异常类型 | IllegalArgumentException.class |
| timeout | 事务超时时间(秒),超时则回滚 | 30(默认-1,无超时) |
| readOnly | 是否只读事务(优化性能,仅查询时用) | true/false(默认false) |
使用示例:
1 |
|
注意:
- 事务仅对public方法生效(Spring AOP限制);
- 自调用(如方法A调用本类方法B)事务不生效(需通过Spring代理调用);
- 需确保数据源配置正确,且SpringBoot已引入
spring-boot-starter-jdbc/spring-boot-starter-data-jpa。
六、数据访问注解
1. MyBatis相关
@Mapper:标记接口为MyBatis的Mapper接口,SpringBoot自动扫描并创建代理对象;@MapperScan:批量扫描Mapper接口(替代每个接口加@Mapper),通常加在启动类。
示例:
1 | // 方式1:单个Mapper加@Mapper |
2. Spring Data JPA相关
@Repository:标记类为数据访问层(DAO),Spring自动捕获持久化异常并转换为Spring统一的DataAccessException;@Entity:标记类为JPA实体类,映射数据库表;@Table:指定实体类对应的数据库表名(默认类名小写);@Id:标记字段为主键;@GeneratedValue:指定主键生成策略(如AUTO、IDENTITY)。
示例:
1 |
|
七、AOP相关注解
AOP(面向切面编程)用于日志、权限、性能监控等横切逻辑,核心注解如下:
@Aspect:标记类为切面类;@Pointcut:定义切入点(需指定表达式,如匹配某个包下的所有方法);- 通知注解:
@Before:切入点方法执行前执行;@After:切入点方法执行后执行(无论是否异常);@AfterReturning:切入点方法正常返回后执行;@AfterThrowing:切入点方法抛出异常后执行;@Around:环绕通知(最强大,可控制切入点方法的执行)。
示例:
1 | // 切面类 |
八、参数校验注解
基于JSR303/JSR380,配合@Valid/@Validated实现请求参数校验,常用注解:
| 注解 | 作用 | 示例 |
|---|---|---|
| @NotNull | 字段不能为null | @NotNull(message = "ID不能为空") |
| @NotBlank | 字符串不能为null/空串/全空格 | @NotBlank(message = "姓名不能为空") |
| @NotEmpty | 集合/数组不能为null/空 | @NotEmpty(message = "列表不能为空") |
| @Size | 字符串/集合长度范围 | @Size(min = 6, max = 20, message = "密码长度6-20位") |
| 字符串需符合邮箱格式 | @Email(message = "邮箱格式错误") |
|
| @Pattern | 字符串匹配正则表达式 | @Pattern(regexp = "^\\d{11}$", message = "手机号格式错误") |
使用示例:
1 | // 实体类 |
注意:
@Valid是JSR303注解,@Validated是Spring扩展(支持分组校验);- 需引入依赖
spring-boot-starter-validation(SpringBoot 2.3+需手动引入)。
九、其他高频注解
| 注解 | 作用 |
|---|---|
| @Component | 通用Bean注解,标记类为Spring组件(@Service/@Repository/@Controller都是其派生) |
| @Service | 标记类为业务层(Service)Bean,语义更清晰 |
| @PostConstruct | 标记方法在Bean初始化后执行(构造方法之后,init-method之前) |
| @PreDestroy | 标记方法在Bean销毁前执行 |
| @Profile | 按环境加载Bean(如dev/test/prod) |
| @Async | 标记方法为异步执行(需配合@EnableAsync在启动类) |
| @Scheduled | 标记方法为定时任务(需配合@EnableScheduling在启动类) |
示例(定时任务):
1 |
|
总结
SpringBoot注解的核心逻辑是「约定大于配置」,以上注解覆盖了启动配置、Web开发、依赖注入、事务、数据访问、AOP、校验、定时任务等核心场景。实际开发中:
- 启动类必加
@SpringBootApplication; - Web层用
@RestController + @GetMapping/@PostMapping; - 配置用
@Configuration + @Bean或@ConfigurationProperties; - 依赖注入优先用
@Autowired + @Qualifier或@Resource; - 事务用
@Transactional; - 通用横切逻辑用AOP注解;
- 参数校验用
@Valid + JSR303注解。
掌握这些注解,就能高效完成SpringBoot Web开发的绝大部分场景。