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

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. java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 Hadoop完全分布式运行模式 步骤分析: 编写集群分发脚本xsync 集群配置 集群部署规划 配置集群 集群单 ...

  2. ffplay源码编译

    ffplay是ffmpeg源码中一个自带的开源播放器组件,支持本地视频文件的播放以及在线流媒体播放,很多商业播放器都是基于ffplay定制而来的.ffplay中的代码充分利用了ffmpeg中的函数库, ...

  3. Mybatis执行流程浅析(附深度文章推荐&面试题集锦)

    首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...

  4. Dart函数

    函数 Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function.这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征.同时意味着在Dart语言 ...

  5. R语言 循环语句、分支语句和中止语句-控制流篇

    for 循环 用法 for (n in m) expr 若n在m中则运行 expr while 循环 用法 while (condition) expr 当符合condition时运行expr rep ...

  6. expect正则捕获返回结果

    expect正则捕获返回结果 expect: expect -re "([0-9]*)([a-zA-Z]*)"send_user "num is $expect_out( ...

  7. NanoHTTPD服务

    需要导入nanohttpd2.3,jar包 继承NanoHTTPD public class HttpServer extends NanoHTTPD { public HttpServer(int ...

  8. XML--概念、约束、解析

    概念 XML:可扩展标记语言 HTML:超文本标记语言 两者的区别: 1.语法结构类似,单语法要求不同 HTML不区分大小写,XML严格区分大小写 在HTML中,有时不严格,如果上下文清楚地显示出段落 ...

  9. python map() filter() reduce()函数的用法以及实例

    map() 看一下我的终端咋说: map()的函数用法: map(function, iterable, ...) 看一下具体例子: 注意的是一定要强制转化一下才能输出 也可以写匿名函数: (mark ...

  10. 算数组的长度cpp

    今天被自己整傻了.... cpp  int 型的数组就别想用strlen来求长度了,会报错的. (当然java 里直接用length就可以了...) 所以我建议用vector!!!!!!