动态方法名匹配切面检查中,包括静态类检查,静态方法名检查和动态方法检查,而其中的两个静态检查又是不可缺少的。
其中的静态检查的时间,方式和对象与静态方法名匹配切面中的相同,所不同的是在代理对象第二次调用的已经匹配成功的方法后还得继续做动态方法检查(可以在其中对参数类型和取值进行
限制),此外,在代理对象调用方法时,静态方法名检查之后还得做动态方法检查。
和静态方法名匹配切面SaticMethodMatcherPointcutAdvisor一篇中提到的提到的几个文件需要更改的地方如下:
对GreetingAdvisor更改
package com.sias;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Method;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
public class GreetingAdvisor extends DynamicMethodMatcherPointcut{
private static List<String> specialClientList=new ArrayList<String>();
static{
System.out.println("初始化动态切面类");
specialClientList.add("阿丁");
specialClientList.add("小一");
}
public boolean matches(Method method,Class clazz){
System.out.println("调用静态切面类的mathes()方法对"+clazz.toString()+"类的"+method.getName()+"进行静态检查");
return "greeTo".equals(method.getName());
}
public ClassFilter getClassFilter(){
return new ClassFilter(){
public boolean matches(Class clazz){
System.out.println("调用getClassFileter()对"+clazz.getName()+"进行静态检查");
return NativeWaiter.class.isAssignableFrom(clazz);
}
};
}
public boolean matches(Method method,Class clazz,Object[] args){
System.out.println("调用动态matches方法进行动态检查");
if(args.length!=0){
String cl=(String)args[0];
return specialClientList.contains(cl);
}
else return false;
}
}
applicationContext.xml配置文件需要更改,只需更改其中的advisor切面部分
<bean id="greetingAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut">
<bean class="com.sias.GreetingAdvisor"/>
</property>
<property name="advice" ref="greetingAdvice"/>
</bean>