Java自定义注解使用和详解

kenx
• 阅读 1428

前言

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

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

自定义注解

  1. 注解的定义修饰符为@interface
  2. 注解中可以添加成员变量,成员变量以方法的形式定义
  3. 需要使用@Retention注解来规定它的生命周期(编译期间、运行时等)
  4. 需要使用@Target注解来规定它的适用范围(类型、方法、字段、方法参数等)
package cn.soboys.kmall.common.annotation;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER ,ElementType.TYPE,ElementType.FIELD})
@Documented
@Inherited
public @interface SysLog {

    String value() default "";
    String message();
    String[] names() default {};
}
  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
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

    String value() default "";
}
  1. 定义日志拦截切面 SysLogAspect ,解析带有SysLog注解的controller
@Around("@annotation(sysLog)")
    public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable {
        long beginTime = SystemClock.now();
        //执行方法
        Object result = joinPoint.proceed();
        //执行时长(毫秒)
        long time = SystemClock.now() - beginTime;


        SysLog sysLogEntity = new SysLog();
        if(sysLog != null){
            //注解上的描述
            sysLogEntity.setOperation(sysLog.value());
        }

        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        sysLogEntity.setMethod(className + "." + methodName + "()");

        //请求的参数
        Object[] args = joinPoint.getArgs();
        String params = Json.toJsonString(args[0]);
        sysLogEntity.setParams(params);

        //设置IP地址
        sysLogEntity.setIp(IPHelper.getIpAddr());

        //用户名
        String username = SecurityUtils.getSysUser().getUsername();
        sysLogEntity.setUsername(username);

        sysLogEntity.setTime(time);
        sysLogEntity.setCreateDate(new Date());
        //保存系统日志
        sysLogService.save(sysLogEntity);


        return result;
    }

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

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java mvc 新趋势——从运行期间类扫描到编译期间
简介今天我要讲解的是主角是AnnotationProcessor,她不是什么新技术jdk1.6就存在了。AnnotationProcessor是javac的一个工具,它用来在编译时扫描和处理注解。通过AnnotationProcessor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
lucien-ma lucien-ma
3年前
注解和反射
注解和反射1.注解1.1什么是注解?注解和注释的差别在于注解可以被其他程序读取1.2内置注解@Override定义在java.lang.Override中,表示一个方法声明打算重写超类中的另一个方法声明@Deprecated定义在java.lang.Deprecated中,此注解可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的
Easter79 Easter79
3年前
Springboot中如何在Utils类中使用@Autowired注入bean
Springboot中如果希望在Utils工具类中,使用到我们已经定义过的Dao层或者Service层Bean,可以如下编写Utils类:1\.使用@Component注解标记工具类StatisticsUtils:2\.使用@Autowired(@Autowired和@Resource的区别不再介绍)注入我们需要的bean:3\.在工具类中
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java 注解
概述注解时在Java5中开始引入的概念。可以将注解想象成标签,给指定的方法、类、变量、参数、包等贴上一个标签。!Java注解(https://oscimg.oschina.net/oscnet/6503c7a6ffdfc128c47635d91220373e1af.jpg)@Override注解就是告诉编译器,这个方法是重写的父类方
Wesley13 Wesley13
3年前
Java Annotation详解 理解和使用Annotation
系统中用到了java注解:查了一下如何使用注解,到底注解是什么;(1)创建方法:MsgTraceJavaClass在CreateNewClass中:name:输入MsgTrace;Kind:Annotation;就可以了;public@interfaceMsgTrace{String
Stella981 Stella981
3年前
Spring Security使用详解10(通过注解配置方法安全)
在之前的文章样例中,认证和授权都是基于URL的。开发者也可以通过注解来灵活地配置方法安全,下面通过样例进行演示。 十、通过注解配置方法安全1、样例代码(1)首先我们要通过@EnableGlobalMethodSecurity注解开启基于注解的安全配置:@EnableGlobalMethodSecurity注解参
京东云开发者 京东云开发者
5个月前
警惕!自定义注解使用不当的排查实录
一、引言大家好,在日常开发过程中,Java注解(Annotation)是开发中经常使用的一个手段,用于给代码添加元数据的标记。它们可以提供代码额外的信息,这些信息可以在编译时或运行时被访问。注解不会改变代码的执行逻辑,但可以被编译器、JVM或框架等工具用于