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