Java自定义注解使用和详解

222 阅读2分钟

前言

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

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

自定义注解

方法

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 {};
}

@Inherited 注解规定了这个自定义注解是可以被继承的 注解定义中 String value() 通过方法的方式定义了注解的成员变量value默认key通过default 定义默认值 注解定义中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 "";
}

2.定义日志拦截切面 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;
	}

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