欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring学习之AOP

程序员文章站 2022-05-24 23:44:51
...

1.AOP:面向切面编程。

在运行一个方法时,如果想在运行方法前后加入输出它的相关信息,如果直接将这些代码直接加进方法体中,会造成代码耦合,于是AOP应运而生,超级简洁。

2.第一步:导包,这一次无论使用eclipse还是idea都需要导包

Spring学习之AOP

第二步:为你创建的类(包括切面类)加必要的注释(如@Component),同时还需要在容器中注册;

第三步:为你创建的切面类加@Aspect告诉容器我是切面类,在切面类中写方法,在方法头前可加四种注释

@Before,在切向的方法执行前执行该方法。

@After,在切向的方法执行后执行该方法。

@AfterReturning,在切向的方法执行后返回值时执行该方法,执行在After之后。

@AfterThrowing,在切向的方法抛出异常时执行。

同时需要绑定你切向的方法,如下所示:

Spring学习之AOP

上述方法:在其他方法调用Claculator的div,会调用用该方法。

还能绑定多个切向方法,同样可以获得方法名和参数:

Spring学习之AOP

如果参数列表中是..可以匹配所有参数类型,*可以匹配一级文件目录;,,可以匹配多级。

如果想要方法的返回值,可以再@AfterReturn中获取,如下:

@AfterReturning(value = "execution(public int com.atguigu.bean.Calculator.div(..))",returning = "result")
    public void afterReturn(JoinPoint joinPoint, Object result){
        System.out.println("这里是返回值");
  }

4.当用户想便于修改,抽取方法时,可如下形式抽取:

Spring学习之AOP

随便定义一个空方法,注解Pointcut,在原方法中引用即可。

[email protected]注解

是上面四种注解的合体,与上面注解使用大致相同,在@Around()中携带ProceedingJoinPoint参数,同样可以获取参数,它类似过滤器一样,“它拦截方法后,需要用proceedingJoinPoint.proceed(args)来放行去运算,运算出来的结果再通过返回给调用的方法”,在你拦截之前,之后,抛出异常时,返回值时都可以添加自己的元素。

@Around("execution(public int com.atguigu.bean.Calculator.*(int,int))")
    public Object aroundTest(ProceedingJoinPoint proceedingJoinPoint) {
        Object[] args = proceedingJoinPoint.getArgs();
        System.out.println(Arrays.asList(args));
        Object proceed = null;
        try {
            //@Before
            proceed = proceedingJoinPoint.proceed(args);
            //AfterReturing
        } catch (Throwable throwable) {
            //AfterThrowing
        }finally {
            //After
        }
        return proceed;
    }

6.两个切面类同时切一个方法,按类名排序,同时可以注解order(n)指定排序,数越小优先级越大。