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

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. Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

    Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?最近整理了一下项目的术语表.今天就谈谈为什么起了 Claptrap 和 Minion 两个名字. Claptr ...

  2. 响应式布局rem、rem方法封装、移动端响应式布局

    相信大家在做移动端的时候都会做各个手机的适配这种适配就是响应式布局在之前做网站的响应式从pc到手机用的是媒体查询 @media screen and (max-width: 300px){} 最大宽度 ...

  3. Unity-ECS(一)浅谈CPU缓存命中和Unity面向数据技术栈(DOTS)--笔记

    一,缓存类型 概念:局部性. 时间局部性:当前用到的一个存储器位置,不久的将来会被用到. 空间局部性:当前用到的一个存储器位置,附近的位置会被用到. 那么在CPU的层面,这两个局部性的特性就会被Cac ...

  4. Redis 相关运维操作

    背景 Redis作为目前全球最流行的KV存储,除了使用之外,还需要做好日常的运维工作.关于运维相关的工作,本文从以下方面进行介绍说明(Redis5.0以上): 内存方面 客户端连接方面 工具方面 说明 ...

  5. spring boot实现简单的登录拦截

    一.思路 1.在pom.xml导入相关包 2.先写个简单的认证适配器(WebSecurityConfig extends WebSecurityConfigurerAdapter),登录拦截后就会跳转 ...

  6. Event-Driven Architecture思考

    什么是Event? An event represents a fact, something happened; and it is immutab. 事件代表着事实,代表着过去发生的某件事情,是不 ...

  7. 软件测试工程师入门——Linux【使用说明书】

    先来说一下linux是什么? linux 是一个开源.免费的操作系统,其稳定性.安全性.处理多并发已经得到业界的认可,目前很多中性,大型甚至是巨型项目都在使用linux. linux 内核:redha ...

  8. Ubuntu安装Redis过程完整笔记

    在阿里云与百度云均已经安装成功~~ 下载文件 切换路径设置下载存放地址 cd /home 下载安装包(http://download.redis.io/releases建议下载最新稳定版本) sudo ...

  9. vs code的使用(一) Format On Paste/Format On Save/ Format On Type

    很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...

  10. MacOS系统隐藏文件操作

    显示或关闭隐藏文件 显示:defaults write com.apple.finder AppleShowAllFiles -bool true ; killall Finder隐藏:default ...