spring自定义注解之-ElementType.METHOD方法级注解声明

自定义注解类型和常用场景

可以参考之前的文章 :
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 {

    @Autowired
    LogUtil 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 "";
    }
}
  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值