Spring Boot 3 注解大全(附实战用法)

Spring Boot 3 作为主流的Java开发框架,凭借"约定优于配置"的理念大幅简化了项目搭建与开发流程,而注解正是其核心实现机制。注解不仅替代了繁琐的XML配置,还能精准控制Bean的生命周期、依赖注入、业务逻辑增强等核心功能。本文将按功能模块梳理Spring Boot 3中的常用注解,结合实战场景解析其用法与注意事项,助力开发者高效掌握框架精髓。

一、核心启动注解

此类注解用于标识Spring Boot应用的入口,触发自动配置、组件扫描等核心流程,是每个Spring Boot项目的必备注解。

1. @SpringBootApplication

作用:组合注解,集成了@ComponentScan、@EnableAutoConfiguration、@SpringBootConfiguration三大注解的功能,是Spring Boot应用的入口注解。

用法:标注在主启动类上,该类需位于项目根目录(确保组件扫描范围覆盖所有业务类)。

复制代码
复制代码
@SpringBootApplication
public class SpringBoot3DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot3DemoApplication.class, args);
    }
}

拆解说明

  • @SpringBootConfiguration:本质是@Configuration,标识该类为配置类,允许定义@Bean方法。

  • @ComponentScan:开启组件扫描,默认扫描当前类所在包及其子包下的@Component、@Service、@Controller等注解标识的类,可通过basePackages属性自定义扫描范围。

  • @EnableAutoConfiguration:开启自动配置,Spring Boot根据classpath下的依赖包自动配置Bean(如引入spring-boot-starter-web则自动配置Tomcat、Spring MVC)。

2. @SpringBootConfiguration

作用:标识类为Spring Boot的配置类,替代传统的XML配置文件,可在类中通过@Bean注解定义Bean。

注意:与@Configuration功能一致,仅为Spring Boot专属命名,通常无需单独使用,因@SpringBootApplication已集成。

二、依赖注入与Bean管理注解

此类注解用于控制Bean的创建、注册与依赖注入,是Spring IoC容器的核心注解,实现了对象的解耦与自动装配。

1. 组件注册注解

用于将普通类注册为Spring IoC容器中的Bean,无需手动创建对象,由容器统一管理生命周期。

  • @Component:通用组件注解,标注在普通类上,适用于无明确业务分层的类(如工具类)。

  • @Service:标注在业务逻辑层(Service层)类上,语义化注解,便于代码分层识别。

  • @Controller:标注在控制层(Controller层)类上,用于接收HTTP请求并返回响应,结合Spring MVC使用。

  • @Repository:标注在数据访问层(DAO层)类上,用于标识数据访问组件,支持Spring的数据访问异常转换。

注意:此类注解需配合@ComponentScan(或@SpringBootApplication)使用,否则无法被容器扫描到。

2. 依赖注入注解

用于将容器中的Bean注入到目标类中,实现依赖的自动装配。

  • @Autowired:按类型(byType)自动注入,默认要求依赖的Bean必须存在(可通过required=false属性设置非必需)。支持标注在构造方法、setter方法、字段上,Spring Boot 3中推荐标注在构造方法上(便于依赖注入校验与测试)。

    复制代码
    @Service
    public class UserService {
        private final UserDao userDao;
        
        // 构造方法注入(推荐)
        @Autowired
        public UserService(UserDao userDao) {
            this.userDao = userDao;
        }
    }
  • @Qualifier:与@Autowired配合使用,按名称(byName)注入Bean,解决同一类型多个Bean的冲突问题。

    复制代码
    @Service
    public class UserService {
        private final UserDao userDao;
        
        @Autowired
        public UserService(@Qualifier("mysqlUserDao") UserDao userDao) {
            this.userDao = userDao;
        }
    }
  • @Resource:JDK原生注解(javax.annotation.Resource),默认按名称(byName)注入,名称不存在时按类型注入,无需与@Qualifier配合,可通过name属性指定Bean名称。

  • @Value:注入配置文件中的属性值(如application.yml/application.properties),支持直接赋值、SpEL表达式与默认值。

    复制代码
    @Component
    public class ConfigProperties {
        // 注入配置文件中的属性
        @Value("${spring.application.name}")
        private String appName;
        
        // 注入默认值
        @Value("${server.port:8080}")
        private Integer port;
        
        // SpEL表达式注入
        @Value("#{T(java.lang.Math).random() * 100}")
        private Double randomNum;
    }

3. Bean定义与生命周期注解

  • @Bean:标注在配置类的方法上,方法返回值将作为Bean注册到IoC容器中,默认Bean名称为方法名,可通过name/value属性自定义名称。适用于第三方类(无法添加@Component注解)的Bean注册。

    复制代码
    @Configuration
    public class RedisConfig {
        @Bean(name = "redisTemplate")
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate&lt;String, Object&gt; template = new RedisTemplate<>();
            template.setConnectionFactory(factory);
            // 序列化配置...
            return template;
        }
    }
  • @Scope:指定Bean的作用域,默认值为singleton(单例,容器中仅一个实例),常用值如下:

    • prototype:多例,每次获取Bean时创建新实例。

    • request:Web环境下,每个HTTP请求创建一个实例。

    • session:Web环境下,每个会话创建一个实例。

  • @Lazy:标识Bean为懒加载,仅在首次获取Bean时才创建实例,默认情况下单例Bean会在容器启动时初始化。适用于Bean创建成本高且不常用的场景。

  • @PostConstruct:JDK原生注解,标注在方法上,Bean初始化完成后执行(仅执行一次),用于初始化资源(如加载配置、连接数据库)。

  • @PreDestroy:JDK原生注解,标注在方法上,Bean销毁前执行(仅执行一次),用于释放资源(如关闭连接、清理缓存)。

三、Web开发注解(Spring MVC)

此类注解用于构建Web应用,处理HTTP请求、参数绑定、响应返回等场景,是Spring Boot Web开发的核心。

1. 控制器与请求映射

  • @Controller:标注类为Spring MVC控制器,负责接收HTTP请求并转发给业务层,默认返回视图(需配合模板引擎)。

  • @RestController:组合注解(@Controller + @ResponseBody),标注类为RESTful风格控制器,所有方法的返回值直接转为JSON/XML响应(无需视图解析),适用于接口开发。

  • @RequestMapping:映射HTTP请求到控制器方法,支持指定请求路径(value/path)、请求方法(method)、请求参数(params)、请求头(headers)等。

    复制代码
    @RestController
    @RequestMapping("/api/user") // 类级别路径
    public class UserController {
        // 方法级别路径,仅接收GET请求
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public List<User> getUserList() {
            // 业务逻辑...
        }
    }
  • @GetMapping/@PostMapping/@PutMapping/@DeleteMapping:@RequestMapping的简化版,分别对应GET、POST、PUT、DELETE请求方法,更符合RESTful风格。

    复制代码
    @GetMapping("/{id}") // 路径参数
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
    
    @PostMapping("/add") // POST请求提交数据
    public Result addUser(@RequestBody User user) {
        userService.addUser(user);
        return Result.success();
    }

2. 请求参数绑定

  • @PathVariable:绑定URL路径中的参数到方法参数,适用于RESTful风格的路径参数(如/{id})。

  • @RequestParam:绑定HTTP请求参数(URL拼接参数或表单参数)到方法参数,可指定参数名(name/value)、是否必填(required)、默认值(defaultValue)。

    复制代码
    @GetMapping("/page")
    public PageInfo<User> getUserPage(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestParam(required = false) String keyword) {
        return userService.getUserPage(pageNum, pageSize, keyword);
    }
  • @RequestBody:绑定HTTP请求体(JSON/XML格式)到方法参数,适用于POST、PUT请求提交复杂数据(需配合@RestController使用)。

  • @RequestHeader:绑定HTTP请求头信息到方法参数,如获取Token、Content-Type等。

  • @CookieValue:绑定HTTP请求中的Cookie值到方法参数。

3. 响应处理

  • @ResponseBody:标注在控制器方法上,将方法返回值直接转为HTTP响应体(JSON/XML),无需视图解析,可单独使用(配合@Controller)或通过@RestController集成。

  • @ResponseStatus:指定方法返回的HTTP状态码,如200(成功)、404(未找到)、500(服务器错误)。

    复制代码
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT) // 返回204状态码
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
  • @CrossOrigin:解决跨域问题,标注在控制器类或方法上,允许指定 origins(允许跨域的源)、methods(允许的请求方法)等。

四、自动配置与配置类注解

Spring Boot的核心优势是自动配置,此类注解用于控制自动配置的生效、自定义配置规则等。

1. 自动配置开关

  • @EnableAutoConfiguration:开启自动配置,已集成到@SpringBootApplication中,无需单独使用。

  • @DisableAutoConfiguration :禁用指定的自动配置类,通常配合@SpringBootApplication使用,排除不需要的自动配置。 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ``// 禁用数据源自动配置,适用于非数据库应用

  • @Conditional:条件注解,根据指定条件决定Bean是否注册到容器中,Spring Boot提供了多个衍生注解:

    • @ConditionalOnClass:当classpath下存在指定类时生效。

    • @ConditionalOnMissingClass:当classpath下不存在指定类时生效。

    • @ConditionalOnBean:当容器中存在指定Bean时生效。

    • @ConditionalOnMissingBean:当容器中不存在指定Bean时生效。

    • @ConditionalOnProperty:当配置文件中存在指定属性且值匹配时生效。 @Bean

      复制代码
      @Bean
      @ConditionalOnProperty(name = "spring.redis.enabled", havingValue = "true", matchIfMissing = true)
      public RedisTemplate<String, Object> redisTemplate() {
          // 配置RedisTemplate
      }

2. 配置属性绑定

用于将配置文件中的属性批量绑定到Java类中,替代@Value的分散注入,更适合复杂配置场景。

  • @ConfigurationProperties:标注在类上,将配置文件中前缀匹配的属性批量注入到类的字段中,支持属性校验(配合@Validated)。

    复制代码
    // 配置文件:spring.datasource.url=jdbc:mysql://localhost:3306/test
    @Component
    @ConfigurationProperties(prefix = "spring.datasource")
    @Validated // 开启属性校验
    public class DataSourceProperties {
        @NotBlank(message = "数据库URL不能为空")
        private String url;
        private String username;
        private String password;
        // getter/setter
    }
  • @EnableConfigurationProperties:标注在配置类上,启用指定类的@ConfigurationProperties功能,适用于未添加@Component注解的配置类。

五、事务管理注解

此类注解用于控制数据库事务,确保业务操作的原子性、一致性、隔离性与持久性(ACID)。

1. @EnableTransactionManagement

作用:开启Spring的事务管理功能,标注在配置类上(Spring Boot 3中若引入spring-boot-starter-data-jpa/spring-boot-starter-jdbc,会自动开启,无需手动添加)。

2. @Transactional

作用:标注在类或方法上,标识该类/方法需要事务支持,Spring会自动管理事务的开启、提交与回滚。

复制代码
复制代码
@Service
@Transactional // 类级别事务,所有方法均受事务控制
public class OrderService {
    // 方法级别事务,可覆盖类级别配置
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void createOrder(Order order) {
        // 扣减库存、创建订单等业务操作
        // 发生Exception时自动回滚
    }
}

核心属性

  • propagation:事务传播行为,如REQUIRED(默认,当前无事务则创建,有则加入)、REQUIRES_NEW(无论是否有事务,均创建新事务)。

  • isolation:事务隔离级别,如READ_COMMITTED(默认,避免脏读)、REPEATABLE_READ。

  • rollbackFor:指定触发事务回滚的异常类型(默认仅回滚RuntimeException及其子类)。

  • readOnly:设置事务为只读(适用于查询操作,优化性能)。

六、异常处理注解

此类注解用于全局统一处理Web应用中的异常,替代传统的try-catch,简化异常处理逻辑。

1. @RestControllerAdvice

作用:组合注解(@ControllerAdvice + @ResponseBody),标识类为全局异常处理器,适用于RESTful接口,所有异常处理方法的返回值转为JSON响应。

2. @ExceptionHandler

作用:标注在方法上,指定该方法处理的异常类型,可处理特定异常或所有异常(Exception.class)。

复制代码
复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {
    // 处理业务异常
    @ExceptionHandler(BusinessException.class)
    public Result handleBusinessException(BusinessException e) {
        return Result.fail(e.getCode(), e.getMessage());
    }
    
    // 处理所有未捕获的异常
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result handleException(Exception e) {
        return Result.fail(500, "服务器内部错误:" + e.getMessage());
    }
}

七、其他常用注解

1. @Profile

指定Bean的生效环境(如开发、测试、生产),通过spring.profiles.active配置激活对应环境。适用于多环境配置隔离。

复制代码
复制代码
@Configuration
public class DataSourceConfig {
    @Bean
    @Profile("dev") // 开发环境生效
    public DataSource devDataSource() {
        // 开发环境数据源配置
    }
    
    @Bean
    @Profile("prod") // 生产环境生效
    public DataSource prodDataSource() {
        // 生产环境数据源配置
    }
}

2. @Async

标注在方法上,标识该方法为异步方法,Spring会将其提交到线程池执行,不阻塞主线程。需配合@EnableAsync注解(标注在配置类上)开启异步功能。

复制代码
复制代码
@Service
@EnableAsync
public class AsyncService {
    @Async
    public CompletableFuture<Void> doAsyncTask() {
        // 异步执行的业务逻辑
        return CompletableFuture.runAsync(() -> {
            // 任务内容
        });
    }
}

3. @Scheduled

标注在方法上,标识该方法为定时任务,支持固定速率、固定延迟、Cron表达式等触发规则。需配合@EnableScheduling注解(标注在配置类上)开启定时任务功能。

复制代码
复制代码
@Service
@EnableScheduling
public class ScheduleService {
    // 每天凌晨1点执行
    @Scheduled(cron = "0 0 1 * * ?")
    public void doScheduleTask() {
        // 定时任务逻辑(如数据统计、清理)
    }
}

八、注意事项

  1. 注解的语义化:尽量使用对应业务分层的注解(如@Service、@Repository),而非通用的@Component,提升代码可读性。

  2. 依赖注入优先级:构造方法注入 > setter方法注入 > 字段注入,推荐构造方法注入,避免循环依赖与空指针问题。

  3. 自动配置冲突:当自定义配置与Spring Boot自动配置冲突时,可通过@DisableAutoConfiguration排除自动配置类,或自定义Bean覆盖默认Bean。

  4. 事务生效条件:@Transactional注解仅对public方法生效,且需确保事务管理器(如DataSourceTransactionManager)已配置。

  5. 组件扫描范围:@SpringBootApplication默认扫描当前包及其子包,若业务类在其他包下,需通过@ComponentScan指定basePackages。

总结

Spring Boot 3的注解体系覆盖了项目开发的全流程,从启动配置、Bean管理、Web开发到事务控制、异常处理,每类注解都有其明确的应用场景。掌握这些注解的用法与底层原理,不仅能大幅提升开发效率,还能写出更规范、可维护的代码。实际开发中,需结合业务场景合理选择注解,避免过度使用或误用,同时关注注解的兼容性与性能影响(如@Async的线程池配置、@Scheduled的任务并发控制)。

相关推荐
空空kkk2 小时前
spring boot——配置文件
java·数据库·spring boot
gAlAxy...2 小时前
Thymeleaf 从入门到精通:Spring Boot 模板引擎实战指南
java·spring boot·后端
焦糖玛奇朵婷2 小时前
就医陪诊小程序|从软件开发视角看实用度✨
java·大数据·jvm·算法·小程序
Yvonne爱编码2 小时前
深入剖析 Java 中的深拷贝与浅拷贝:原理、实现与最佳实践
java·开发语言
是三好2 小时前
Spring全家桶
java·后端·spring
西门吹雪分身2 小时前
JUC之线程中断
java
CSD资源分享2 小时前
Claude Code 国内API配置完整指南
java·windows·claude·claude code
索荣荣2 小时前
Java关键字终极指南:从入门到精通
java·开发语言
砚边数影2 小时前
线性回归实战(一):房价预测数据集入库KingbaseES,表结构设计
java·数据库·人工智能·深度学习·机器学习·线性回归·金仓数据库