java import 自定义_java自定义注解

使用场景

面向切面,记录service方法运行时间。

定义注解类 TimeMonitor

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

import java.lang.annotation.ElementType;

import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface TimeMonitor {

}

创建切面配置类 MonitorAspect

@Aspect:作用是把当前类标识为一个切面供容器读取

@Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。

@Around:环绕增强,相当于MethodInterceptor

@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行

@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有

@AfterThrowing:异常抛出增强,相当于ThrowsAdvice

@After: final增强,不管是抛出异常或者正常退出都会执行

import java.util.Arrays;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class MonitorAspect {

private static final Logger logger = LoggerFactory.getLogger(MonitorAspect.class);

// 修正Timer注解的全局唯一限定符

@Pointcut("@annotation(com.kxb.microservice.inter.TimeMonitor)")

private void pointcut() {

}

@Around("pointcut()")

public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

// 获取目标Logger

// 获取目标类名称

String clazzName = joinPoint.getTarget().getClass().getName();

// 获取目标类方法名称

String methodName = joinPoint.getSignature().getName();

long start = System.currentTimeMillis();

logger.error("{}: {}: start...", clazzName, methodName);

String targetMethodParams = Arrays.toString(joinPoint.getArgs());

// 调用目标方法

Object result = joinPoint.proceed();

long time = System.currentTimeMillis() - start;

logger.error("{}: {}: {}: end... cost time: {} ms", clazzName, methodName, targetMethodParams, time);

return result;

}

}

在service类的方法上加上注解@TimeMonitor

执行此方法之后打印出运行时间

public class ConsumerService {

@TimeMonitor

public Map execute(String text) {

Map dealResult = null;

String uuid = PubFun.getUUID(); // 标记整条流程数据

try {

logger.info("分发器接收入口ActiveMq 接受队列信息text:{}...uuid:{}", text, uuid);

ObjectMapper mapper = new ObjectMapper();

Map param = mapper.readValue(text, HashMap.class);

param.put(Constant.MSG_TEXT, text);

// 执行代码

} catch (Exception e) {

logger.error("异常:{}", e);

}

return dealResult;

}

}

运行日志如下:

397201799879f37bb82c8259c8890adb.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值