• Java自定义注解使用和详解


    前言

    我们在做开发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;
    	}
    

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

  • 相关阅读:
    284. Peeking Iterator
    283. Move Zeroes
    282. Expression Add Operators
    281. Zigzag Iterator
    280. Wiggle Sort
    279. Perfect Squares
    python 正则匹配替换,在匹配的字符后方添加新的字符
    odoo default_get 方法和onchange装饰器造成冲突,
    redmine 如何启用用户图标
    odoo 打印执行的sql语句
  • 原文地址:https://www.cnblogs.com/kenx/p/15149409.html
Copyright © 2020-2023  润新知