切点
(1) 使用注解方式标识切点 ,@annotation(自定注解类)
/**
* 自定义使用切面的注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AspectedMethod {
String code() default "";
String name() default "";
AspectType[] aspectTypes() default { AspectType.TIME };
/**
* 切面类型
*/
public static enum AspectType {
TIME;
}
}
(2)切点@Pointcut(“execution(* com.impl..*(..))”)
切面处理类
@Aspect
@Service("countTimeAspectd")
public class CountTimeAspectd {
protected final Logger logger = LoggerFactory.getLogger(getClass());
//1、@annotation(自定注解类)
//2、切点@Pointcut("execution(* com.impl..*(..))")
@Pointcut("@annotation(com.util.times.AspectedMethod)")
public void invoke() {
}
@Around("invoke()")
public Object countResposeTime(ProceedingJoinPoint pjp) throws Throwable {
//扫描注解
org.aspectj.lang.Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
AspectedMethod aspectedMethod = targetMethod.getAnnotation(AspectedMethod.class);
Object object = null;
//参数获取
Object[] args= pjp.getArgs();
if(args!=null && args.length>0){
//简单记录耗时处理
long reqTime = System.currentTimeMillis();
//业务方法前置处理
object = pjp.proceed(); //真正需要执行的业务方法
//业务方法后置处理
long rspTime = System.currentTimeMillis();
long cusTime = (rspTime-reqTime)/1000;
logger.info("耗时",cusTime);
} else {
//未找到参数
}
return object;
}
}
业务处理方法
//1、可以使用注解
//2、可以通过类路径
@AspectedMethod(name = "业务方法")
public void excuteService(){
System.out.println("执行业务");
}