Spring AOP 和 AspectJ

本文详细介绍了如何在Spring中使用AspectJ注解,包括启用支持、通知优先级、切入点表达式等。讨论了如何在Bean中引入行为,解决多类共享行为的问题,以及动态实现接口。此外,还提到了加载时织入aspect的概念,用于增强Spring AOP的灵活性。
摘要由CSDN通过智能技术生成

在本节将学习Spring AOP的用法和一些高级的AOP主题,如通知优先权(Advice precedence)和引入(Introduction)

使用Spring AOP的核心实现技术在所有版本中都一样:动态代理;因为AspectJ已经成长为一个完整流行的AOP框架,Spring在其AOP框架中支持使用AspectJ注解编写POJO aspect。但是在Spring AOP中使用AspectJ aspect有一些限制,因为Spring只允许aspect应用到IOC容器中申明的Bean。如果你希望这个范围之外的应用aspect,就必须使用AspectJ款那个价。

启用Spring的AspectJ注解支持

在Bean配置文件中定义<aop:aspectj-autoproxy/> 他讲自动为匹配AspectJ aspect的Bean创建代理。

用Aspect注解编写的aspect只是一个带有@Aspect注解的Java类。通知(Advice)是带有一个通知注解的简单简单Java方法。AspectJ支持5种通知注解:@Before、@After、@AfterReturning、@AfterThrowing和@Around。

前置通知

切入点匹配的执行点称为连接点(JoinPoint),切入点是匹配一组连接点的表达式,而通知是特定连接点采取的行动。

最终通知

后置通知(after advice)在连接点结束之后执行,不管返回结果还是抛出异常。一个aspect可以包含一个或多个通知。

后置通知

最终通知不管连接点正常返回还是抛出异常都执行,如果希望仅当连接点返回时记录,应该用后置通知(after returning advice)替换最终通知。在后置通知(@AfterReturning)注解中添加一个returning属性,访问连接点返回值。然后,你必须用这个名称通知方法的签名中添加一个参数,在运行时,Spring AOP通过这个参数传入返回值,注意切入点表达式要在pointcut属性中表现。

    @AfterReturning(pointcut = "execution(* Arithmeticalculator.add(..))",
            returning = "result")
    public void logAfterReturning(JoinPoint joinPoint,Object result){
        log.info(joinPoint.getSignature().getName()+"() ends with "+result);
    }

异常通知

@AfterThrowing,当且仅当连接点抛出异常时执行。可通过throwing属性来访问。Throwable类型是Java语言只能怪所有错误和异常的超类。

环绕通知

around advice,是所有通知类型中最强大的。它获得连接点的完全控制,这样可以在一个通知总组合的使用前面的所有行为,甚至可以控制合适以及是否继续原来的连接点执行。注意,对于环绕通知,连接点参数类型必须是ProceedingJoinPoint。这是JoinPoint的一个子接口,允许你控制何时继续原始连接点。

    @Around("execution(* *.*(..))")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        //do something
        Object result = joinPoint.proceed();
        log.info("The method "+joinPoint.getSignature().getName()+"() ends with "+result);
        return result;
    }

环绕通知类型非常强大和灵活,甚至可以修改原始参数值和最后返回值。你必须非常小心的使用这一通知,因为很容易忘记继续原始的连接点

访问连接点信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值