Spring 中常用注解详解

目录

[一、组件声明类注解(告诉 Spring:这是个 Bean)](#一、组件声明类注解(告诉 Spring:这是个 Bean))

[1. @Component](#1. @Component)

[2. @Service](#2. @Service)

[3. @Repository](#3. @Repository)

[4. @Controller / @RestController](#4. @Controller / @RestController)

二、依赖注入相关注解(对象怎么进来)

[1. @Autowired](#1. @Autowired)

[2. @Qualifier](#2. @Qualifier)

[3. @Resource](#3. @Resource)

三、配置相关注解(容器怎么启动)

[1. @Configuration](#1. @Configuration)

[2. Bean](#2. Bean)

[3. @ComponentScan](#3. @ComponentScan)

[四、Web 请求相关注解(Spring MVC)](#四、Web 请求相关注解(Spring MVC))

[1. @RequestMapping](#1. @RequestMapping)

[2. @GetMapping / @PostMapping 等](#2. @GetMapping / @PostMapping 等)

[3. @PathVariable](#3. @PathVariable)

[4. @RequestParam](#4. @RequestParam)

[5. @RequestBody](#5. @RequestBody)

五、事务与切面相关注解

[1. @Transactional](#1. @Transactional)

[2. @Aspect](#2. @Aspect)

[3. @Before / @After / @Around](#3. @Before / @After / @Around)

六、生命周期与扩展相关注解

[1. @PostConstruct](#1. @PostConstruct)

[2. @PreDestroy](#2. @PreDestroy)

七、校验与条件注解

[1. @Valid / @Validated](#1. @Valid / @Validated)

[2. @Conditional](#2. @Conditional)

八、总结


在 Spring 开发中,我们几乎每天都在和注解打交道。

@Component、@Autowired、@RequestMapping、@Transactional......

如果只是"见过、会用",很容易越学越杂。

实际上,Spring 中的注解是高度体系化的。

只要按"它解决什么问题"来分类,逻辑会非常清晰。

一、组件声明类注解(告诉 Spring:这是个 Bean)

这类注解的核心作用只有一个:把类交给 Spring 容器管理

1. @Component

最基础的组件注解。

java 复制代码
@Component

public class UserService {

}

表示这是一个普通的 Spring Bean。

2. @Service

java 复制代码
@Service
public class UserService {
}
  • 本质是 @Component
  • 语义上表示业务层组件

推荐:业务类使用 @Service,提高可读性

3. @Repository

java 复制代码
@Repository
public class UserDao {
}
  • 本质是 @Component
  • 用于持久层
  • 具备异常转换能力

DAO 层推荐使用

4. @Controller / @RestController

java 复制代码
@Controller
public class UserController {
}
java 复制代码
@RestController
public class UserController {
}
  • @RestController = @Controller + @ResponseBody
  • 用于 Web 层

前后端分离项目中几乎必用 @RestController

二、依赖注入相关注解(对象怎么进来)

这类注解解决的是:Bean 和 Bean 之间如何建立关系

1. @Autowired

java 复制代码
@Autowired
private UserService userService;
  • 按类型注入(byType)
  • Spring 提供

最常用的依赖注入方式

2. @Qualifier

java 复制代码
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
  • 解决多个实现类冲突
  • 按名称精确指定

3. @Resource

java 复制代码
@Resource
private UserService userService;
  • JSR 标准注解
  • 默认按名称注入

Spring 项目中更推荐 @Autowired

三、配置相关注解(容器怎么启动)

1. @Configuration

java 复制代码
@Configuration
public class AppConfig {
}
  • 声明配置类
  • 等价于 XML 配置文件

2. Bean

java 复制代码
@Bean
public UserService userService() {
    return new UserService();
}
  • 方法级别
  • 用于将第三方对象交给 Spring 管理

非常重要的注解

3. @ComponentScan

java 复制代码
@ComponentScan("com.example")
  • 指定组件扫描路径
  • 决定哪些类会被加载成 Bean

四、Web 请求相关注解(Spring MVC)

1. @RequestMapping

java 复制代码
@RequestMapping("/users")
  • 通用请求映射
  • 支持 GET / POST / PUT / DELETE

2. @GetMapping / @PostMapping 等

java 复制代码
@GetMapping("/users")
  • @RequestMapping 的语义化简写
  • 更推荐使用

3. @PathVariable

java 复制代码
@GetMapping("/users/{id}")
public User get(@PathVariable Long id) {
}
  • 接收路径参数

4. @RequestParam

java 复制代码
@GetMapping("/users")
public List<User> list(@RequestParam String name) {
}
  • 接收请求参数

5. @RequestBody

java 复制代码
@PostMapping("/users")
public void save(@RequestBody User user) {
}
  • 接收请求体(JSON)
  • 前后端分离必用

五、事务与切面相关注解

1. @Transactional

java 复制代码
@Transactional
public void save() {
}
  • 声明式事务
  • 基于 AOP 实现

Spring AOP 最典型的应用场景

2. @Aspect

java 复制代码
@Aspect
@Component
public class LogAspect {
}
  • 声明切面类

3. @Before / @After / @Around

java 复制代码
@Before("execution(* com.example.*.*(..))")
  • 定义通知类型
  • 控制增强时机

六、生命周期与扩展相关注解

1. @PostConstruct

java 复制代码
@PostConstruct
public void init() {
}
  • Bean 初始化后执行
  • JSR 标准注解

2. @PreDestroy

java 复制代码
@PreDestroy
public void destroy() {
}
  • Bean 销毁前执行

七、校验与条件注解

1. @Valid / @Validated

java 复制代码
public void save(@Valid User user) {
}
  • 参数校验
  • 常用于 Controller 层

2. @Conditional

java 复制代码
@Conditional(MyCondition.class)
  • 条件装配
  • Spring Boot 自动配置的基础

八、总结

Spring 中的注解,本质上都是在告诉容器:哪些类要管、什么时候管、怎么管。

相关推荐
草莓熊Lotso2 小时前
Qt 控件美化与交互进阶:透明度、光标、字体与 QSS 实战
android·java·开发语言·c++·人工智能·git·qt
zbguolei2 小时前
Springboot上传文件与物理删除
java·spring boot·后端
jay神2 小时前
基于SpringBoot的校园社团活动智能匹配与推荐系统
java·前端·spring boot·后端·毕业设计
可以吧可以吧2 小时前
idea全家桶【常见报错处理】当出现 “We could not validate your license ... “ 提示时
java·ide·intellij-idea
装不满的克莱因瓶2 小时前
IDEA rebuild project 到底有什么作用?
java·ide·intellij-idea
Java程序员威哥2 小时前
Arthas+IDEA实战:Java线上问题排查完整流程(Spring Boot项目落地)
java·开发语言·spring boot·python·c#·intellij-idea
Eugene__Chen3 小时前
Java的SPI机制(曼波版)
java·开发语言·python
程序猿20233 小时前
JVM与JAVA
java·jvm·python
Mr__Miss3 小时前
JMM中的工作内存实际存在吗?
java·前端·spring