简单粗暴的切面实战

切点

(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("执行业务");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值