前言
我们在做开发springboot 项目时候会遇到各种各样注解,使用各种各样注解,极大的简便了我们开发流程,方式,从JDK5开始支持 注解是Java
语言的一种强大的功能
可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取、执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息
自定义注解
- 注解的定义修饰符为@interface
- 注解中可以添加成员变量,成员变量以
方法
的形式定义 - 需要使用@Retention注解来规定它的生命周期(编译期间、运行时等)
- 需要使用@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 {};
}
-
@Inherited
注解规定了这个自定义注解是可以被继承的 - 注解定义中
String value()
通过方法的方式定义了注解的成员变量value默认key
通过default
定义默认值 - 注解定义中
String message(); String[] names();
通过方法
的方式定义了注解的成员变量message和names,其中names为String数组
支持参数有
- 基本类型:byte, short, char, int, long, float, double
- String
- Class
- enum
- Annotation
在具体使用
的时候 通过反射找到添加该注解的类、方法或属性,然后根据注解中的字段取值判断该类或方法是否符合标准 然后在处理自己的相关业务逻辑
实列使用场景
一般结合Aop
来使用 这里通过后台日志记录作为使用场景 这里关于aop 使用请参考我前面的文章写的和详细
- 定义自定义注解
SysLog
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
- 定义日志拦截切面 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;
}
注解的松耦合性给编程带来了极大的便利。