不说废话,直接进入正题:

java自定义注解主要有3步:
1.编写@interface接口
2.编写@interface对应的处理方法进行处理
3.调用处理方法

示例一:判断奇偶:比如有一个字段no要判断奇偶,是偶数就抛出异常,有以下实体类:

@Data
public class Book {   
private   int no;   
private String author;   
private String bookName;
}

要判断 no是奇数还是偶数,首先写注解接口IsOdd:

@Target(ElementType.FIELD)  //  注解用于字段上
@Retention(RetentionPolicy.RUNTIME)  // 保留到运行时,可通过注解获取
public @interface IsOdd {
}

第二步,在类InterfaceUtil中编写IsOdd的处理方法,其中需要注意如果要获取Feild的private属性的话必须使用getDeclaredFields()方法,但是这时只是获取到了属性,get静态字段会报错,要记得在获得静态数据前设置为可访问setAccessible(true):

public static void isOdd(Book book) throws IllegalAccessException {  
//自定义注解获取所有的属性,包括private的
for(Field field:book.getClass().getDeclaredFields()){           
IsOdd isOdd=field.getAnnotation(IsOdd.class);                   
if(isOdd!=null){    
//private的字段必须要设置成可访问后才能get,不然报错
field.setAccessible(true);                       
Object value=field.get(book);                       
if (value instanceof Integer){                           
int s=(int) value;                           
if((s&)!=){//判偶                               
throw  new RuntimeException(s+"不是奇数!");                           
}                       
}               
}      
}
}

接下来是测试代码:

@Test
public void writeSimpleExcelShouldSuccess() throws IllegalAccessException {   
List<Book> sheetOne=new ArrayList<>();   
Book book1=new Book();   
book1.setNo();   
book1.setAuthor("老舍");   
book1.setBookName("三味书屋");   
InterfaceUtil.isOdd(book1);    //调用注解对应的方法
}

结果如下:

ca734736ac1cc7d04110b6490a683446.png

例二:判断长度

同样,如果现在要no的长度在1-10之间,可以这样:

@Target(ElementType.FIELD)  //  注解用于字段上
@Retention(RetentionPolicy.RUNTIME)  // 保留到运行时,可通过注解获取
public @interface Face {   
int min() default ;  
int max() default ;
}

最好设置defaut默认值
接下来是处理方法

public static void check(Book book) throws IllegalAccessException {   
//自定义注解获取所有的属性,包括private的   
for (Field field : book.getClass().getDeclaredFields()) {      
Face  face=field.getAnnotation(Face.class);       
if(face!=null){          
//private的字段必须要设置成可访问后才能get,不然报错           
field.setAccessible(true);           
Object value = field.get(book);           
if (value instanceof Integer) {              
int s = (int) value;               
// 判断值是否满足@Face的min/max:              
if (s < face.min() || s > face.max()) {                  
throw new IllegalArgumentException("出错了:" + field.getName());        
}          
}      
}  
}
}

接下来测试:

List<Book> sheetOne=new ArrayList<>();
Book book1=new Book();
book1.setNo();
book1.setAuthor("老舍");
book1.setBookName("三味书屋");
InterfaceUtil.check(book1);

出错结果如下:

dbc746f2eaa5ebcd16ef07b25a693578.png

总的说来,自定义注解就这么几步,不过不同元注解,元注解可以直接使用而不需要再在其它地方调用,自定义注解在注解后还需要再进行调用(如InterfaceUtil.check(book1)),这里必须要注意。

Springboot中如何自定义注解以及使用2例的更多相关文章

  1. springboot中使用自定义注解实现策略模式,去除工厂模式的switch或ifelse,实现新增策略代码零修改

    前言 思路与模拟业务 源码地址 https://gitee.com/houzheng1216/springboot 整体思路就是通过注解在策略类上指定约定好的type,项目启动之后将所有有注解的typ ...

  2. springboot中的常用注解

    springboot中的常用注解个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解.从容器中取出型注解和功能型注解.其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依 ...

  3. springboot中的controller注解没有生效

    springboot中的controller注解没有生效  , 启动的Application类没有在controller的父目录或同级目录

  4. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  5. SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离

    一.定义我们自己的切库注解类 自定义注解有几点需要注意: 1)@Target 是作用的目标,接口.方法.类.字段.包等等,具体看:ElementType 2)@Retention 是注解存在的范围,R ...

  6. springboot中使用自定义两级缓存

    工作中用到了springboot的缓存,使用起来挺方便的,直接引入redis或者ehcache这些缓存依赖包和相关缓存的starter依赖包,然后在启动类中加入@EnableCaching注解,然后在 ...

  7. 在springMVC中使用自定义注解来进行登录拦截控制

    1:java注解使用是相当频繁,特别是在搭建一些框架时,用到类的反射获取方法和属性,用的尤其多. java中元注解有四个: @Retention     @Target     @Document  ...

  8. Java中的自定义注解

    ## 元注解 要声明一个注解, 我们需要元注解, 元注解是指注解的注解,包括@Retention, @Target, @Document, @Inherited. @Retention 注解的保留位置 ...

  9. AOP中获取自定义注解的参数值

      目录 一.利用注解实现AOP的基本流程 1.1.创建一个注解,用来注解切点(pointcut) 1.2.创建一个service,使用上面定义的注解来指定切点 1.3.创建Aspect,增加业务逻辑 ...

随机推荐

  1. 数据可视化之DAX篇(十三)熟练使用FORMAT函数,轻松自定义数据格式

    https://zhuanlan.zhihu.com/p/64420449 在进行数据分析时,需要对某个数据进行格式调整的情形经常会遇到,在DAX中有一个专门进行格式调整的函数:FORMAT. 其实对 ...

  2. 谈谈JVM(基础模型)

    一,基本概念      JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈. 一个垃圾回收,堆 和 一个存储方法域.     JVM 是运行在操作系统之上的,它与硬件没 ...

  3. mysql常见数据类型

    #常见的数据类型 /* 数值型: 整型 小数: 定点数 浮点数 字符型: 较短的文本:char.varchar 较长的文本:text.blob(较长的二进制数据) 日期型: */ #一.整型 /* 分 ...

  4. ATX 学习 (四)-atxserver2

    ATXSERVER2 一.main()文件启动 1.首先通过parse_args返回一个Namespace作一些配置,登录页html在SimpleLoginHandler这个里边写着,2.接着通过db ...

  5. echarts 实战 : 标题的富文本样式

    官方文档在这一块交待的不是很清楚,记录一下. title:{ left:15, top:10, subtext:"AAA {yellow|316} BBB {blue|219}", ...

  6. LESS实战::not与:hover混合使用

    举个例子,有个HTML是这样的. <div class="item light">A</div> <div class="item" ...

  7. java文件导出过程 CS、BS差别

    最近在做一个需求,类似和navicat工具差不多的,通过java代码吧数据库表的数据导出来.jdbc获取数据库连接,查询表数据,分批次用流写入文件txt.csv.json.xls.xlsx,搞定之后, ...

  8. variable ans might not have been initialized 报错,以及初始化注意点

    他是说你没有初始化而已,一般只是个warning,如果是在不能跑,那就给他初始化一下. 注意,初始化可不是任意值哈! 就比如如果要算阶乘,你初始化就不能为0. 还有如果是比较大小这类,就不要把初始化统 ...

  9. PHP Cookie是什么

    PHP Cookie cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时,这 ...

  10. PHP imagecolorclosestalpha - 取得与指定的颜色加透明度最接近的颜色的索引

    imagecolorclosestalpha — 取得与指定的颜色加透明度最接近的颜色的索引.高佣联盟 www.cgewang.com 语法 int imagecolorclosestalpha ( ...