乐清 网站建设,淄博网络宣传,上海房产网站建设,什么样的蓝色做网站做好看切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述式 第一种方法的本质是基于接口实现的动态代理(jdk) 第二种是基于cglib实现的动态代理
AOP切入点表达式 而需要加载多个切入点时#xff0c;不可能每个切入点都写一个切入点表达式 例子
下面的代理描述的是匹配… 切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述式 第一种方法的本质是基于接口实现的动态代理(jdk) 第二种是基于cglib实现的动态代理
AOP切入点表达式 而需要加载多个切入点时不可能每个切入点都写一个切入点表达式 例子
下面的代理描述的是匹配任意返回值的(第一个*) org.example包下的任意包下的任意以service结尾的类或接口下的以find开头的任意方法参数任意。
也就是给业务层下的所有查询方法加上AOP比如findByidfindAllfindBy... Pointcut(execution(* org.example.*.*service.find*(..)))public void pts(){} AOP通知类型 在目标对象中定义两个方法 在通知类中定义五个方法演示上面五种通知类型
package org.example.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;Component
Aspect
public class MyAdvice {/*Pointcut(execution(void org.example.dao.BookDao.save()))public void ptx(){}*/Pointcut(execution(void org.example.dao.BookDao.update()))public void pt(){}Pointcut(execution(int org.example.dao.BookDao.select()))public void pts(){}/* Before(pt())public void before(){System.out.println(before advice...);}*//* After(pt())public void after(){System.out.println(after advice...);}*/
/* Around(pts())public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println(before advice...);Object ret pjp.proceed();System.out.println(after advice...);return ret;}*//* AfterReturning(pts())public void afterReturning(){System.out.println(afterReturning advice...);}*/AfterThrowing(pts())public void afterThrowing(){System.out.println(afterThrowing advice...);}
}前置通知: 后置通知: 环绕通知(无返回值):
原始方法的输出直接被吞了 在这个通知中需要告诉它原始操作需要放在哪个位置下面的pjp.proceed()表示的就是对原始操作的调用。需要抛出一个异常
Around(pt())public void around(ProceedingJoinPoint pjp) throws Throwable {System.out.println(before advice...);pjp.proceed();System.out.println(after advice...);} 环绕通知(有返回值)
使用如图的环绕通知调用一个有返回值的方式时会报错。 原因是环绕通知的方法也要有返回值但是返回值类型应该写Object因为不能确定所有的原始方法返回值相同。
在下面的环绕通知中原始方法的reutrn被拦截了需要这个通知再进行return 上面这个才是标准写法不管返回值是不是void
返回后通知:
和上面的后置通知很像但是这个是在返回之后才通知如何在返回前有个异常导致没有正常返回就不会执行通知比如在select()中 输出如下 异常后通知:
只会在抛出异常后运行还是上面的1/0,输出如下