Spring/Boot/Cloud 核心注解速查手册
本文档旨在系统性地介绍 Spring 全家桶中最核心、最常用的注解,并按照框架进行分类。
一、 Spring Framework 核心注解
1.1 IoC 与 DI (控制反转/依赖注入)
@Configuration: 声明当前类是一个配置类,相当于一个 Spring 的 XML 配置文件。@ComponentScan: 告诉 Spring 去扫描指定包下的组件,并自动注册为 Bean。@Bean: 用在@Configuration类的方法上,将方法的返回值注册为一个由 Spring 容器管理的 Bean。@Component: 最通用的组件注解,标记一个类为 Spring 组件。@Service: 标记在业务逻辑层 (Service Layer)。@Repository: 标记在数据访问层 (DAO Layer)。@Controller: 标记在表现层 (Web Layer),用于处理 HTTP 请求。@Autowired: Spring 的注解,用于按类型自动注入依赖。@Qualifier: 当同一类型有多个 Bean 时,配合@Autowired按名称指定要注入的 Bean。@Resource: JSR-250 标准的注解,默认按名称注入,也可以按类型注入。
1.2 AOP (面向切面编程)
@EnableAspectJAutoProxy: 启用 Spring 对 AspectJ 风格 AOP 的支持。@Aspect: 声明一个类为切面。@Pointcut: 定义一个切入点,即一组需要被拦截的方法的集合。@Before,@After,@AfterReturning,@AfterThrowing,@Around: 定义不同类型的通知(Advice)。
1.3 Spring MVC
@RestController:@Controller和@ResponseBody的组合,常用于编写 RESTful API,返回 JSON/XML 数据。@RequestMapping: 将 HTTP 请求映射到 Controller 的处理方法上。@GetMapping,@PostMapping,@PutMapping,@DeleteMapping:@RequestMapping的特定方法变体。@RequestParam: 获取 URL 中的查询参数 (?name=value)。@PathVariable: 获取 URL 路径中的模板变量 (/users/{id})。@RequestBody: 将 HTTP 请求的 body 内容(通常是 JSON)绑定到方法的参数上。@ResponseBody: 将方法的返回值直接作为 HTTP 响应的 body 内容返回。
1.4 事务管理
@EnableTransactionManagement: 启用 Spring 的声明式事务管理功能。@Transactional: 标记一个方法或类需要进行事务管理。
1.5 Bean 生命周期 (JSR-250)
@PostConstruct: 标记一个方法,在 Bean 的依赖注入完成后执行,用于自定义初始化逻辑。@PreDestroy: 标记一个方法,在容器销毁 Bean 之前执行,用于释放资源。
1.6 @Autowired vs @Resource (详细对比)
@Autowired 和 @Resource 都是 Spring 中用于依赖注入的注解,但它们在来源、默认装配方式和使用细节上存在显著差异。
一句话总结核心区别:
@Autowired是 Spring 提供的注解,默认按类型 (byType) 装配。@Resource是 Java 规范 (JSR-250) 提供的注解,默认按名称 (byName) 装配。
详细注入流程对比:
-
@Autowired(Spring 的“亲儿子”)- 按类型查找:首先在 Spring 容器中寻找与注入字段类型相匹配的 Bean。
- 如果只找到一个:直接注入成功。
- 如果找到多个:会进一步根据字段名或参数名作为 Bean 的 ID/名称来查找,试图在多个候选项中找到一个匹配的。
- 如果还找不到或不唯一:就会抛出异常。此时可以通过
@Qualifier("beanName")注解来明确指定要注入的 Bean 的名称。 - 如果找不到:默认情况下会抛出异常。可以通过设置
@Autowired(required = false)来允许注入的 Bean 为null。
-
@Resource(Java 的“标准兵”)- 按名称查找:首先尝试根据字段名或参数名去容器中寻找同名的 Bean。
- 如果按名称找不到:它会“退一步”,再按类型去寻找匹配的 Bean。
- 如果按类型找到多个:就会抛出异常(因为它不知道该选哪个)。
name属性:@Resource(name = "beanName")可以用来强制指定要注入的 Bean 的名称。此时,它只会按名称查找,如果找不到就失败,不会再按类型查找。
对比表格
| 特性 | @Autowired |
@Resource |
|---|---|---|
| 来源 | Spring 框架 | Java 规范 (JSR-250) |
| 默认装配模式 | 按类型 (byType) | 按名称 (byName) |
| 后备策略 | 按类型找到多个时,会再按名称匹配 | 按名称找不到时,会再按类型匹配 |
| 指定名称的方式 | @Qualifier("beanName") (与 @Autowired 配合) |
name 属性 (@Resource(name = "beanName")) |
| 兼容性 | 只能在 Spring 环境下使用 | 理论上可用于其他支持 JSR-250 规范的框架(如 Java EE) |
如何选择?
- 优先使用
@Autowired:在 Spring 项目中,推荐优先使用@Autowired,它更符合 Spring 的设计理念和面向接口编程的习惯。当存在多个同类型 Bean 时,可配合@Qualifier进行精确控制。 @Resource的使用场景:如果希望代码与 Spring 框架的耦合度降低,或项目可能在非 Spring 环境下运行,@Resource是一个不错的选择。此外,当明确需要通过 Bean 的名称进行注入时,@Resource的name属性语义更直接。
二、 Spring Boot 核心注解
@SpringBootApplication: Spring Boot 应用的入口注解,是@SpringBootConfiguration(即@Configuration),@EnableAutoConfiguration,@ComponentScan三个注解的组合。@EnableAutoConfiguration: 启用 Spring Boot 的自动配置机制,根据 classpath 中的 jar 包和定义的 Bean,尝试猜测并配置你可能需要的 Bean。@ConditionalOn...: 一系列条件注解,是实现自动配置的基石。只有当满足特定条件时,被标记的配置或 Bean 才会生效。例如:@ConditionalOnClass: 当 classpath 中存在指定的类时。@ConditionalOnMissingBean: 当容器中不存在指定的 Bean 时。
@ConfigurationProperties: 将配置文件 (application.yml) 中的一组相关属性,以类型安全的方式,批量绑定到一个 Java POJO 类上。@EnableConfigurationProperties: 用于在配置类中激活并注册被@ConfigurationProperties注解的 Bean。@ControllerAdvice/@RestControllerAdvice: 标记一个类为全局异常处理器。@RestControllerAdvice是@ControllerAdvice和@ResponseBody的组合。@ExceptionHandler: 在@ControllerAdvice类中,标记一个方法用于捕获并处理特定类型的异常。
三、 Spring Cloud 核心注解
@EnableDiscoveryClient: 启用服务注册与发现功能。任何希望被注册中心(如 Nacos, Eureka)管理的服务都需要这个注解。@RefreshScope: (来自 Spring Cloud Context) 标记一个 Bean,使其配置可以在运行时动态刷新。常与配置中心(如 Nacos Config)配合使用,用于在不重启应用的情况下,让@Value或@ConfigurationProperties注解的属性获取到最新的配置值。@EnableFeignClients: (OpenFeign) 激活 OpenFeign 功能,并扫描指定包(或当前包)下所有被@FeignClient注解的接口,为它们创建动态代理实现。@FeignClient: (OpenFeign) 标记在一个接口上,声明它是一个用于远程服务调用的客户端。value或name属性用于指定要调用的目标服务的名称(在注册中心中的spring.application.name)。