自定义注解类型和常用场景
可以参考之前的文章 :
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 "";}
}