邵阳市网站建设_网站建设公司_Java_seo优化
2026/1/21 16:18:07 网站建设 项目流程

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 的“亲儿子”)

    1. 按类型查找:首先在 Spring 容器中寻找与注入字段类型相匹配的 Bean。
    2. 如果只找到一个:直接注入成功。
    3. 如果找到多个:会进一步根据字段名或参数名作为 Bean 的 ID/名称来查找,试图在多个候选项中找到一个匹配的。
    4. 如果还找不到或不唯一:就会抛出异常。此时可以通过 @Qualifier("beanName") 注解来明确指定要注入的 Bean 的名称。
    5. 如果找不到:默认情况下会抛出异常。可以通过设置 @Autowired(required = false) 来允许注入的 Bean 为 null
  • @Resource (Java 的“标准兵”)

    1. 按名称查找:首先尝试根据字段名或参数名去容器中寻找同名的 Bean。
    2. 如果按名称找不到:它会“退一步”,再按类型去寻找匹配的 Bean。
    3. 如果按类型找到多个:就会抛出异常(因为它不知道该选哪个)。
    4. 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 的名称进行注入时,@Resourcename 属性语义更直接。

二、 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) 标记在一个接口上,声明它是一个用于远程服务调用的客户端。valuename 属性用于指定要调用的目标服务的名称(在注册中心中的 spring.application.name)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询