SpringBoot 项目中常用的注解

news2024/11/27 15:53:48

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

一、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
    @Override
    public 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放行
    }
​
    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("进入到Handler之后执行【进行后续操作】");
    }
​
    @Override
    public 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;
​
    //文件上传配置
    //添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容
    @Override
    public 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.coloradmin.cn/o/1341782.html

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

相关文章

“踩坑”经验分享:Swift语言落地实践

作者 | 路涛、艳红 导读 Swift 是一种适用于iOS/macOS应用开发、服务器端的编程语言。自2014年苹果发布 Swift 语言以来,Swift5 实现了 ABI 稳定性、Module 稳定性和Library Evolution,与Objective-C(下文简称“OC”)相比&#xf…

数据仓库-数仓优化小厂实践

一、背景 由于公司规模较小,大数据相关没有实现平台化,相关的架构都是原生的Apache组件,所以集群的维护和优化都需要人工的参与。根据自己的实践整理一些数仓相关的优化。 二、优化 1、简易架构图 2、ODS层优化 2.1 分段式解析 随着业务增长…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)一

第二部分、线性表详解:数据结构线性表10分钟入门 线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。 线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表&#xff…

助力城市部件[标石/电杆/光交箱/人井]精细化管理,基于YOLOv7【tiny/yolov7】开发构建生活场景下城市部件检测识别系统

井盖、店杆、光交箱、通信箱、标石等为城市中常见部件,在方便居民生活的同时,因为后期维护的不及时往往会出现一些“井盖吃人”、“线杆、电杆、线缆伤人”事件。造成这类问题的原因是客观的多方面的,这也是城市化进程不断发展进步的过程中难…

点亮AI未来的U盘

随着人工智能行业蓬勃发展,如今国内外大模型如雨后春笋般涌现,国内AI赛道更是步入水深火热的发展阶段。上半年的AIGC赛道国内投融资规模以模型层为主,这一现象充分说明了国内人工智能应用场景的丰富多样,投资机会也更加聚焦于应用…

用电脑将图片转为excel表格有几种方法?怎么操作?

将图片转为Excel表格,一般需要借助OCR(光学字符识别)技术。OCR技术可以将图片中的文字提取出来,并转换成Excel表格中的数据。以下是几种常用的方法: 一、.使用在线OCR工具 1、打开金鸣表格文字识别(简称金鸣识别)网站…

软件测试/测试开发丨Python自动化测试学习笔记

1. 引言 自动化测试是软件开发中的关键环节,它可以提高测试效率、减少重复工作,并提供更快速、稳定的测试结果。Python作为一种易学易用的编程语言,为自动化测试提供了强大的工具和库。本文将介绍如何使用Python进行自动化测试。 2. 安装Py…

如何将弹性公网IP绑定到负载均衡CLB

创建的CLB实例为私网类型,没有公网IP,无法通过公网访问,如果需要让其网站能够通过公网访问,只需要绑定前面创建的EIP即可。 第一步 如果弹性公网IP已经绑定了资源,需要先解绑 第二步 将私网CLB实例绑定到弹性公网IP …

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

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

[OCR]Python 3 下的文字识别CnOCR

目录 1 CnOCR 2 安装 3 实践 1 CnOCR CnOCR 是 Python 3 下的文字识别(Optical Character Recognition,简称OCR)工具包。 工具包支持简体中文、繁体中文(部分模型)、英文和数字的常见字符识别,支持竖…

如何实现内部产品权限集成

当前我国各领域正在加速向数字化、移动化、智能化发展,大力投入信息化建设与数字化转型已成为企业的共识,而企业门户系统是企业信息化系统建设是一个重要支撑,以企业业务系统为基础,搭建门户系统作为统一入口和应用中心可以有效支…

通过Python将PDF转为文本,快速提取PDF中的文字

快速高效地从PDF文档中提取信息对于专业人士来说非常重要。处理大量PDF文件时,将PDF转换为可编辑的文本格式可以节省时间和精力。而强大的Python语言正是在这些方面发挥其作用。利用Python中丰富的API,我们可以轻松在Python程序中将PDF转换为文本&#x…

YOLOv5改进 | 2023注意力篇 | BiFormer双层路由注意力机制(Bi-level Routing Attention)

一、本文介绍 BiFormer是一种结合了Bi-level Routing Attention的视觉Transformer模型,BiFormer模型的核心思想是引入了双层路由注意力机制。在BiFormer中,每个图像块都与一个位置路由器相关联。这些位置路由器根据特定的规则将图像块分配给上层和下层路…

重装系统以后无法git跟踪

总结:权限问题 故障定位 解决方案: 复制一份新的文件夹。(新建的文件创建和写入权限都变了) 修改文件为新的用户 执行提示的命令

【iOS安全】越狱iOS安装Frida | 安装指定版本Frida

越狱iPhone安装Frida 本文的方法适用于已越狱的iPhone手机 打开Cydia,软件源,编辑(右上角),添加(左上角):https://build.frida.re 然后搜索Frida,点击安装 参考&#x…

gzip引入后node_modules中.cache compression-webpack-plugin占用内存过多

1.Gzip Gzip(GNU zip)是一种常见的文件压缩格式和压缩算法,通常用于在 Web 服务器上对静态资源文件进行压缩,以减小文件大小并加快文件传输速度。在前端开发中,经常会使用 Gzip 压缩来优化网站的性能。 Gzip 压缩通过…

3D动态路障生成

3D动态路障生成 介绍设计实现1.路面创建2.空物体的创建3.Create.cs脚本创建 总结 介绍 上一篇文章介绍了Mathf.Lerp的底层实现原理,这里介绍一下跑酷类游戏的动态路障生成是如何实现的。 动态路障其实比较好生成,但是难点在哪里,如果都是平面…

18-网络安全框架及模型-信息系统安全保障模型

信息系统安全保障模型 1 基本概念 信息系统安全保障是针对信息系统在运行环境中所面临的各种风险,制定信息系统安全保障策略,设计并实现信息系统安全保障架构或模型,采取工程、技术、管理等安全保障要素,将风险减少至预定可接受的…

详解Vue3中的表单验证

本文主要介绍Vue3中的表单验证。 目录 普通语法setup语法注意事项 在Vue3中,表单验证可以使用Vue的内置指令v-model和自定义指令来实现。 普通语法 下面是一个详细介绍Vue3中表单验证的步骤: 创建Vue实例,并定义需要验证的表单数据。 imp…

网页在不同Android机表现有差异时需要排查页面样式是否针对主题模式作配置

前言 如题,这周有跟进一个BUG,后来分析出是跟手机主题模式有关。 bug情报:测试小年青那边提供的情报是我们的一个业务报告页面在某台华为手机上,页面列表项的文字颜色异常(正常是显示黑色)还有文字的背景显…