为了账号安全,请及时绑定邮箱和手机立即绑定

【金秋打卡】第12天 AOP通知

标签:
Spring

课程信息

  • 学习课程:Java工程师2022版
  • 章节名称:Spring AOP面向切面编程-AOP通知
  • 讲师:悟空

课程内容

五种通知类型决定执行切面方法的时间。前四种不常用但是面试常考,最后一种常用常考!

1.Before Advice —— 前置通知,目标方法运行前执行

2.After Returning Advice —— 返回后通知,目标方法执行成功返回数据后执行

3.After Throwing Advice —— 异常通知,目标方法抛出异常后执行

4.After Advice —— 后置通知,目标方法运行后不管有没有异常都会执行切面方法,所以无法获取目标方法返回值也不知道是否产生了异常

5.Around Advice —— 最强大通知,自定义通知执行时机,可决定目标方法是否运行(学习重点)

  • 后置通知和返回后通知最大的区别是,返回后通知可以接收目标方法的返回值。

  • 后置通知和返回后通知的执行顺序是由配置时的顺序所决定的。

After Returning Advice和After Throwing Advice这两种异常是互斥了,一次只能执行其中一种方法。

After Returning(返回后通知)、After Throwing(抛出异常后执行)和After (后置通知),三者的关系类似与try。。。catch。。。finally的关系。After Advice会在目标方法执行之后(不管有没有异常)执行。

后置通知和返回后通知(或异常通知)的执行先后顺序与xml文件配置的先后顺序一致。

特殊的”通知”,作用在类上,对类进行动态调整。(日常开发很少用,了解即可)

特殊的”通知”-引介增强

引介增强是对类的增强而非方法

引介增强允许在运行时为目标类增加新属性或方法

引介增强允许在运行时改变类的行为,让类随运行环境动态变更

环绕通知的使用方法(区别其他的通知):

方法声明要返回 Object

方法参数写“ProceedingJoinPoint”(是JoinPoint的升级版,在原有功能外,还可以控制目标方法是否执行)

执行目标方法:Object ret = pjp**.proceed();**

配置上区别仅仅是通知的名字,写成“around”

<!-- AOP配置 -->
<bean id="methodAspect" class="com.imooc.spring.aop.aspect.MethodAspect"></bean>
<aop:config>
<!--   PointCut 切点,使用execution表达式描述切面的作用范围 -->
<!--   excution(public * com.imooc..*.*(..))说明切面作用在com.imooc包下的所有类的所有方法上 -->
  <aop:pointcut id="pointcut" expression="excution(public * com.imooc..*.*(..))"></aop>
<!--     定义切面类 -->
    <aop:aspect ref="methodAspect">
<!--      环绕通知 -->
      <aop:around method="check" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>
public class MethodChecker {
    //ProceedingJoinPoint是JoinPoint的升级版,在原有功能外,还可以控制目标方法是否执行
    public Object check(ProceedingJoinPoint pjp) throws Throwable{
        try{
            long startTime = new Date().getTime();
            Object ret = pjp.proceed();//执行目标方法
            long endTime = new Date().getTime();
            long duration = endTime - startTime;//执行时长
            if(duration >= 1000 ){
                String className = pjp.getTarget().getClass().getName();
                String methodName = pjp.getSignature().getName();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String now = sdf.format(new Date());
                System.out.println("===" + now + ":" + className + "." + methodName);
            }
            return ret;
        }catch(Throwable throwable){
            System.out.println("Exception message:" + throwable.getMessage());
            throw throwable;
        }
    }
}

学习收获

学习了Spring Aop的五种通知,以及环绕通知的详细例子解释

打卡截图

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
0
获赞与收藏
0

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消