外观
你用过哪些 Spring 的注解
⭐ 题目日期:
小红书 - 2024/11/11
📝 题解:
在Spring框架中,注解(Annotation)是简化开发的核心工具之一。以下是我常用的一些Spring注解及其主要用途,按模块分类整理:
1. 核心注解(依赖注入与Bean管理)
- @Component
通用注解,标记类为Spring管理的Bean(自动扫描)。 - @Service
标识服务层组件,是@Component
的特化。 - @Repository
标识数据访问层(DAO),继承自@Component
,支持异常转换。 - @Controller / @RestController
标识控制层(Web请求处理),@RestController
是@Controller
+@ResponseBody
的组合。 - @Autowired
自动注入依赖(按类型匹配),常用于构造函数、字段或方法。 - @Qualifier
按名称指定注入的Bean,解决同一类型多个Bean的歧义。 - @Primary
优先注入标记的Bean(当存在多个同类型Bean时)。 - @Scope
定义Bean的作用域(如singleton
、prototype
)。 - @Lazy
延迟初始化Bean(首次使用时创建)。 - @Value
注入外部配置值(如@Value("${property.key}")
)。
2. Spring MVC(Web开发)
- @RequestMapping
映射HTTP请求到控制器方法,支持路径、方法类型(GET/POST等)。 - @GetMapping / @PostMapping
简化的请求映射(等价于@RequestMapping(method=RequestMethod.GET/POST)
)。 - @RequestParam
绑定HTTP请求参数到方法参数。 - @PathVariable
绑定URL路径变量到方法参数。 - @RequestBody
将HTTP请求体反序列化为Java对象(如JSON/XML)。 - @ResponseBody
将方法返回值序列化为HTTP响应体。 - @ModelAttribute
绑定请求参数到模型对象,或在方法返回时添加到模型。 - @ExceptionHandler
定义控制器内的异常处理方法。
3. 配置与条件化
- @Configuration
标记类为配置类(替代XML配置)。 - @Bean
在配置类中定义Bean(方法级别)。 - @Import
导入其他配置类。 - @PropertySource
加载外部配置文件(如application.properties
)。 - @Profile
根据环境激活Bean(如@Profile("dev")
)。 - @Conditional
条件化注册Bean(需实现Condition
接口)。 - @EnableAutoConfiguration
(Spring Boot)启用自动配置。 - @SpringBootApplication
(Spring Boot)组合注解,包含@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。
4. 数据访问与事务
- @Transactional
声明事务管理(可定义传播行为、隔离级别等)。 - @Entity / @Table
(JPA)标记实体类与数据库表映射。 - @Id / @GeneratedValue
(JPA)定义主键和生成策略。 - @Query
(Spring Data JPA)自定义JPQL或原生SQL查询。
5. AOP(面向切面编程)
- @Aspect
定义切面类。 - @Pointcut
定义切点表达式(指定拦截目标)。 - @Before / @After / @Around
定义通知类型(前置/后置/环绕增强)。
6. 测试
- @SpringBootTest
(Spring Boot)标记集成测试类,加载完整应用上下文。 - @MockBean / @SpyBean
注入Mock或Spy对象到Spring上下文。 - @Test
(JUnit)标记测试方法。
7. 其他常用注解
- @Scheduled
定义定时任务(需配合@EnableScheduling
)。 - @Async
标记异步执行方法(需配合@EnableAsync
)。 - @Cacheable / @CacheEvict
声明方法结果缓存或清除缓存。 - @Valid / @Validated
启用方法参数校验(结合JSR-303校验注解如@NotNull
)。
示例代码片段
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
User savedUser = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
}
@Service
public class UserService {
@Transactional(readOnly = true)
public User findById(Long id) {
// 查询逻辑
}
}
总结
Spring注解极大地简化了配置和开发,通过声明式编程提升效率。熟悉常用注解可快速构建模块化、可维护的应用程序。实际开发中,结合Spring Boot的自动配置(如@SpringBootApplication
)和第三方库(如Lombok的@Data
),能进一步减少样板代码。