引言
Spring Boot的注解体系是其“约定优于配置”理念的核心载体。但面对海量注解,开发者常陷入两难:记不住、用不对、分不清。本文系统梳理Spring Boot开发中高频使用的85个注解,按应用场景分类,本文配合代码示例和避坑指南,助你成为注解运用高手!
一、核心启动注解(启动类必备)
1. @SpringBootApplication
作用:启动类标志注解(三合一复合注解)
等效拆分:
@SpringBootConfiguration // 标记为配置类
@EnableAutoConfiguration // 启用自动配置
@ComponentScan // 开启组件扫描
隐藏技巧:通过scanBasePackages属性指定非默认扫描路径:
@SpringBootApplication(scanBasePackages = "com.your.package")
二、Bean定义与管理(IOC容器核心)
2. 组件声明四剑客
@Component:通用组件标记(如工具类)@Service:业务逻辑层组件@Repository:数据访问层组件(会包装数据库异常)@Controller/@RestController:Web层控制器
3. @Bean
场景:注册第三方库组件或复杂对象
@Configuration
public class AppConfig {
@Bean(name = "myDataSource", initMethod = "init")
@Lazy // 延迟初始化
public DataSource dataSource() {
return new HikariDataSource();
}
}
4. 条件化注册注解
@ConditionalOnClass:类路径存在指定类时生效@ConditionalOnProperty:根据配置文件动态注册
@Bean
@ConditionalOnProperty(name = "cache.enabled", havingValue = "true")
public CacheManager cacheManager() { /*...*/ }
三、Web开发(RESTful接口与MVC)
5. 请求映射注解
@GetMapping("/users"):等价于@RequestMapping(method = RequestMethod.GET)@PostMapping、@PutMapping、**@DeleteMapping**同理
高阶用法:
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public User getUser(@PathVariable Long id) { /*...*/ }
6. 参数处理注解
@PathVariable:获取URL路径参数@RequestParam:获取查询参数(可设置默认值)@RequestBody:接收JSON请求体@RequestHeader:获取请求头信息
7. 响应处理注解
@ResponseStatus(HttpStatus.CREATED):自定义HTTP状态码@CrossOrigin:解决跨域问题(生产环境建议网关统一处理)
四、数据访问(JPA/MyBatis整合)
8. JPA核心注解
@Entity:标记JPA实体类@Table(name = "user"):指定数据库表名@Id、@GeneratedValue:主键生成策略
@Entity
@Table(name = "tbl_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
9. 事务控制
@Transactional:声明式事务管理
关键属性:
@Transactional(
isolation = Isolation.DEFAULT,
propagation = Propagation.REQUIRED,
rollbackFor = Exception.class
)
五、配置与属性绑定(YAML/Properties解析)
10. @Value:注入简单属性
@Value("${server.port:8080}") // 带默认值
private Integer port;
11. @ConfigurationProperties:批量绑定配置
@ConfigurationProperties(prefix = "app")
@Data // Lombok注解
public class AppConfig {
private String name;
private List<String> ipWhitelist;
}
六、高级特性(AOP/调度/缓存)
12. AOP注解
@Aspect:定义切面类@Around、@Before、@After:定义通知类型
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 记录方法执行时间...
}
}
13. 定时任务
@Scheduled:定义执行周期
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
public void clearTempFiles() { /*...*/ }
14. 缓存控制
@Cacheable:缓存方法结果@CacheEvict:清除缓存
@Cacheable(value = "users", key = "#id")
public User getUser(Long id) { /*...*/ }
七、测试相关(单元/集成测试)
15. @SpringBootTest:启动完整Spring上下文测试
16. @MockBean:注入Mock对象(如模拟数据库调用)
@SpringBootTest
class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Test
void testFindUser() {
Mockito.when(userRepository.findById(1L)).thenReturn(new User());
// 测试逻辑...
}
}
八、实用冷门注解(高手必备)
17. @Order:
控制Bean加载顺序
18. @Primary:
解决多个同类型Bean冲突
19. @Profile:
环境差异化配置(如dev/test/prod)
@Bean
@Profile("dev") // 仅在开发环境生效
public DataSource devDataSource() { /*...*/ }
20. @Retryable:方法失败自动重试(需引入spring-retry)
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000))
public void callUnstableApi() { /*...*/ }
结语
Spring Boot注解体系的精髓在于用声明代替编码。建议开发者:
- 掌握注解的组合使用(如
@Validated+@RequestBody) - 理解注解的底层原理(如
@Transactional基于AOP实现) - 避免注解滥用(如过度使用
@Autowired导致耦合)