前言
我們在做開發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;
}
注解的松耦合性給編程帶來了極大的便利。