课程信息
- 学习课程: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的五种通知,以及环绕通知的详细例子解释
打卡截图
共同学习,写下你的评论
评论加载中...
作者其他优质文章