Spring Boot常用注解有哪些?一文搞懂@Controller等核心注解用法

 更新时间:2026年07月17日 10:46:22   作者:仲夏那片海  
还在为Spring注解记不住而烦恼吗?本文为你梳理了Spring开发中最常用的核心注解,包括@Controller、@RequestMapping、@Autowired等,覆盖Web层、业务层、数据层和AOP,助你快速掌握Spring注解的用法和场景

@Controller

解释:

  • 用于标记一个类是 Spring MVC 中的控制器。
  • 控制器负责处理 HTTP 请求并返回响应。
  • 它是 Spring Web 应用程序中处理用户请求的核心组件。

@RequestMapping

解释:

  • 用于将 HTTP 请求映射到控制器的处理方法上。
  • 它可以应用在类级别和方法级别。
  • 在类级别上,它定义了一个基本的请求路径前缀,在方法级别上,它定义了具体的请求路径和请求方法(如 GET、POST 等)。

@GetMapping、@PostMapping等组合注解

解释:

  • 这些是@RequestMapping的变体。
  • @GetMapping用于处理 HTTP GET 请求,@PostMapping用于处理 HTTP POST 请求,还有@PutMapping(处理 PUT 请求)、@DeleteMapping(处理 DELETE 请求)等。
  • 它们使代码更加简洁,提高了可读性。

@ResponseBody

解释:

  • 用于将控制器方法返回的对象转换为 HTTP 响应体。
  • 通常用于返回 JSON 数据等非视图相关的内容。
  • 当一个方法被标注了@ResponseBody,Spring 会使用合适的消息转换器(如 Jackson)将返回对象转换为 JSON 或其他格式发送给客户端。
   @Controller
   @RequestMapping("/api/user")
   public class UserApiController {
       @GetMapping("/{id}")
       @ResponseBody
       public User getUserById(@PathVariable("id") Long id) {
           // 根据id查询用户
           User user = userService.getUserById(id);
           return user;
       }
   }

这个方法返回一个User对象,Spring 会将其转换为 JSON 格式(假设配置了 Jackson)发送给客户端。

@PathVariable

解释:

  • 用于从请求路径中获取参数值。
  • 当请求路径中有变量部分时,如/user/{id},可以使用@PathVariable来获取{id}的值并将其作为方法参数。
   @Controller
   @RequestMapping("/product")
   public class ProductController {
       @GetMapping("/{productId}")
       public String getProduct(@PathVariable("productId") Long id) {
           // 根据产品id查询产品信息
           Product product = productService.getProductById(id);
           // 处理产品信息并返回视图
           return "productDetails";
       }
   }

@RequestParam

解释:

  • 用于获取请求参数的值,通常用于处理查询字符串参数或表单参数。
  • 它可以指定参数的名称、是否必需以及默认值等。
   @Controller
   @RequestMapping("/search")
   public class SearchController {
       @GetMapping
       public String search(@RequestParam("keyword") String keyword) {
           // 根据关键字进行搜索
           List<Product> products = productService.searchProducts(keyword);
           // 处理搜索结果并返回视图
           return "searchResults";
       }
   }

上述代码中,search方法获取名为keyword的请求参数,用于执行产品搜索。

如果请求中没有keyword参数,会抛出异常,除非设置为非必需参数。

@Autowired

解释:

  • 用于自动装配 Spring 管理的 Bean。
  • 它可以应用在字段、构造函数或方法上。
  • Spring 会根据类型自动查找并注入匹配的 Bean 实例。
@Controller
public class OrderController {
    @Autowired
    private OrderService orderService;
    // 处理订单相关的方法
}

@Service

解释:

  • 用于标注业务逻辑层(Service 层)的类。
  • 它是一个构造型(stereotype)注解,将一个类标记为 Spring 容器中的一个 Bean,主要用于实现业务逻辑。
  • 被标注的类可以被其他组件(如控制器)通过@Autowired等方式进行注入和使用。
@Service
public class UserService {
    public User getUserById(Long id) {
        // 从数据库或其他数据源获取用户的逻辑
        return userRepository.findById(id).orElse(null);
    }
}

这里UserService类提供了获取用户的业务逻辑,并且可以被注入到其他组件中使用。

@Repository

解释:

  • 用于标注数据访问层(DAO 层)的类,它也是一个构造型注解。
  • 通常用于对数据库或其他持久化存储进行操作的类。
  • 它的主要作用是将数据访问层的类标记为 Spring 容器中的 Bean,并且可以处理一些与数据访问相关的异常转换(如将原生的持久化异常转换为 Spring 的DataAccessException体系)。
   @Repository
   public class UserRepositoryImpl implements UserRepository {
       @Autowired
       private JdbcTemplate jdbcTemplate;
       public User findById(Long id) {
           // 使用JdbcTemplate从数据库查询用户的逻辑
           String sql = "SELECT * FROM users WHERE id =?";
           User user = jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
           return user;
       }
   }

这个UserRepositoryImpl类实现了数据访问的逻辑,通过JdbcTemplate从数据库中查询用户信息,并且可以被UserService等上层组件注入和使用。

@ComponentScan

解释:

  • 用于指定 Spring 应该扫描哪些包来查找组件(如@Controller、@Service、@Repository等标注的类)。
  • 它通常在配置类(用@Configuration标注)中使用,可以自动发现和注册 Bean 到 Spring 容器中,减少了手动配置 Bean 的工作量。
   @Configuration
   @ComponentScan("com.example.myapp")
   public class AppConfig {
       // 可以在这里添加其他配置方法
   }

上述配置会扫描com.example.myapp及其子包下的所有组件,并将它们注册到 Spring 容器中。

@Configuration

解释:

  • 用于标记一个类为 Spring 的配置类。
  • 在这个类中可以定义 Bean、导入其他配置类、设置属性源等。
  • 它可以替代传统的 XML 配置文件,通过 Java 代码的方式来配置 Spring 容器。
   @Configuration
   public class DatabaseConfig {
       @Bean
       public DataSource dataSource() {
           // 配置数据源的逻辑,如返回一个DruidDataSource实例
           DruidDataSource dataSource = new DruidDataSource();
           dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
           dataSource.setUsername("root");
           dataSource.setPassword("password");
           return dataSource;
       }
   }

这个DatabaseConfig类是一个配置类,其中dataSource方法定义了一个DataSource类型的 Bean,Spring

会将这个方法返回的对象注册到容器中作为一个 Bean。

@Qualifier

解释:

  • 当有多个相同类型的 Bean 存在于 Spring 容器中时,@Qualifier用于指定要注入的具体 Bean。
  • 它与@Autowired一起使用,通过名称来区分不同的 Bean。
@Configuration
public class AppConfig {
    @Bean("dataSource1")
    public DataSource dataSource1() {
        // 配置第一个数据源的逻辑
        return new DruidDataSource();
    }
    @Bean("dataSource2")
    public DataSource dataSource2() {
        // 配置第二个数据源的逻辑
        return new HikariDataSource();
    }
    @Service
    public class UserService {
        @Autowired
        @Qualifier("dataSource1")
        private DataSource dataSource;
        // 使用指定的数据源进行用户相关的业务逻辑
    }
}

在UserService中,通过@Qualifier(“dataSource1”)指定要注入的是名为dataSource1的数据源。

@ExceptionHandler

解释:

  • 用于在控制器类中统一处理异常。
  • 当控制器方法抛出指定类型的异常时,被@ExceptionHandler标注的方法会被调用,用于返回合适的响应给客户端,如返回错误信息页面或者错误 JSON 数据等。
   @Controller
   public class MyController {
       @RequestMapping("/operation")
       public String doOperation() {
           // 可能抛出异常的操作
           throw new MyBusinessException("业务操作出错");
       }
       @ExceptionHandler(MyBusinessException.class)
       public String handleBusinessException(MyBusinessException ex) {
           // 处理业务异常,如记录日志、返回错误页面等
           return "errorPage";
       }
   }

当doOperation方法抛出MyBusinessException时,handleBusinessException方法会被调用,返回errorPage视图给客户端。

@InitBinder

解释:

  • 用于在控制器中自定义数据绑定。
  • 可以用于注册自定义的属性编辑器(Property Editor)或者格式化器(Formatter),对请求参数进行转换和格式化,以便正确地绑定到控制器方法的参数上。
   @Controller
   public class MyController {
       @InitBinder
       public void initBinder(WebDataBinder binder) {
           binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy - MM - dd"), true));
       }
       @RequestMapping("/date")
       public String processDate(Date date) {
           // 处理日期参数的逻辑
           return "success";
       }
   }

这里initBinder方法注册了一个自定义的日期编辑器,用于将请求中的日期字符串按照yyyy - MM - dd的格式转换为Date类型,以便正确地绑定到processDate方法的Date参数上。

@Before、@After、@Around等 AOP 通知注解

解释:

  • @Before:如前面例子所示,用于在目标方法执行之前执行切面中的代码。可以用于权限检查、参数验证、日志记录等操作。
  • @After:用于在目标方法执行之后执行切面中的代码,无论目标方法是否抛出异常。可以用于资源清理、记录方法执行后的状态等。
  • @Around:是功能最强大的 AOP 通知类型。它可以在目标方法执行前后都进行操作,并且可以控制目标方法是否真正执行。可以用于实现复杂的事务管理、性能监控等功能。
//After示例:
@Aspect
@Component
public class ResourceCleanupAspect {
    @After("execution(* com.example.dao..*.*(..))")
    public void cleanUpAfter(JoinPoint joinPoint) {
        System.out.println("方法执行后进行资源清理");
        // 可以在这里进行数据库连接关闭、文件流关闭等资源清理操作
    }
}

//@Around
@Aspect
@Component
public class TransactionAspect {
    @Around("execution(* com.example.service..*.*(..))")
    public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
        try {
            // 开启事务
            System.out.println("开启事务");
            Object result = pjp.proceed();
            // 提交事务
            System.out.println("提交事务");
            return result;
        } catch (Exception e) {
            // 回滚事务
            System.out.println("回滚事务");
            throw e;
        }
    }
}

在这个TransactionAspect的@Around示例中,在目标服务方法执行前开启事务,方法执行后根据情况提交或回滚事务,实现了事务管理的 AOP 切面。

@Profile

解释:

  • 用于根据不同的环境配置(如开发环境、测试环境、生产环境)来加载不同的 Bean 或者配置。
  • 可以将 Bean 或者配置类标记为特定的环境配置文件相关。
  • 在运行时,可以通过设置活动的环境配置文件(如通过spring.profiles.active属性)来决定启用哪些被@Profile标注的组件。
@Configuration
@Profile("dev")
public class DevDatabaseConfig {
    @Bean
    public DataSource dataSource() {
        // 配置开发环境下的数据源,如使用本地数据库
        return new DruidDataSource();
    }
}

@Transactional

解释:

  • 用于在方法或类级别上声明事务。
  • 当应用在方法上时,该方法的执行会被包含在一个事务中;当应用在类级别上时,类中的所有公共方法都会被包含在事务中。
  • 可以设置事务的属性,如传播行为(Propagation)、隔离级别(Isolation)、超时时间(Timeout)和是否只读(Read - only)等。
@Service
public class AccountService {
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
    public void transferMoney(Account from, Account to, BigDecimal amount) {
        from.setBalance(from.getBalance().subtract(amount));
        to.setBalance(to.getBalance().add(amount));
        accountRepository.save(from);
        accountRepository.save(to);
    }
}

@Valid和@Validated

解释:

  • @Valid:这是 Java Bean Validation(JSR 303)规范中的注解,用于标记一个方法参数或返回值应该被验证。它通常和验证注解(如@NotNull、@Size等)一起使用,用于对请求参数进行验证。Spring MVC 会自动检测被@Valid标注的参数,并触发验证逻辑。
  • @Validated:这是 Spring 提供的注解,它是@Valid的增强版。除了支持 JSR 303 验证外,还支持 Spring 特有的验证分组功能。可以通过定义不同的验证分组来对同一对象在不同场景下进行有针对性的验证。
@Controller
public class UserController {
    @RequestMapping("/user")
    public String addUser(@Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "userForm";
        }
        userService.addUser(user);
        return "success";
    }
}

这里@Valid用于验证User对象的参数。如果验证不通过,BindingResult会包含错误信息,然后可以根据这些信息返回错误页面。

@Service
@Validated
public class UserService {
    public void addUser(@Validated(AddUserGroup.class) User user) {
        // 添加用户的逻辑
    }
}

假设定义了AddUserGroup验证分组,@Validated(AddUserGroup.class)用于按照这个分组的验证规则来验证User对象。

@Value

解释:

  • 用于注入外部配置的值,如属性文件中的配置项或者环境变量的值。
  • 它可以直接注入基本数据类型(如String、int、boolean等)的值到 Bean 的字段或者方法参数中。
@Component
public class MyComponent {
    @Value("${myapp.config.key}")
    private String configValue;
    // 可以在方法中使用configValue
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springmvc数据格式化原理及代码案例

    Springmvc数据格式化原理及代码案例

    这篇文章主要介绍了Springmvc数据格式化原理及代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java导出pdf文件的详细实现方法

    java导出pdf文件的详细实现方法

    这篇文章主要介绍了java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下
    2025-03-03
  • SpringBoot快速入门及起步依赖解析(实例详解)

    SpringBoot快速入门及起步依赖解析(实例详解)

    SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程,这篇文章主要介绍了SpringBoot快速入门及起步依赖解析,需要的朋友可以参考下
    2022-10-10
  • Stream中的Peek操作代码

    Stream中的Peek操作代码

    这篇文章主要介绍了Stream中的Peek操作,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • RestTemplate报错I/O error on POST request for的解决办法

    RestTemplate报错I/O error on POST request for的解决办法

    这篇文章主要给大家介绍了关于RestTemplate报错I/O error on POST request for的解决办法,文中通过代码实例将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 浅谈Maven包冲突的原理及解决方法

    浅谈Maven包冲突的原理及解决方法

    这篇文章主要介绍了浅谈Maven包冲突的原理及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java中让界面内的时间及时更新示例代码

    Java中让界面内的时间及时更新示例代码

    这篇文章主要给大家介绍了关于Java中让界面内的时间及时更新的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中的位运算符、移位运算详细介绍

    Java中的位运算符、移位运算详细介绍

    这篇文章主要介绍了Java中的位运算符、移位运算,有需要的朋友可以参考一下
    2013-12-12
  • Java中log4j注解详解与实战指南(附具体示例)

    Java中log4j注解详解与实战指南(附具体示例)

    日志是软件开发中不可或缺的一部分,它能够帮助开发者追踪程序的运行状态,诊断问题,以及监控系统性能,这篇文章主要介绍了Java中log4j注解详解与实战的相关资料,需要的朋友可以参考下
    2025-07-07
  • Java中.divide()方法使用及注意事项详解

    Java中.divide()方法使用及注意事项详解

    divide方法就是bigdecimal类中的一个除法计算方法,由于该divide方法参数类型众多并且不易理解容易出现错误,这篇文章主要给大家介绍了关于Java中.divide()方法使用及注意事项的相关资料,需要的朋友可以参考下
    2024-03-03

最新评论