标签:exe expr 需要 val 同比 normal aop throwable 根据
1.Aop底层实现
jdk动态代理+cglib代理
jdk:需要有一个接口,代理类与被代理类是兄弟关系,都继承子一个类
cglib:不需要接口,代理类与被代理类是父子关系,被代理类是父
静态代理:只能代理某一个接口的实现类
动态代理:可以代理任意实现类
2.切面的5种通知类型
@before 目标方法执行前执行
@after 目标方法执行后执行
@AfterReturning 目标方法执行成功后执行
@AfterThrowing 出现异常后执行
@Around 环绕通知
3.切入点表达式
@PointCut(value="execution( * *.*(..))")//第一个星代替了方法修饰符以及返回类型 ,第二个星代替了全类名,第三个*代替了方法名,(..)代替了方法参数
可以用逻辑运算符共同使用@PointCut(value="execution( * *.*(..))||execution( * *.*(..))")
4.根据通知获取方法信息
在通知上加入JoinPoint 参数
Signature signature = joinPoint.getSignature();
//获取方法参数
Object[] args = joinPoint.getArgs();
//获取方法名
String name = signature.getName();
获取目标方法的返回值:在返回通知上添加returning ="" 并且在方法上设置参数,类型为Object,参数名要与 returning的值一致
获取目标方法的异常信息:在异常通知上添加throwing="",并且在方法上设置参数,类型为Throwable,参数名要与 thorwing 的值一致
5.通知的底层原理
try {
try {
//前置通知
//目标方法
} finally {
//后置通知
}
//返回通知
} catch (Exception e) {
//异常通知
}
当有多个切面时,就是在目标方法出添加一组try{ try{} flnally{} }catch{} 块
切面执行顺序默认按照类名首字母的顺序,首字母相同比较第二个,可以在类上添加 Oreder注解设置优先顺序,值越小越先执行
6. 环绕通知
@Around(切入点表达式,如果不是一个类就要用全类名)
方法 :方法的返回值必须是Object且必须有返回值
7.xml配置Aop切面
(1) 配置spring容器
(2)配置Aop
<aop:config>
//配置切入点
<aop:pointcut expression="execution()" ></aop:pointcut >
//配置切面
<aop :aspect ref="" id="">
//5种通知
<aop:after method="After" pointcut-ref="pointcut" />
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after-returning method="AfterReturning" returning="result" pointcut-ref="pointcut" />// pointcut-ref 指向切入点、 returning 接收目标方法返回值,值要与目标方法参数名一致
<aop:after-throwing method="AfterThrowing" throwing="ex" pointcut-ref="pointcut"/> method:目标方法名 throwing接收目标方法的异常,值要与目标方法参数名一致
</aop:aspect>
</aop:config>
execution
标签:exe expr 需要 val 同比 normal aop throwable 根据
原文地址:https://www.cnblogs.com/sunners/p/12063615.html