SpringBoot 项目中常用的注解

每一层对应每个包,包名中应全为小写。

一、Common 层(实体类)

前提:导入 Lombok 依赖

@Data:生成 get 和 set 方法以及 toString 方法

@Getter:只生成 get 方法,避免对类中的成员变量修改。

@EqualsAndHashCode(callSuper = false):重写 equals 和 hashCode 方法

@AllArgsConstructor:生成全参的构造方法

@NoArgsConstructor:生成无参的构建方法

@Builder(access = AccessLevel.MODULE):实现不可变对象的创建,避免直接使用构造函数初始化各个字段,并提供了一种链式调用的方式来设置对象属性。

使用方法

以下是 mybtis - plus下的实体类字段常用注解

@TableId(value = "id", type = IdType.AUTO):标识主键,可以根据 value 来对应表中字段名称,type 为主键的自增

@TableField("PLATFORM_TYPE"):当该注解的 value 值与表中的字段名称一致时,在进行 sql 编写时就不需要再进行别名处理了,会自动映射实体类的属性名称。

@TableField(exist = false):标识该属性在对应的表中不存在,不会加入到 mybatis - plus 提供的自动生成的 sql 语句中。

以下是对实体类中存在的日期格式的类型的格式指定

@JsonFormat:将 Java 对象序列化为 JSON 格式时,日期类型字段的格式化方式。

@DateTimeFormat:用于将请求参数绑定到 Java 对象时,日期类型字段的格式化方式。

//两个注解可以连用
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")   //后端  -->  前端
@DateTimeFormat(pattern = "yyyy-MM-dd")    //前端 -->后端
private Date updateTime;

二、Dao / Mapper 层(数据访问层)

@Repository:将数据库访问异常翻译为 Spring 提供的统一的数据访问异常类型,将类加入到 Spring 容器中。

@Mapper :将类加入到 Spring 容器中,告诉 MyBatis 框架对应的接口是一个映射器接口,需要动态生成对应的实现类。

@DS( DBConstants.DATASOURCE_GZZT_MYSQL):对于多数据源的项目用来指定数据源。

三、Service 层(业务逻辑层)

@Service:将类加入到 Spring 容器中。

@Autowired:根据类型在 Spring 容器中匹配相应的Bean。

@Qualifier:如果存在多个匹配的Bean,可以用该注解指定一个来使用,与 @Autowired 连用。

@Resource:通过名称进行自动装配。

@AutoWired和@Resource注解的区别如下:

  1. 注入方式:@Autowired是Spring提供的注解,通过类型进行自动装配;@Resource是JavaEE提供的注解,通过名称进行自动装配。

  2. 匹配规则:@Autowired默认按照类型进行匹配,如果存在多个匹配的Bean,则可以通过@Qualifier注解指定具体的Bean;@Resource默认按照名称进行匹配,如果存在多个匹配的Bean,则会根据容器的默认规则进行选择。

  3. 扩展性:@Autowired是Spring提供的注解,更加灵活,可以与其他Spring注解配合使用;@Resource是JavaEE提供的注解,不支持与其他注解的配合使用。

总的来说,@Autowired是Spring推荐使用的注解,更加灵活和强大,而@Resource是JavaEE提供的注解,更加符合JavaEE的规范。在实际使用中,可以根据具体的需求选择合适的注解。

@Value("${effFileNameLocalDirPath}"):一般用来匹配配置文件中的属性值。

@Transactional:可以添加在类和方法上,用来进行事务管理。

@Slf4j:开启日志,通过 log.info(),打印日志,在 Lombok 包下。

四、Controller 层(控制器层)

1、在类上使用的注解

@Controller:用于标识控制器类,处理请求并返回视图。

@RestController:用于标识控制器类,处理请求并将响应结果转换为 JSON 或 XML 等格式。

@RequestMapping:可以在类级别或方法级别使用,用于指定请求URL的路径。

@CrossOrigin:开启跨域。

2、在方法上使用的注解

@RequestMapping:可以在类级别或方法级别使用,用于指定请求URL的路径。 @GetMapping:简化的@RequestMapping,符合 RESTful 风格,用于处理GET请求,一般是对应的查询业务。

@PostMapping:用于处理POST请求,一般对应添加业务,如果页面传递的参数为一个 JSON 对象,就必须使用 POST 请求,使用 GET 请求会报错。

@PutMapping:用于处理PUT请求,一般对应修改业务。

@DeleteMapping:用于处理DELETE请求,一般对应删除业务。

@ResponseBody:将方法的返回值封装为 JSON 对象。

3、在参数上使用的注解
@GetMapping("one/{productId}")
public ResultData one(@PathVariable Integer productId)

URL:http://localhost:8080/order/one/1

@PathVariable:参数值对应的是 URL 中传递的值。

public ResultData params(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "5") Integer size)

URL:http://localhost:8080/order/all?page=1&size=5

@RequstParam:参数值对应的时 URL 中传递的参数值。

@RequestBody:将前端传递的请求体(JSON 格式)转换为对应的 Java 实体类。

4、异常处理器

@ExceptionHandler:用于处理控制器中出现的异常,可以针对特定的异常类型进行处理。

@ControllerAdvice:结合 @ExceptionHandler 注解在一个类中定义全局异常处理器。

@RestControllerAdvice:将异常处理的结果封装为 JSON 格式。

@Component:如果使用自定义的异常处理器,使用该注解将该类注入到 spring 容器中。

以下是自定义拦截器的实现:

@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {/**** @param httpServletRequest     request对象* @param httpServletResponse    response对象* @param o                      出现异常的Controller对象* @param e                      异常* @return*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o,Exception e) {
​ModelAndView modelAndView = new ModelAndView();//1、可以通过异常的类型,来做出不同处理if(e instanceof LongException){modelAndView.setViewName("error");}else if(e instanceof OrderException){modelAndView.setViewName("error");}else if(e instanceof PayException){modelAndView.setViewName("error");}
​//2、前端分离项目。通过响应流进行进行响应httpServletResponse.getWriter().write(jsonStr);
​//打印异常信息e.printStackTrace();return modelAndView;}
}

五、Config 层 (配置类)

@Configuration:用于标识一个类为配置类,配置类中可以定义 Bean 的创建和依赖关系。

@Bean:用于定义一个 Bean 的配置信息并注入 Spring 容器中。通常用于 @Configuration 类中的方法上。

六、Interceptor 层 (拦截器)

@component:用于标识一个类为Spring容器管理的组件(Bean),可以用于任何类。

拦截器类一般都是通过实现 HandlerInterceptor 接口的三个方法来进行请求的拦截。

@Component
public class LoginInterceptor implements HandlerInterceptor { //AOP@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("进入到Handler之前执行【进行拦截操作】");
​HttpSession session = request.getSession();Object loginUser = session.getAttribute("loginUser");if(loginUser == null){response.sendRedirect(request.getContextPath()+"/pages/login.jsp");return false;}return true; //是否放行    false表示不放行   true放行}
​@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("进入到Handler之后执行【进行后续操作】");}
​@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("当请求成功之后数据渲染完成执行【资源释放】");}
}

在完成拦截器的实现之后还需要将拦截器配置到 Web 的配置类中。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
​@Autowired//配置的拦截器类private LoginInterceptor loginInterceptor;
​//文件上传配置//添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/image/**").addResourceLocations("file:D:\\upload\\");}
​
​@Override//跨域配置public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")   //请求的资源  /**表示所有资源 、.allowedOrigins("*")    //允许指定的源能访问.allowedHeaders("*")    //允许携带的请求头.allowedMethods("*");    //允许的请求方式//注意:当设置允许携带Cookie不允许将指定源设置为所有}
​@Override//拦截器配置public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor)       //添加拦截器类.excludePathPatterns("/")//.addPathPatterns("/**")                   //添加拦截的路径.excludePathPatterns("/user/**");           //添加排除路径}
}

以上就完成了整个拦截器的实现。

拦截器(Interceptor)和过滤器(filter)之间的区别如下:

  1. 触发时机:拦截器是在请求处理的前后触发,可以对请求进行预处理和后处理;而过滤器是在请求到达Servlet之前或响应返回客户端之前触发。

  2. 对象范围:拦截器是针对Handler(Controller)级别的,它只能拦截处理器方法的调用;而过滤器是对Servlet容器级别的,它可以拦截整个请求响应链。

  3. 依赖关系:拦截器依赖于Servlet容器,例如Spring MVC中的DispatcherServlet;而过滤器是独立于Servlet容器的,可以在任何符合Servlet规范的容器中使用。

  4. 功能定位:拦截器主要用于业务逻辑的处理,可以在请求前或请求后进行处理、日志记录、权限校验等;而过滤器主要用于请求过滤,可以对请求和响应进行过滤、处理编码、安全验证等。

七、Advice 层(切面层)

@Aspect:标识该类为一个切面类。

@Component:用于扫描指定包下的组件,将其注册为Spring的Bean。

@PointCut:切入点,表示在应用程序中可以被拦截到的具体的点,比如方法调用、异常抛出等。

@Before:前置通知。

@After:最终通知。

@AfterRerurning:后置通知。

@AfterThrowing:异常通知。

@Around:环绕通知。

综合使用可以通过 Spring 的切面编程在开发中的使用-CSDN博客 案例实现。

以下是对五种通知方式的解释:

/**execution 表达式的使用*:表示任意  ..:表示任意参数完整表示:public void com.service.impl.UserServiceImpl.addUser();以下是省略表述:void com.service.impl.UserServiceImpl.addUser();* com.service.impl.UserServiceImpl.addUser(..);* com.service.*.*Impl.*(..)
*/
@Before("execution(* com.service.*.*Impl.*())")
public void before(){System.out.println("前置通知,在目标方法执行之前就执行(相当于开启事务)注解");
}
@After("execution(* com.service.*.*Impl.*())")
public void after(){System.out.println("最终通知,在目标方法执行之后执行(相当于finally 无论异常与否都会返回)注解");
}
@AfterReturning("execution(* com.service.*.*Impl.*())")
public void afterReturning(){System.out.println("后置通知,在目标方法返回返回值之后执行(相当于关闭事务)注解");
}
@AfterThrowing("execution(* com.service.*.*Impl.*())")
public void afterThrowing(){System.out.println("异常通知,在目标方法中出现异常是执行(相当于回滚事务)注解");
}
@Around("execution(* com.service.*.*Impl.*())")
public Object around(ProceedingJoinPoint joinPoint){Object obj=null;try{System.out.println("前置通知,在目标方法执行之前就执行(相当于开启事务)注解");//调用proceed()方法可以继续执行被增强的方法。obj=joinPoint.proceed();System.out.println("后置通知,在目标方法返回返回值之后执行(相当于关闭事务)注解");} catch (Throwable e) {System.out.println("异常通知,在目标方法中出现异常是执行(相当于回滚事务)注解");throw new RuntimeException(e);}finally {System.out.println("最终通知,在目标方法执行之后执行(相当于finally 无论异常与否都会返回)注解");}return obj;
}

八、SpringBoot 启动类上的注解

@SpringBootApplication:用于标注主类,表示这是一个Spring Boot应用程序的入口类,同时也包含了 @EnableAutoConfiguration 和 @ComponentScan 注解。

@ComponentScan:用于扫描指定包下的组件,将其注册为Spring的Bean。

@EnableAutoConfiguration:用于自动配置Spring应用程序,根据类路径下的依赖自动配置Bean。

@MapperScan:指定 MyBatis Mapper 接口所在的包,Spring 在启动时会扫描指定的包路径,并注册这些 Mapper 接口的实现类作为 Bean。

@EnableScheduling:用于开启定时任务的支持。

当开启定时任务时在对应的方法上添加 @Scheduled 注解可以将该方法设置为一个定时任务。

@Scheduled(cron = "0 */5 * * * ?"):标识该方法为一个定时任务,通过 cron 参数来指定什么时候执行。

关于@Scheduled的参数配置可以参考SpringBoot 项目定时任务的启动和@Scheduled注解中的cron参数的设置原则-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware虚拟机中Nat、桥接模式和仅主机的差别

NAT 在NAT模式下,主机3是Kali和Win两个操作系统的宿主机,那么Kali和Win可以连接到外网,也可以和主机3进行互联,但是主机1和主机2不能连接到Kali和Win。 桥接 在桥接模式下,主机3是Kali和Win两个操作系统的宿主机&…

elasticsearch系列六:索引重建

概述 我们再起初创建索引的时候由于数据量、业务增长量都并不大,常常不需要搞那么多分片或者说某些字段的类型随着业务的变化,已经不太满足未来需求了,再或者由于集群上面索引分布不均匀导致节点直接容量差异较大等等这些情况,此时…

ssm基于Java的小区物业管理系统论文

基于Java的小区物业管理系统 摘 要 进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务&#…

【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析

🍎个人博客:个人主页 🏆个人专栏: 数 据 库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 悲观锁(Pessimistic Locking): 乐观锁(Optimistic Locking): 总结&#x…

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、设置过程 打开IDE,在第一个菜单File 中找到Settings...菜单 在Setting...中找到Plugins…

Python面向对象高级与Python的异常、模块以及包管理

Python面向对象高级与Python的异常、模块以及包管理 一、Python中的继承 1、什么是继承 我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型…

彭涛:2023年终复盘,工作,团队,个人!

眨眼2023即将结束,2024即将开启,每年这个时候,都会简单总结下自己这一年,既是对今年的一个复盘和回顾,也是对新一年的向往和期待。 我的2023年,大概分为 「个人」,「家庭」,「团队」…

大创项目推荐 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…

第三节-数据链路层与MAC地址

如果数据进行封装时,基于E2或者802.3标准,此时我们称之为是一个以太网数据帧。 不同的协议栈用于定义和管理不同网络的数据转发规则。 E2和802.3作用:定义帧头和帧尾的格式 数据:对于下层的每个层级而言,上层所反馈…

台阶仪在半导体行业中的广泛应用及其重要意义

台阶仪在半导体材料的表征和研究中是一种非常重要的工具。如在半导体材料的制备过程中,一些关键的工艺参数,如温度、压力、气氛等条件的变化,会导致半导体材料的能带结构发生变化,通过使用台阶仪,可以准确测量和分析材…

归并算法:分治而治的高效算法大揭秘(图文详解)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 📋 前言 归并算法是我们算法中最常见的算法之一,其思想非常巧妙。本身归并是只能归并有序数组…

一文带你掌握Flutter dio网络请求库的封装

highlight: an-old-hope 封装网络库考虑的几个方面: 请求参数的封装: 将请求所需的参数进行封装,例如 URL、请求头、请求体等。可以定义一个统一的数据结构或模型类来表示请求参数,以便于传递和管理。 响应结果的封装&#xff…

蓝牙物联网智能安防系统设计方案

1概述 安防系统(安全防护)的作用是预防损失,是人们保障人身和财产安全最重要的工具之一。近年来,伴随经济的飞速发展和城市人口的急剧增加,盗窃、入室抢劫等事件的增多给人们的安定生活带来了很大的影响,同时,交通的快…

安装DataEase(Linux线上安装)修改端口

问题一:端口更改 警告本解决方法仅仅应急,如果找到了更好的方法请通知我,感谢你的理解!!! 为了让mysql与dataease的端口不发生冲突,将 MySQL 外部运行端口参数 ${DE_MYSQL_PORT} 改为新端口&am…

openGauss学习笔记-176 openGauss 数据库运维-实例主备切换

文章目录 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换176.1 操作场景176.2 操作步骤176.3 示例176.4 错误排查176.5 异常处理 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换 176.1 操作场景 openGauss在运行过程中,数据库管理员可能需要…

基于elemen二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

【机器学习】Boosting算法-AdaBoost算法

一、AdaBoost理论 随机森林与AdaBoost算法的比较 AdaBoost算法 AdaBoost模型训练误差分析 从广义加法模型推导出AdaBoost训练算法&#xff0c;从而给出AdaBoost算法在理论上的解释 各种AdaBoost算法对比 标准AdaBoost算法只能用于二分类问题&#xff0c;它的改进型可以用于多分…

泽攸科技PECVD设备助力开发新型石墨烯生物传感器

近日&#xff0c;松山湖材料实验室许智团队与清华大学符汪洋合作在纳米领域头部期刊《Small》上发表了一项引人注目的研究成果&#xff0c;题为“Ultrasensitive biochemical sensing platform enabled by directly grown graphene on insulator”&#xff08;硅晶圆上直接生长…

基于Java SSM框架实现艺诚美业美容美发管理系统项目【项目源码+论文说明】

基于java的SSM框架实现艺诚美业美容美发管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们…

node fs模块读取文件 readFile、readFileSync、fsPromises.readFile、createReadStream

文章目录 1.读取文件1.1 readFile1.2 readFileSync1.3 fsPromises.readFile&#xff1a;promise的写法1.4 fs.createReadStream 1.读取文件 readFile&#xff1a;异步读取文件readFileSync&#xff1a;同步读取文件fsPromises.readFile&#xff1a;promise的写法 需要注意的是…