我们在做开发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数组支持参数有
在具体使用
的时候 通过反射找到添加该注解的类、方法或属性,然后根据注解中的字段取值判断该类或方法是否符合标准 然后在处理自己的相关业务逻辑
一般结合Aop
来使用 这里通过后台日志记录作为使用场景 这里关于aop 使用请参考我前面的文章写的和详细
SysLog
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLog { String value() default ""; }
@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; }
注解的松耦合性给编程带来了极大的便利。