iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring如何自定义注解
  • 697
分享到

Spring如何自定义注解

2023-06-15 23:06:56 697人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关spring如何自定义注解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。字段注解字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验

这篇文章将为大家详细讲解有关spring如何自定义注解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

字段注解

字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验注解 ,如@NotNull、@Range等,但是这些注解并不是能够满足所有业务场景的。

比如我们希望传入的参数在指定的String集合中,那么已有的注解就不能满足需求了,需要自己实现。

自定义注解

定义一个@Check注解,通过@interface声明一个注解

@Target({ ElementType.FIELD}) //只允许用在类的字段上  @Retention(RetentionPolicy.RUNTIME) //注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解  @Constraint(validatedBy = ParamConstraintValidated.class)  public @interface Check {            String[] paramValues();            String message() default "参数不为指定值";      Class<?>[] groups() default {};      Class<? extends Payload>[] payload() default {};  }

@Target 定义注解的使用位置,用来说明该注解可以被声明在那些元素之前。

ElementType.TYPE:说明该注解只能被声明在一个类前。

ElementType.FIELD:说明该注解只能被声明在一个类的字段前。

ElementType.METHOD:说明该注解只能被声明在一个类的方法前。

ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。

ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。

ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。

ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。

ElementType.PACKAGE:说明该注解只能声明在一个包名前

@Constraint 通过使用validatedBy来指定与注解关联的验证器

@Retention 用来说明该注解类的生命周期。

RetentionPolicy.SOURCE: 注解只保留在源文件中

RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃

RetentionPolicy.RUNTIME: 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。

验证器类

验证器类需要实现ConstraintValidator泛型接口

public class ParamConstraintValidated implements ConstraintValidator<Check, Object> {            private List<String> paramValues;      @Override      public void initialize(Check constraintAnnotation) {          //初始化时获取注解上的值          paramValues = Arrays.asList(constraintAnnotation.paramValues());      }      public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {          if (paramValues.contains(o)) {              return true;          }          //不在指定的参数列表中          return false;      }  }

第一个泛型参数类型Check:注解,第二个泛型参数Object:校验字段类型。需要实现initialize和isValid方法,isValid方法为校验逻辑,initialize方法初始化工作

使用方式

定义一个实体类

@Data  public class User {            private String name;            @Check(paramValues = {"man", "woman"})      private String sex;  }

对sex字段加校验,其值必须为woman或者man

测试

@RestController("/api/test")  public class TestController {      @PostMapping      public Object test(@Validated @RequestBody User user) {          return "hello world";      }  }

注意需要在User对象上加上@Validated注解,这里也可以使用@Valid注解

方法、类注解

开发过程中遇到过这样的需求,如只有有权限的用户的才能访问这个类中的方法或某个具体的方法、查找数据的时候先不从数据库查找,先从guava cache中查找,在从redis查找,最后查找mysql(多级缓存)。

这时候我们可以自定义注解去完成这个要求,第一个场景就是定义一个权限校验的注解,第二个场景就是定义spring-data-Redis包下类似@Cacheable的注解。

权限注解

自定义注解

@Target({ ElementType.METHOD, ElementType.TYPE})  @Retention(RetentionPolicy.RUNTIME)  public @interface PermissionCheck {          String resourceKey();  }

该注解的作用范围为类或者方法上

拦截器类

public class PermissionCheckInterceptor extends HandlerInterceptorAdapter {            @Override      public boolean preHandle(httpservletRequest request, HttpServletResponse response,                               Object handler) throws Exception {          HandlerMethod handlerMethod = (HandlerMethod)handler;          PermissionCheck permission = findPermissionCheck(handlerMethod);          //如果没有添加权限注解则直接跳过允许访问          if (permission == null) {              return true;          }          //获取注解中的值          String resourceKey = permission.resourceKey();          //TODO 权限校验一般需要获取用户信息,通过查询数据库进行权限校验          //TODO 这里只进行简单演示,如果resourceKey为tesTKEy则校验通过,否则不通过          if ("testKey".equals(resourceKey)) {              return true;          }          return false;      }            private PermissionCheck findPermissionCheck(HandlerMethod handlerMethod) {         //在方法上寻找注解          PermissionCheck permission = handlerMethod.getMethodAnnotation(PermissionCheck.class);          if (permission == null) {              //在类上寻找注解              permission = handlerMethod.getBeanType().getAnnotation(PermissionCheck.class);          }          return permission;      }  }

权限校验的逻辑就是你有权限你就可以访问,没有就不允许访问,本质其实就是一个拦截器。我们首先需要拿到注解,然后获取注解上的字段进行校验,校验通过返回true,否则返回false

测试

@GetMapping("/api/test")   @PermissionCheck(resourceKey = "test")   public Object testPermissionCheck() {       return "hello world";   }

该方法需要进行权限校验所以添加了PermissionCheck注解。

缓存注解

自定义注解

@Target({ ElementType.METHOD, ElementType.TYPE})  @Retention(RetentionPolicy.RUNTIME)  public @interface CustomCache {            String key();  }

注解可以用在方法或类上,但是缓存注解一般是使用在方法上的。

切面

@Aspect  @Component  public class CustomCacheAspect {            @Around("@annotation(com.cqupt.annotation.CustomCache) && @annotation(customCache)")      public Object dealProcess(ProceedingJoinPoint pjd, CustomCache customCache) {          Object result = null;          if (customCache.key() == null) {              //TODO throw error          }          //TODO 业务场景会比这个复杂的多,会涉及参数的解析如key可能是#{id}这些,数据查询          //TODO 这里做简单演示,如果key为testKey则返回hello world          if ("testKey".equals(customCache.key())) {              return "hello Word";          }           //执行目标方法          try {              result = pjd.proceed();          } catch (Throwable throwable) {              throwable.printStackTrace();          }          return result;      }  }

因为缓存注解需要在方法执行之前有返回值,所以没有通过拦截器处理这个注解,而是通过使用切面在执行方法之前对注解进行处理。

如果注解没有返回值,将会返回方法中的值

测试

@GetMapping("/api/cache")  @CustomCache(key = "test")  public Object testCustomCache() {      return "don't hit cache";  }

关于“Spring如何自定义注解”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Spring如何自定义注解

本文链接: https://www.lsjlt.com/news/281779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring如何自定义注解
    这篇文章将为大家详细讲解有关Spring如何自定义注解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。字段注解字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖就提供了很多校验...
    99+
    2023-06-15
  • Spring@Component自定义注解实现详解
    目录引子Java里的注解注解是什么元注解注解的保存策略自定义注解注解元素注解处理器注解是什么自己写一个@Component注解准备工作代码实现准备@MyComponent注解准备一个...
    99+
    2022-11-13
  • 使用Spring AOP 如何实现自定义注解
    这期内容当中小编将会给大家带来有关使用Spring AOP 如何实现自定义注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Maven中加入以下以依赖:<!-- Spring AOP + Aspe...
    99+
    2023-05-31
    springaop 注解
  • Spring Boot 注解方式自定义Endpoint详解
    目录概述准备编写自定义Endpoint配置启动&测试注意Spring Boot 常用endpoint的使用Actuator一些常用 Endpoint如何访问 Actuator...
    99+
    2022-11-12
  • Spring AOP 实现自定义注解的示例
    目录1. 注解如下:2. 切面自工作后,除了一些小项目配置事务使用过 AOP,真正自己写 AOP 机会很少,另一方面在工作后还没有写过自定义注解,一直很好奇注解是怎么实现他想要的功能...
    99+
    2022-11-12
  • spring怎么自定义bean注入
    在Spring中,我们可以使用两种方式来自定义Bean的注入: 使用注解方式:通过在Bean定义类上添加注解来告诉Spring容...
    99+
    2023-10-26
    spring
  • 关于spring的自定义缓存注解分析
    目录为什么要自定义缓存注解?自定义缓存注解CachedCacheUpdateCacheInvalidateCachedAspectCacheUpdateAspectCach...
    99+
    2023-05-20
    spring 注解 spring 自定义缓存
  • Java自定义注解
    目录 一、什么是自定义注解 1)Java注解简介 2)Java注解分类 JDK基本注解 JDK元注解 自定义注解 如何自定义注解? 二、自定义注解 1)获取类上注解值 2)获取类属性上的注解属性值 3)获取方法上的注解值  4)获取参数修饰...
    99+
    2023-09-06
    java 开发语言
  • spring自定义校验注解ConstraintValidator的示例分析
    这篇文章主要介绍spring自定义校验注解ConstraintValidator的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、前言系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以...
    99+
    2023-06-20
  • Spring自定义注解配置简单日志示例
    目录一、创建自定义注解二、解析注解三、使用自定义注解java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致。 下面会讲解Spring中自定义注解的简单...
    99+
    2023-05-19
    Spring 自定义注解 Spring 日志注解
  • Spring spel获取自定义注解参数值方式
    目录spel获取自定义注解参数值1.注解类2.注解使用3.aop中处理 spel在注解中的使用1 语法说明2. 基本用法4 #{…}和${…}s...
    99+
    2022-11-13
  • 如何在Java中自定义注解
    这篇文章给大家介绍如何在Java中自定义注解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、自定义注解格式分析 Java 中自带的 @Override 注解 , 源码如下 :@Target(ElementType.M...
    99+
    2023-06-15
  • Java中自定义注解
    当使用Java编写应用程序时,我们常常使用注解来为程序添加附加信息,并且可以在运行时读取这些注解。除了Java提供的预定义注解外,我们还可以自定义注解来满足自己的需求。在本文中,我们将介绍Java中自定义注解的基础知识。 一、什么是注解? ...
    99+
    2023-09-24
    java 开发语言
  • Spring Batch 如何自定义ItemReader
    目录Spring Batch 自定义ItemReader创建自定义ItemReader配置ItemReader Bean小结一下Spring Batch 之 ItemReaderJd...
    99+
    2022-11-12
  • Spring Boot如何自定义starter
    这篇文章主要介绍Spring Boot如何自定义starter,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、简介SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我...
    99+
    2023-06-02
  • 如何通过自定义spring invalidator注解校验数据合法性
    目录自定义spring invalidator注解校验数据合法性1、定义校验属性字符串长度的注解2、实现校验逻辑,校验失败后返回错误提示3、在模型字段属性上增加校验的注解4、提供统一...
    99+
    2022-11-13
  • Spring MVC如何通过添加自定义注解格式化数据
    这篇文章主要为大家展示了“Spring MVC如何通过添加自定义注解格式化数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring MVC如何通过添加自定义注解格式化数据”这篇文章吧。sp...
    99+
    2023-05-30
    springmvc
  • mybatis代码生成+自定义注解+自定义注释实例
    目录mybatis代码生成配置文件配置类自定义的lombok注解配置代码注释配置mybatis代码生成 <!--mybatis的包和反向生成的包__用来生成...
    99+
    2022-11-12
  • 详解Java如何实现自定义注解
    目录概念作用JDK中预定义的一些注解注解生成文档案例自定义注解格式本质属性:接口中的抽象方法元注解:用于描述注解的注解在程序使用(解析)注解:获取注解中定义的属性值案例:通过自定义注...
    99+
    2022-11-13
  • Feign如何自定义注解翻译器
    目录Feign自定义注解翻译器新建自定义注解MyUrl新建接口,使用MyUrl注解定义注解翻译器测试类启动服务类Feign注解说明Feign自定义注解翻译器 新建自定义注解MyUrl...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作