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

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. one-hot 编码

    def onehot(labels): '''one-hot 编码''' #数据有几行输出 n_sample = len(labels) #数据分为几类.因为编码从0开始所以要加1 n_class = ...

  2. java 正则提取字符串中的电话号码

    public static void test2() { String str = "张三:13539558064,李四:15626829748,赵六:13718952204"; ...

  3. Go Pentester - TCP Proxy

    Building a TCP Proxy Using io.Reader and io.Writer Essentially all input/output(I/O). package main i ...

  4. Ethical Hacking - NETWORK PENETRATION TESTING(8)

    WEP Cracking Basic case Run airdump-ng to log all traffic from the target network. airodump-ng --cha ...

  5. 阿里P9又有新瓜吃咯,马云震怒!!

    自从蒋凡出轨事件曝光之后,阿里这各种瓜来得就像龙卷风,隔三差五的爆出员工出轨事件,普通员工.中层.高管全覆盖,早已集齐7颗阿里瓜瓜,可以召唤神龙了. 上次的出轨事件过去还没有一个月的时间,今天又爆出来 ...

  6. 印象笔记如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  印象笔记如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载a ...

  7. Python学习周期 学习Python要多久?

    学习python编程需要多长时间?首先我们需要明确一点,在互联网技术领域,技术始终在不断的迭代升级,只要进入IT行业就要时刻保持学习的状态,才能不被技术进步的车轮碾压.我们目前讨论的python学习周 ...

  8. .net core https 双向验证

    文章来自:https://www.cnblogs.com/axzxs2001/p/10070562.html 关于https双向认证的知识可先行google,这时矸接代码. 为了双向认证,我们首先得准 ...

  9. mysql性能优化方案总结

    一.表结构优化 1.根据自己的业务选择合适的引擎.比如: 在以下两点情况下必须使用InnerDB: ①可靠性高或者必须要求事务处理 ②表更新和查询相当的频繁,并且表锁定的机会比较大的情况下,指定Inn ...

  10. kylin streaming原理介绍与特点浅析

    目录 前言 kylin streaming设计和原理 架构介绍 streaming coordinator streaming receiver cluster kylin streaming数据构建 ...