首页 智能穿戴

Spring Boot 常用注解:分类、详解与实战避坑指南

分类:智能穿戴
字数: (2493)
阅读: (8935)
内容摘要:Spring Boot 常用注解:分类、详解与实战避坑指南,

Spring Boot 的注解机制极大地简化了 Java Web 应用的开发,使得开发者可以专注于业务逻辑,而不是 XML 繁琐的配置。本文将深入探讨 Spring Boot 常用注解 的分类与使用,并通过实际案例分析,帮助读者快速上手并避免常见问题。

一、Spring Boot 注解分类

Spring Boot 的注解可以从多个维度进行分类,例如:

  1. 核心注解: 这些注解是 Spring Framework 提供的,Spring Boot 在此基础上进行了扩展和简化。例如 @Component, @Autowired, @Value
  2. Bean 定义注解: 用于定义 Bean 的相关信息,例如 @Bean, @Configuration, @Scope
  3. Web 相关注解: 用于处理 Web 请求,例如 @Controller, @RequestMapping, @GetMapping, @PostMapping, @RequestParam, @PathVariable
  4. 条件注解: 用于根据条件判断是否创建 Bean,例如 @ConditionalOnProperty, @ConditionalOnBean, @ConditionalOnClass
  5. 持久化注解: 用于简化数据库操作,例如 @Entity, @Table, @Id, @GeneratedValue(配合 JPA 使用)。
  6. 配置注解: 用于属性配置,例如 @ConfigurationProperties, @EnableConfigurationProperties

二、常用 Spring Boot 注解详解

下面将详细介绍一些常用的 Spring Boot 注解,并提供代码示例。

1. Bean 定义相关注解

  • @Configuration: 标记一个类作为配置类,通常与 @Bean 注解一起使用。

    @Configuration
    public class AppConfig {
    
        @Bean
        public MyService myService() {
            return new MyServiceImpl();
        }
    }
    
  • @Bean: 声明一个方法返回的对象为一个 Bean,由 Spring 容器进行管理。

    @Bean
    public String myBean() {
        return "Hello, Spring!";
    }
    
  • @Component: 通用的组件注解,标记一个类为 Spring 组件,可以被 Spring 容器自动扫描并注册为 Bean。

    Spring Boot 常用注解:分类、详解与实战避坑指南
    @Component
    public class MyComponent {
    
        public void doSomething() {
            System.out.println("Doing something...");
        }
    }
    
  • @Service: 标记一个类为服务组件,通常用于业务逻辑层。

    @Service
    public class MyServiceImpl implements MyService {
        // ... 实现业务逻辑
    }
    
  • @Repository: 标记一个类为数据访问组件,通常用于持久层。

    @Repository
    public class MyRepository {
        // ... 数据访问逻辑
    }
    
  • @Controller: 标记一个类为控制器组件,用于处理 Web 请求。

    @Controller
    public class MyController {
        // ... 处理 Web 请求
    }
    

2. 依赖注入相关注解

  • @Autowired: 自动注入依赖的 Bean。Spring 会根据类型自动查找匹配的 Bean,并将其注入到被注解的字段、构造方法或 Setter 方法中。 为了防止出现多个符合条件的Bean,可以使用 @Qualifier 注解配合使用指定注入的Bean的名称。

    @Service
    public class MyService {
        @Autowired
        private MyRepository myRepository;
    }
    
  • @Resource: 也是用于自动注入依赖的 Bean。 默认按名称注入,如果没有指定名称,则按类型注入。来自 JSR-250 规范,是 Java EE 的标准。

    Spring Boot 常用注解:分类、详解与实战避坑指南
    @Service
    public class MyService {
        @Resource
        private MyRepository myRepository;  //默认按照 myRepository 的名称去寻找 Bean
    }
    
  • @Value: 注入配置文件中的属性值。

    @Value("${my.property}")
    private String myProperty;
    

3. Web 相关注解

  • @RequestMapping: 映射 HTTP 请求到处理方法。可以指定请求的 URL 路径、HTTP 方法等。

    @Controller
    @RequestMapping("/api")
    public class MyController {
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String hello() {
            return "Hello, World!";
        }
    }
    
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: @RequestMapping 的快捷方式,分别对应 GET、POST、PUT、DELETE、PATCH 请求。

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
        return null;
    }
    
  • @RequestParam: 获取请求参数。

    @GetMapping("/search")
    public List<User> searchUsers(@RequestParam String keyword) {
        // ...
        return null;
    }
    
  • @PathVariable: 获取 URL 路径中的参数。

    Spring Boot 常用注解:分类、详解与实战避坑指南
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
        return null;
    }
    
  • @RequestBody: 将请求体中的数据绑定到方法参数。常用于接收 JSON 数据。

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // ...
        return null;
    }
    
  • @ResponseBody: 将方法返回值作为响应体返回。常用于返回 JSON 数据。

    @GetMapping("/users/{id}")
    @ResponseBody
    public User getUser(@PathVariable Long id) {
        // ...
        return null;
    }
    
  • @RestController: @Controller@ResponseBody 的组合注解。标记一个类为 RESTful 风格的控制器。

    @RestController
    @RequestMapping("/api")
    public class MyRestController {
        @GetMapping("/hello")
        public String hello() {
            return "Hello, World!";
        }
    }
    

4. 条件注解

  • @ConditionalOnProperty: 根据配置文件中的属性值来决定是否创建 Bean。

    @Configuration
    @ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
    public class MyFeatureConfig {
        @Bean
        public MyFeature myFeature() {
            return new MyFeature();
        }
    }
    
  • @ConditionalOnBean: 当存在某个 Bean 时才创建另一个 Bean。

    Spring Boot 常用注解:分类、详解与实战避坑指南
    @Configuration
    @ConditionalOnBean(name = "myService")
    public class MyConfig {
        @Bean
        public AnotherBean anotherBean() {
            return new AnotherBean();
        }
    }
    
  • @ConditionalOnClass: 当存在某个类时才创建 Bean。

    @Configuration
    @ConditionalOnClass(name = "com.example.MyClass")
    public class MyClassConfig {
        @Bean
        public MyBean myBean() {
            return new MyBean();
        }
    }
    

5. 其他常用注解

  • @Transactional: 声明一个方法或类需要事务支持。 Spring Boot 默认使用 AOP 实现事务管理,需要配置 DataSourceTransactionManager 。如果使用分布式事务,则需要引入额外的组件,例如 Seata 。

    @Service
    public class MyService {
        @Autowired
        private MyRepository myRepository;
    
        @Transactional
        public void doSomething() {
            // ...
        }
    }
    
  • @Scheduled: 定时执行任务。 Spring Boot 默认使用单线程执行定时任务,如果需要并发执行,可以使用线程池。

    @Component
    public class MyTask {
        @Scheduled(fixedRate = 5000) // 每 5 秒执行一次
        public void doSomething() {
            System.out.println("Task executed at: " + new Date());
        }
    }
    

三、实战避坑经验总结

  1. 依赖注入失败: 确保 Bean 已经被 Spring 容器管理,并且类型匹配。可以使用 @Qualifier 注解指定 Bean 的名称。
  2. 循环依赖: 避免循环依赖,否则可能导致 Bean 创建失败。可以使用构造器注入或者 Setter 注入来解决循环依赖。
  3. 事务失效: @Transactional 注解只能用于 public 方法,并且在同一个类中调用被 @Transactional 注解的方法,事务不会生效。 此外,异常被 catch 也会导致事务不回滚,需要手动 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  4. 配置属性注入失败: 确保配置文件中的属性名称与 @Value 注解中的属性名称一致。 并且配置文件的格式正确,例如 properties 文件中的属性使用 key=value 格式, yaml 文件使用缩进格式。
  5. 条件注解失效: 检查条件注解的条件是否满足。 例如 @ConditionalOnProperty 注解,要确保配置文件中存在相应的属性,并且属性值与 havingValue 属性值一致。
  6. RequestMapping 冲突: 避免不同的 Controller 中的RequestMapping 发生冲突, 需要保证 URL 的唯一性。可以采用不同的前缀区分 Controller 。如果使用了 Nginx 作为反向代理,需要注意 Nginx 的 location 配置,确保请求能够正确转发到对应的 Controller 。

通过对 Spring Boot 常用注解 的深入理解和实践,可以有效提高开发效率,构建稳定可靠的 Web 应用。 在实际项目中,需要根据具体场景选择合适的注解,并注意避免常见问题。

Spring Boot 常用注解:分类、详解与实战避坑指南

转载请注明出处: 代码一只喵

本文的链接地址: http://m.acea4.store/blog/982000.SHTML

本文最后 发布于2026-04-03 09:42:39,已经过了24天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 薄荷味的夏天 5 天前
    受益匪浅,对于初学者来说很友好,代码示例也很清晰。
  • 西红柿鸡蛋面 12 小时前
    受益匪浅,对于初学者来说很友好,代码示例也很清晰。
  • i人日记 4 天前
    Transactional失效那个坑我踩过,确实要注意在同一个类中调用事务方法的问题。