@Pointcut:定义切点
如:
@Pointcut("execution(* spider.ungeturl.*(..))")
则该切点会拦截在包spider下的类ungeturl中所有的方法
@Before:前advice
@Before("pointcut()")
该声明的意思是这个advice会在切点pointcut()拦截的方法执行前执行
@Afterthrowing:抛出异常advice
@Afterthrowing(pointcut="pointcut()",throwing="ret")public void ex(Object ret)
这个advice会在抛出异常后执行,并将抛出的异常传给advice。这里throwing的值要对应于advice中的某个参数名,这样这个值才能被传给advice
@Around:可以理解成环绕advice吧
@Around("pointcut()")public Object deal(ProceedingJoinPoint pjp,...)
around要注意的一点就是,其advice的形参列表必须以ProceedingJoinPoint开始。这个类可以看做是当前的Join Point,其下有很多有用的方法,可以获取当前Join Point的许多有关数据。
获取Join Point的传入参数:
@After("logPointCut() && args(stream,url,fileName)") public void addLog(InputStream stream,String url,int fileName)
改变Join Point的返回值:
@Around("anyMethod()") public Object addLog(ProceedingJoinPoint j)throws Throwable{ System.out.println("----in addLog method----"); System.out.println("===checkSecurity==="+j.getSignature().getName()); System.out.println("===change the return arg values==="); Object object = j.proceed(); object = "Jessica 1989-03-14"; return object;
这里最好建议在IDE下开发,因为IDE特有的提示功能可以对不熟悉的类进行提示,帮助人迅速上手