spring web项目中常用的注解

@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}")@ResponseBodypublic 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 {@GetMappingpublic 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 {@Autowiredprivate 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体系)。

   @Repositorypublic class UserRepositoryImpl implements UserRepository {@Autowiredprivate 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 容器。

   @Configurationpublic class DatabaseConfig {@Beanpublic 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();}@Servicepublic class UserService {@Autowired@Qualifier("dataSource1")private DataSource dataSource;// 使用指定的数据源进行用户相关的业务逻辑}
}

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

@ExceptionHandler

解释:用于在控制器类中统一处理异常。当控制器方法抛出指定类型的异常时,被@ExceptionHandler标注的方法会被调用,用于返回合适的响应给客户端,如返回错误信息页面或者错误 JSON 数据等。

   @Controllerpublic 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),对请求参数进行转换和格式化,以便正确地绑定到控制器方法的参数上。

   @Controllerpublic class MyController {@InitBinderpublic 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 {@Beanpublic 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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19353.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣题解661 图片平滑器

题目&#xff08;简单&#xff09; 图像平滑器 是大小为 3 x 3 的过滤器&#xff0c;用于对图像的每个单元格平滑处理&#xff0c;平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为&#xff1a;该单元格自身及其周围的 8 个单元格的平均值&#xff0c…

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“致远汽车租赁系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 致远汽车租赁系统总体功能模块图 系统首页界面…

DSP28335 DMA 官方例程解析以及拓展(一)

文章目录 概述官方例程1 内部RAM to RAM Example_2833xDMA_ram_to_ram源码解析 要点方法拓展 外部固定地址 TO RAM完整程序: 对DMA 和 DMA有关的API请看这篇文章 DSP28335 DMA API介绍 概述 本篇主要分析官方提供的28335 DMA 有关的例程 在此基础上有一定的拓展 官方例程1 内…

【Java SE】JDBC

JDBC&#xff08;Java DataBase Connectivity&#xff09;是一套用于在 Java 中操作关系型数据库的 API。它允许开发者使用统一的 Java 代码来访问不同的关系型数据库。 JDBC 的本质&#xff1a;JDBC 是由官方&#xff08;Sun 公司&#xff09;定义的一套接口规范&#xff0c;…

西电数据库课设|设计学籍管理系统

前言&#xff1a;ER图和逻辑结构图不准确&#xff0c;因为在后期实际建表的过程中有改动&#xff0c;去除了一些列和外键关系&#xff0c;但是我懒得返回去改图了&#xff0c;所以还是需要自己情况画图&#xff0c;还有学生信息我忘记加性别什么的&#xff0c;这个比较简单&…

优维HAO案例:500强旗下全牌照综合性券商CMDB平台项目

撰文&#xff1a;鹿小U / 制图&#xff1a;脾气超好 某中国500强集团旗下的HS公司&#xff0c;是一家具有一定行业影响力的综合性证券公司。在近年来的发展进程中&#xff0c;该公司坚定不移地持续推进财富管理转型工作&#xff0c;将 ETF 的财富管理以及机构经纪业务作为公司…

github进不去解决办法-误打误撞进去了

我的要求不高&#xff0c;就算麻烦&#xff0c;只要能进去就行&#xff0c;但是我找了很多的办法&#xff0c;xbox下载助手、watt Toolkit、更改host文件、fastgithub…最终还是没有用 绝望之际随便进了一个当时找的fastgithub连接 结果显示不是专用链接 然后看了该博主的文章…

RHCE——WEB服务器的部署及优化

URL组成 <scheme>://<user>:<password><host>:<port>/<path>:<params>?<query>#<frag> scheme 方案 访问服务器以获取资源时要使用哪种协议 user 用户 某些方案访问资源时需要的用户名 pass…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

基于SSM的毕业论文管理系统【附源码】

基于SSM的毕业论文管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统结构设计 4.2 系统顺序图设计 4.3 系统数据库设计 5 系统的实现 5.1 登录模块的实现 5.2 学生管理模块的实现 5.3 导师管理模块的实现 5.4 课题管理模块的实现 …

擎耀数字车灯CAN/LIN总线网络定向数据采集控制解决方案实施流程

2024年是数字车灯崛起的元年&#xff0c;随着车辆的智能化和网络化程度不断提高&#xff0c;车载网络系统&#xff08;如CAN总线&#xff09;成为连接各个电子控制单元&#xff08;ECU&#xff09;的重要纽带。车灯作为车辆重要的安全组件之一&#xff0c;其工作状态直接影响到…

【C++之STL】摸清 string 的模拟实现(上)

文章目录 1. 为什么要模拟实现&#xff1f;2. 基本框架搭建3. 构造函数3. 1 默认构造/from c_str3. 2 拷贝构造3. 2. 1 深浅拷贝 3. 3 fill3. 4 迭代器区间构造 4. 容量操作4. 1 size()和capacity()和empty()4. 2 clear()4. 3 resize()4. 4 reserve() 1. 为什么要模拟实现&…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

input file结合vue3和vant实现上传图片效果,并显示上传进度百分比%

这里写自定义目录标题 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码传入参数为uploadNum实现效果如图上传中&#xff0c;图片1上传成功&#xff0c;图片2 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码 传入参数为…

SELECT 语句详解

开发准备 注:如果你是从上一节直接进入本节进行学习的,请先删除上一节建立的数据库mysql_shiyan,删除语句为DROP DATABASE mysql_shiyan;。在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,projec…

重力传感器算法概述!

一、核心技术 高精度重力测量技术&#xff1a; 无人机重力传感器的核心技术之一是能够高精度地测量重力加速度数据。这通常依赖于先进的传感器设计和制造工艺&#xff0c;以确保传感器具有高度的灵敏度和稳定性。 例如&#xff0c;中国船舶第七〇七研究所自主研发的低空重力…

炼码LintCode--数据库题库(级别:中等;数量:更新中~)--刷题笔记_03

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;中等&#xff1b;数量&#xff1a;更新中~&#xff09;--刷题笔记_033617 更换连续两个人的座位&#xff08;case when&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a; 3615 数据中位数&#xff08;窗…

【stm入门学习SPI_铁头山羊系列教程】

stm入门学习SPI_铁头山羊教程 1.SPI总线1.电路结构与通信协议2.SPI的特点&#xff1a;3. 极性 相位4. 4中时钟模式5. 比特位的传输模式6.数据宽度 2. SPI引脚IO引脚初始化 1.SPI总线 1.电路结构与通信协议 主机向从机NSS引脚发送低电压&#xff0c;选中该从机。 主机通过向MOS…

RK3568平台开发系列讲解(platform虚拟总线驱动篇)实验:点亮一个LED

🚀返回专栏总目录 文章目录 一、设备树二、平台驱动三、应用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢xxx 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性,编写测试应用程序。 • 首先向设备树添加 LED 设备节点…

Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言 在现代的分布式系统和微服务架构中&#xff0c;数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog&#xff08;二进制日志&#xff09;功能能够记录所有对数据库的修改操作&#xff0c;如插入&#xff08;INSERT&#xff09;、更新&…