spring-5-注解方式生成切面

2020-06-22  本文已影响0人  blank_white
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <bean id="serverAspect" class="com.spyouth.service.AspectServer"></bean>
package com.spyouth.service;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;


//表明此类是一个注解类
@Aspect
public class AspectServer {

    // value 值为切入点,用 execution 表达式表示,
    // execution 写法搜索 execution 表达式

    //以方法名标记一种切入点
    @Pointcut(value = "execution(* com..*.do*())")
    public void cutPoint(){}

    //方法的名字自定义,参数列表自定义
    @Before(value = "execution(* com..*.do*())")
    public void before(JoinPoint jp){
        System.out.println("Aspect before");

        //方法的参数如果设置了 JoinPoint ,则可以通过此变量获取关于切入点的一些属性
        jp.getSignature();
        jp.getSignature().getName();
        jp.getArgs();
    }

    //在方法执行前后都可以,和 jdk 动态代理的 invoke 方法相似
    //
    @Around(value = "cutPoint()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("Aspect around before");
        //执行切入点方法,和 invoke 方法中的 method.invoke 类似
        //若果不加这句话,就不会执行切入点了
        Object o=pjp.proceed();
        System.out.println("Aspect around after");

        // o= "改变了";
        // 能更改切入点的返回值

        return o;
    }

    //在切入点返回后执行
    //切入点也可以用函数名,前提是前面的那个把函数名作为切入点 id 了
    @AfterReturning(value = "cutPoint()",returning = "result")
    public void afterReturn(Object result){
        System.out.println("Aspect after returning");

        //是把切入点的返回值赋给了 Object result
        //所以修改 result 并不能修改 切入点的返回值
        //但如果 result 引用类型,result 和 切入点返回值,都指向的是相同的对象
        //则可以通过如 result.setName() result.name="xxxx" 改变对象的成员值
    }



    //在切入点执行出现异常时,相当于 catch 中
    @AfterThrowing(value = "cutPoint()",throwing = "ex")
    public void afterThrowing(Throwable ex){
        System.out.println("Aspect afterThrowing "+ex.getMessage());
    }

    //在切入点执行后,及时切入点 执行时出现异常,相当于 finally 中
    @After(value = "cutPoint()")
    public void after(){
        System.out.println("Aspect after ");
    }

}

上一篇 下一篇

猜你喜欢

热点阅读