Spring基于@AspectJ和Schema的AOP
2016/6/21 13:08:12 seventeenWen
AspectJ的用法
public interface Waiter {
void greetTo(String name);
void serveTo(String name);
}
public class NativeWaiter implements Waiter{
public void greetTo(String name) {
System.out.println("NativeWaiter greetTo"+name);
}
public void serveTo(String name) {
System.out.println("NativeWaiter serveTo"+name);
}
}
@Aspect
public class PreGreetAspectJ {
@Before("execution(* greetTo(..))")
public void beforeGreeting(){
System.out.println("你好! ");
}
}
public class AspectJProxyTest {
public static void main(String[] args) {
Waiter target =new NativeWaiter();
AspectJProxyFactory factory =new AspectJProxyFactory();
factory.setTarget(target);
factory.addAspect(PreGreetAspectJ.class);
Waiter proxy =factory.getProxy();
proxy.serveTo("seventeenWen");
proxy.greetTo("seventeenWen");
}
}
NativeWaiter serveToseventeenWen
你好!
NativeWaiter greetToseventeenWen
通过配置文件配置AspectJ切面
- 自动为使用了@AspectJ的类创建代理,它有一个属性proxy-target-class=”false”使用了JDK动态代理技术,true使用CGLib动态代理技术
@AspectJ注解语法
AspectJ切点表达式:关键字+操作参数
Spring支持AspectJ的九个切点表达式函数,分为四个类型:
- 方法切点函数:描述目标类方法信息定义
- 方法入参切点函数:描述目标类方法入参的信息定义
- 目标类切点函数:描述目标类类型信息定义
- 代理类切点函数:描述目标类的代理类饿信息定义
类名
类别 | 函数 | 入参 | 说明 |
方法切点函数 | execution() | 方法匹配模式串 | 满足某一匹配模式的所有目标类方法连接点 |
@annotation() | 方法注解类名 | 表示标注了特定的注解的目标方法的连接点 | |
方法入参切点函数 | args() | 通过判别目标类方法运行时入参对象的类型定义连接点 | |
@args() | 类型注解类名 | 通过判别目标方法运行时入参对象的类是否标注特定的注解 | |
目标切点函数 | within() | 类型匹配串 | 表示特定域下的所有连接点 |
target() | 类名 | 假如目标类按类型匹配于指定类,则目标类的所有连接点匹配这个切点 | |
@within() | 类型注解类名 | 类型注解类名 | 目标类标注了特定注解,则目标类所有连接点匹配该切点(包括实现类) |
目标类切点函数 | @target() | 类型注解类名 | 目标类标注了特定注解,则目标类所有连接点匹配该切点 |
代理类切点函数 | this() | 类名 |
AspectJ的通配符
- *:匹配任意字符,但只能匹配上下文的一个元素
- ..:匹配任意字符,可以匹配上下文的多个元素,表示类时必须和*一起使用,表示入参是则单独使用
- +:表示按类型匹配的所有类,必须跟在类名后面,代表匹配类的继承和扩展指定类的所有类,同时还包括自己本身。
AspectJ的逻辑运算符
- &&:与操作符,相当于切点的交集运算,如果在XML文件中配置,可以使用&的转义字符&代替,或者使用Spring提供的“and”,
- ||:或操作符,相当于切点的并集运算,等效于“or”
- !:非操作符,相当于切点的反集运算,等效于“not”
在操作符前后加空格
AspectJ的增强注解
@Before
前置增强,等于BeforeAdvice的功能
- value:定义切点
- argNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开
@AfterReturning
后置增强,等于AfterReturningAdvice
- value:定义切点
- pointcut:表示切点的信息,如果指定,将覆盖value
- returning:将目标对象的返回值绑定给增强的方法
- argsNames:Java的反射无法获得方法的入参名,所以必须通过注解标注增强方法的参数名,多个参数间用逗号隔开
@Around
环绕增强:等于MethodInterceptor
- value:定义切点
- argsNames:
@AfterThrowing
抛出增强,等于ThrowsAdvice
- value:定义切点
- pointcut:
- throwing:将抛出的异常绑定到增强方法上
- argsNames:
@After
Final增强,不管是抛出异常还是正常退出,都会执行
- value:
- argsNames:
@DeclareParents
引介增强,等于IntroductionInterceptor
value:
deaultImpl:默认的接口实现