Springboot中如何自定义注解以及使用2例
不说废话,直接进入正题:
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); //调用注解对应的方法
- }
结果如下:
示例二:判断长度
同样,如果现在要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);
出错结果如下:
总的说来,自定义注解就这么几步,不过不同元注解,元注解可以直接使用而不需要再在其它地方调用,自定义注解在注解后还需要再进行调用(如InterfaceUtil.check(book1)),这里必须要注意。
Springboot中如何自定义注解以及使用2例的更多相关文章
- springboot中使用自定义注解实现策略模式,去除工厂模式的switch或ifelse,实现新增策略代码零修改
前言 思路与模拟业务 源码地址 https://gitee.com/houzheng1216/springboot 整体思路就是通过注解在策略类上指定约定好的type,项目启动之后将所有有注解的typ ...
- springboot中的常用注解
springboot中的常用注解个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解.从容器中取出型注解和功能型注解.其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依 ...
- springboot中的controller注解没有生效
springboot中的controller注解没有生效 , 启动的Application类没有在controller的父目录或同级目录
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离
一.定义我们自己的切库注解类 自定义注解有几点需要注意: 1)@Target 是作用的目标,接口.方法.类.字段.包等等,具体看:ElementType 2)@Retention 是注解存在的范围,R ...
- springboot中使用自定义两级缓存
工作中用到了springboot的缓存,使用起来挺方便的,直接引入redis或者ehcache这些缓存依赖包和相关缓存的starter依赖包,然后在启动类中加入@EnableCaching注解,然后在 ...
- 在springMVC中使用自定义注解来进行登录拦截控制
1:java注解使用是相当频繁,特别是在搭建一些框架时,用到类的反射获取方法和属性,用的尤其多. java中元注解有四个: @Retention @Target @Document ...
- Java中的自定义注解
## 元注解 要声明一个注解, 我们需要元注解, 元注解是指注解的注解,包括@Retention, @Target, @Document, @Inherited. @Retention 注解的保留位置 ...
- AOP中获取自定义注解的参数值
目录 一.利用注解实现AOP的基本流程 1.1.创建一个注解,用来注解切点(pointcut) 1.2.创建一个service,使用上面定义的注解来指定切点 1.3.创建Aspect,增加业务逻辑 ...
随机推荐
- Apache Kylin v3.1.0 重点功能推介
Apache Kylin v3.1.0 已于上周正式发布,其中包含了许多值得一试的新功能,本文选择了 Presto 查询下压引擎.Flink 构建引擎.Kylin on Kubernetes 解决方案 ...
- python发送邮件插件
github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...
- 定时器三----js定时器
方法一: var t; //初始化定时器 $(function(){ init_fun_timer1(); }); ...
- noi linux gedit 配置(c++环境)
基本配置 方法一 查看所有命令: gsettings list-recursively | grep -i gedit 命令解释 gsettings set org.gnome.gedit.prefe ...
- css:实现文本两行或多行文本溢出显示省略号
div{ display: -webkit-box; -webkit-box-orient: vertical; word-break: break-all; word-wrap: break-wor ...
- epic游戏平台如何启用认证器应用程序/二次验证码/谷歌身份验证器?
1.登陆epic游戏平台,找到二次验证绑定界面 登陆https://www.epicgames.com/store/zh-CN/, 点右上角用户头像-[账户]. 之后点-[密码与安全] 在[双重验证] ...
- python 模型的释义
CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. Integer ...
- windy数(数位dp)
https://www.luogu.com.cn/blog/virus2017/shuweidp https://www.luogu.com.cn/problem/P2657 #include < ...
- 使样式只在webkit内核生效
@media screen and (-webkit-min-device-pixel-ratio:0){ .do someting{ } } 使用媒体查询,制定样式
- Winform开发中的困境及解决方案
在我们开发各种应用的时候,都会碰到很多不同的问题,这些问题涉及架构.模块组合.界面处理.共同部分抽象等方面,我们这里以Winform开发为例,从系统模块化.界面组件选择.业务模块场景划分.界面基类和辅 ...