自定义注解和aop面向切面编程

### **自定义注解**

```java
@Target(ElementType.注解类型)

@Retention(RetentionPolicy.生效时间)

public @interface Mylog{

}
```



###使用示例:将注解打在想要监听的切面

@Mylog

public void play(){

}





### AOP面向切面编程

```java
@Component
@Aspect
@Slf4j
@Order(10)  //优先级,默认int最大值,值越小优先级越高
public class MyAspect {

    //切点
//    返回值类型 包名.类名.方法名(参数名)
    //*匹配任意参数  ..表示多级参数
    @Pointcut("@annotation(com.health.annotation.Mylog) &&execution(* com.health.service.impl.*.findById(..))")
     //上列代码为匹配com.health.service.impl包下所有类且打上了指定注解的findById方法
    public void pt() {}


    //    2、前置通知
//            在方法开始前执行
    @Before("pt()")
    public void beforeMethod(JoinPoint joinPoint) {//aspect的joinPoint类型
        Signature signature = joinPoint.getSignature();//获取签名
        String name1 = signature.getDeclaringType().getName();//包名.类名
        String name = signature.getName();//方法名
        String argString="";
        Object[] args = joinPoint.getArgs();
        if (args!=null&&args.length>0){
            argString = Arrays.toString(args);//实参
        }
        System.out.println("方法名:"+name);
        System.out.println("实参:"+argString);
        System.out.println("全限定方法名:"+name1+"."+name);
        log.warn("方法开始执行了--->");
    }


    //3、后置通知
//    在方法执行后执行,无论方法是否正常执行,都会执行
    @After("pt()")
    public void afterMethod() {
        log.warn("方法执行结束了--->");
    }

    //4、返回通知
//            在方法正常结束后执行
    @AfterReturning(value = "pt()", returning = "obj")
    public Object afterReturningMethod(Object obj) {
        log.warn("方法正常执行结束了,返回值为:{}" + obj);
        return obj;
    }

    //5、异常通知
    //在方法出异常时执行
    @AfterThrowing(value = "pt()", throwing = "ex")
    public void afterThrowingMethod(Exception ex) {
        log.warn("方法出异常执行了,异常信息为:{}", ex);
    }
‘
    //6、全局通知
      @Around("pt()")
    public Object aroundMethod(ProceedingJoinPoint pjp){
        try {
            long start =System.currentTimeMillis();
            Object result = pjp.proceed();
            long end =System.currentTimeMillis();
            System.out.println("方法执行了"+(end-start)+"ms");
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("方法出异常了,异常信息为"+e.getMessage());
        }finally {
            System.out.println("方法执行结束了");
        }
        return  null;
    }
    

}
```









































评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值