@AspectJ使用注解来描述切点和增强
Spring在处理@AspectJ注释表达式的时候,需要将asm模块添加到类路径中。asm是轻量级的字节码处理框架,因为java的反射机制无法获取入参名,Spring就
使用asm来处理入参名。
此外spring采用AspectJ提供的@AspectJ注释类库以及相应的解析类库,将ivy-cache/repository目录下的aspectj.weaver和aspectj.tools类包加入到类路>径下。
一个简单例子:
@Before:前置增强,两个成员:value(用于定义切点)、argNames(增强方法的参数名)
@AfterReturning:后置增强,四个成员:value(定义切点)、pointcut(表示切点的信息)、returning(目标对象的返回值绑定给增强方法)、argNames(增强方法参数名)
@Around:环绕增强,两个成员:value、argNames
@AfterThrowing:抛出增强,四个成员:value、argNames、throwing、pointcut
@After:Final增强,不管是抛出异常还是正常退出,该增强都会得到执行。两个成员:value、argNames
@DeclareParants:引介增强,两个成员:value、defaultImpl(默认的接口实现)
Spring在处理@AspectJ注释表达式的时候,需要将asm模块添加到类路径中。asm是轻量级的字节码处理框架,因为java的反射机制无法获取入参名,Spring就
使用asm来处理入参名。
此外spring采用AspectJ提供的@AspectJ注释类库以及相应的解析类库,将ivy-cache/repository目录下的aspectj.weaver和aspectj.tools类包加入到类路>径下。
一个简单例子:
package com.baobaotao;
public class NaiveWaiter implements Waiter{
public void greetTo(String client){
System.out.println("NaiveWaiter:greet to"+clientName+"...");
}
public void serveTo(String clientName){
System.out.println("NaiveWaiter:serving"+clientName+"...");
}
}
下面我们使用@AspectJ注解定义一个切面:
package com.baobaotao.aspectj.aspectj;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@AspectJ//通过该注释将PreGreetingAspect标识为一个切面
public class PreGreetingAspect{
@Before("execution(* greetTo(..))")//横切点和增强类型
public void beforeGreeting(){//横切增强逻辑
System.out.println("How are you!");
}
}
下面我们通过org.springframework.aop.aspectj.annotation.AspectProxyFactory为NaiveWaiter生成织入PreGreetingAspect切面的代理:
package com.baobaotao.aspectj.example;
import org.springframework.aop.aspectj.annotation.AspectProxyFactory;
import com.baobaotao.NaiveWaiter;
import com.baobaotao.Waiter;
public class AspectJProxyTest{
Waiter target=new NaiveWiater();
AspectJProxyFactory factory=new AspectJProxyFactory();
factory.setTarget(target);
Waiter proxy=factory.getProxy();
proxy.greetTo("John");
proxy.greetTo("John");
}
@AspectJ为各种的增强类型提供了不同的注解类,他们位于org.aspectj.lang.annotation.*包中:
@Before:前置增强,两个成员:value(用于定义切点)、argNames(增强方法的参数名)
@AfterReturning:后置增强,四个成员:value(定义切点)、pointcut(表示切点的信息)、returning(目标对象的返回值绑定给增强方法)、argNames(增强方法参数名)
@Around:环绕增强,两个成员:value、argNames
@AfterThrowing:抛出增强,四个成员:value、argNames、throwing、pointcut
@After:Final增强,不管是抛出异常还是正常退出,该增强都会得到执行。两个成员:value、argNames
@DeclareParants:引介增强,两个成员:value、defaultImpl(默认的接口实现)