Java自定义注解使用和详解

前言

我们在做开发springboot 项目时候会遇到各种各样注解,使用各种各样注解,极大的简便了我们开发流程,方式,从JDK5开始支持 注解是Java语言的一种强大的功能

可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取、执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息

自定义注解

  1. 注解的定义修饰符为@interface
  2. 注解中可以添加成员变量,成员变量以方法的形式定义
  3. 需要使用@Retention注解来规定它的生命周期(编译期间、运行时等)
  4. 需要使用@Target注解来规定它的适用范围(类型、方法、字段、方法参数等)
1package cn.soboys.kmall.common.annotation; 2 3import java.lang.annotation.*; 4 5@Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER ,ElementType.TYPE,ElementType.FIELD}) 6@Documented 7@Inherited 8public @interface SysLog { 9 10 String value() default ""; 11 String message(); 12 String[] names() default {}; 13}
  1. @Inherited注解规定了这个自定义注解是可以被继承的
  2. 注解定义中 String value() 通过方法的方式定义了注解的成员变量value默认key 通过default定义默认值
  3. 注解定义中 String message(); String[] names(); 通过方法的方式定义了注解的成员变量message和names,其中names为String数组

支持参数有

  1. 基本类型:byte, short, char, int, long, float, double
  2. String
  3. Class
  4. enum
  5. Annotation

在具体使用的时候 通过反射找到添加该注解的类、方法或属性,然后根据注解中的字段取值判断该类或方法是否符合标准 然后在处理自己的相关业务逻辑

实列使用场景

一般结合Aop来使用 这里通过后台日志记录作为使用场景 这里关于aop 使用请参考我前面的文章写的和详细

  1. 定义自定义注解 SysLog
1@Target(ElementType.METHOD) 2@Retention(RetentionPolicy.RUNTIME) 3@Documented 4public @interface SysLog { 5 6 String value() default ""; 7}
  1. 定义日志拦截切面 SysLogAspect ,解析带有SysLog注解的controller
1@Around("@annotation(sysLog)") 2 public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable { 3 long beginTime = SystemClock.now(); 4 //执行方法 5 Object result = joinPoint.proceed(); 6 //执行时长(毫秒) 7 long time = SystemClock.now() - beginTime; 8 9 10 SysLog sysLogEntity = new SysLog(); 11 if(sysLog != null){ 12 //注解上的描述 13 sysLogEntity.setOperation(sysLog.value()); 14 } 15 16 //请求的方法名 17 String className = joinPoint.getTarget().getClass().getName(); 18 String methodName = joinPoint.getSignature().getName(); 19 sysLogEntity.setMethod(className + "." + methodName + "()"); 20 21 //请求的参数 22 Object[] args = joinPoint.getArgs(); 23 String params = Json.toJsonString(args[0]); 24 sysLogEntity.setParams(params); 25 26 //设置IP地址 27 sysLogEntity.setIp(IPHelper.getIpAddr()); 28 29 //用户名 30 String username = SecurityUtils.getSysUser().getUsername(); 31 sysLogEntity.setUsername(username); 32 33 sysLogEntity.setTime(time); 34 sysLogEntity.setCreateDate(new Date()); 35 //保存系统日志 36 sysLogService.save(sysLogEntity); 37 38 39 return result; 40 }

注解的松耦合性给编程带来了极大的便利。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

java mvc 新趋势——从运行期间类扫描到编译期间

简介今天我要讲解的是主角是AnnotationProcessor,她不是什么新技术jdk1.6就存在了。AnnotationProcessor是javac的一个工具,它用来在编译时扫描和处理注解。通过AnnotationProcessor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

注解和反射

注解和反射1.注解1.1什么是注解?注解和注释的差别在于注解可以被其他程序读取1.2内置注解@Override定义在java.lang.Override中,表示一个方法声明打算重写超类中的另一个方法声明@Deprecated定义在java.lang.Deprecated中,此注解可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的

Springboot中如何在Utils类中使用@Autowired注入bean

Springboot中如果希望在Utils工具类中,使用到我们已经定义过的Dao层或者Service层Bean,可以如下编写Utils类:1\.使用@Component注解标记工具类StatisticsUtils:2\.使用@Autowired(@Autowired和@Resource的区别不再介绍)注入我们需要的bean:3\.在工具类中