自定義注解類型和常用場景
可以參考之前的文章 :
ElementType.FIELD字段級注解聲明
如果在項目中,多處地方都需調用到同一個方法進行邏輯處理,且與方法的業務邏輯無關,比如監控,日志等,則可用自定義的方法來實現,使得代碼更加簡潔、易于維護,提高可讀性。
METHOD-自定義方法注解完整步驟
1.定義一個自定義的METHOD注解(可以帶參數和不帶參數)
2.針對該注解,創建一個切面類,進行邏輯處理
3.如何作用在不同方法上
自定義METHOD注解
@Target(ElementType.METHOD)表示該定義作用在類的方法上。
package com.power.aspect.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自定義日志注解,傳入參數value
public @interface PowerLog {String value();
}
創建對應的切面類
切面類針對自定義PowerLog注解進行邏輯處理,AOP(面向切面編程)的一種實現,@Around環繞通知,表示在目標方法前后進行額外操作,其他相關內容可以去查看AOP的官方說明。
@Slf4j
@Component
@Aspect
public class PowerLogAspect {@AutowiredLogUtil logUtil;//定義切點,所有使用到@PowerLog的地方,都會被該切面類監控到,并進行處理//@annotation(powerLog) 中的參數需要跟point(PowerLog powerLog)定義的名稱一模一樣,目前這個都是小寫的。@Pointcut("@annotation(com.power.aspect.annotation.PowerLog) && @annotation(powerLog)")public void point(PowerLog powerLog) {}//環繞通知:@Around注解用于在目標方法前后進行額外操作。通過使用該注解可以對目標方法進行包裝或者修改其行為。@Around("point(powerLog)")public Object aroundPower(ProceedingJoinPoint point, PowerLog powerLog) throws Throwable {//powerLog注解的value參數值String value = powerLog.value();//1.目前方法之前調用log.info("調用時間1:"+new Date());//2.目標方法調用 Object response = point.proceed();//3.目前方法之后調用,比如記錄方法調用日志記錄log.info("調用時間2:"+new Date());try {//自定義日志工具類,下面三個參數對應:value日志類型,方法輸入對象,返回對象 logUtil.log(value, JSONObject.toJSONString(point.getArgs()), JSONObject.toJSONString(response));} catch (Exception e) {log.error("添加日志報錯", e);}return response;}
}
實際調用演示
兩個方法都使用了@PowerLog 注解,所有調用方法的操作都會觸發注解對應的切面類邏輯,并根據value的參數值(“login”,“logout”)來記錄對應的日志。
@RestController
@Slf4j
public class LoginController {@Override@PowerLog("login")public String loginUser(UserDto userDto) {//登錄的邏輯return "";}@PowerLog("logout")public String logoutUser(UserDto userDto) {//登出的邏輯return "";}
}