Advisor:
切点:
实例
public class Test extentds DynamicMethodMatherPointcut{
private static List<String>specialClientList=new ArrayList<String>();
static{
specialClientList.add("tom");
specialClientList.add("lilei");
}
public ClassFileter getClassFileter(){
return new ClassFileter(){
public boolean matches(Class clazz){
System.out.println("调用getClassFilter()对"+clazz.getName()+"做静态检查");
return Waiter.class.isAssignableForm(clazz);
}
};
}
public boolean matches(Method method,Class clazz){
System.out.println("对"+method.getName()+"做静态检查");
return "greeTo".equals(method.getName());
}
public boolean mathes(Method method,Class clazz,Object[] args){ //对连接点入参绑定
System.out.println("对"+method.getName()+"做动态检查");
String clientName=(String)args[0];
return specialClientList.contains(clientName);
}
}
切面 (applicationContext.xml文件的配置):
<bean id="advisor">
<property name="pointcut"><ref local="pointcut"/></property>
<property name="advice"><ref local="advice"/></property>
</bean>
<bean id="advice" class="TestMethodBeforeAdivce"/>
<bean id="pointcut" class="..Test"/>
@AspectJ
切点:支持AspectJ切点表达式语法,可以通过@Pointcut注解定义命名切点
切点写法: @切面类型("切点函数(切点表达式)")
切面:带有切点注解方法的类组成
常见的切面类型:@Bfore @AfterReturnint @Around @AfterThrowing @After @DeclareParents
常见的切点函数: @annotation() execution() args() @args() within()@within() @target() target() this()
连接点方法入参绑定:1) 可以通过JoinPoint,ProceedingJoinPoint连接对象 2)使用切点函数指定参数名绑定
连接点方法返回值: 1)在后置增强中,使用@AfterReturning的returning成员绑定方法返回值
<aop:aspect>
切点:通过<aop:pointcut id="a" expression="切点表达式"/><aop:before method="" pointcut-ref="a"/>
或者<aop:before method="" pointcut="切点表达式">
切面:
<aop:config>
<aop:aspect ref="增强类">
<aop:before method="增强类中的特定方法" pointcut="切点表达式"/>
<aop:aspect/>
</aop:config>
<aop:advisor>
切点:通过aop:advisor 的pointcut属性指定
切面
<aop:config proxy-target-class="true">
<aop:advisor advice-ref="" pointcut="切点表达式"/>
</aop:config>
下表为四种切面方法常用的增强类型
@AspectJ | <aop:aspect> | Advisor | <aop:advisor> | |
前置增强 | @Before | <aop:before> | MethodBeforeAdvice | 同左面 |
后置增强 | @AfterReturnint | <aop:after-returning> | AfterReturningAdvice | 同左面 |
环绕增强 | @Around | <aop:around> | MethodInterceptor | 同左面 |
抛出异常增强 | @AfterThrowing | <aop:after-throwing> | ThrowsAdvice | 同左面 |
final增强 | @After | <aop:after> | 无对应接口 | 同左面 |
引介增强 | @DeclareParents | <aop:declare-parents> | IntroductionInterceptor | 同左面 |
切面组成 | 各种增强注解和增强方法组成切面类 | aop:config配置切点和增强属性 | 通过bean的advice和pointcut属性配置 | 通过aop:config 配置 |
织入 | (方法一)AspectJProxyFactory类,该类常用方法: setTarget(); addAspect(); (proxyclass)getProxy(); (方法二) 在applicationContext.xml配置<aop:aspectj-autoproxy> | 由容器依据切点表达式自动织入匹配的类中,这个过程不需要用户操作 | ProxyFactorBean类,配置interceptorNames,target,proxyInterfaces, proxyTargetClass(true/false)属性,有容器产生供用户使用的代理对象。 | 同<aop:aspect> |