上一个里面,给出静态方法切点匹配的例子,现在给出一个动态的实现例子:
 
没有
 
/** 
* 业务组件 
*/
 
public  class SampleBean { 
     public  void foo( int x) { 
        System.out.println( "SampleBean的foo(int x)方法被调用,参数x="  +x); 
    } 
     public  void bar() {  
        System.out.println( "SampleBean的无参bar()方法被调用!"); 
    } 
}
 
import java.lang.reflect.Method; 

import org.springframework.aop.ClassFilter; 
import org.springframework.aop.support.DynamicMethodMatcherPointcut; 

/** 
* 自定义动态切入点:Pointcut 
*/
 
public  class SimpleDynamicPointcut  extends DynamicMethodMatcherPointcut { 
     /** 
     * 重写了静态方法匹配器 
     */
 
     public  boolean matches(Method method, Class cls) { 
        System.out.println( "SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:" + method.getName()); 
         //仅当方法名为foo时候才匹配 
         return ( "foo".equals(method.getName())); 
    } 

     /** 
     * 实现了动态方法匹配器 
     */
 
     public  boolean matches(Method method, Class cls, Object[] args) { 
        System.out.println( "SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:" + method.getName()); 
         int x = ((Integer) args[0]).intValue(); 
         //仅当方法参数为不等于100才匹配 
         return (x != 100); 
    } 

     /** 
     * 重写了类匹配器 
     */
 
     public ClassFilter getClassFilter() { 
         return  new ClassFilter() { 
             public  boolean matches(Class cls) { 
                System.out.println( "SimpleDynamicPointcut:切入点类匹配,正在匹配"+cls.getName()+ "类!");                 
                 return (cls == SampleBean. class); 
            } 
        }; 
    } 
}
 
/** 
* 自定义通知:Advice 
*/
 
public  class SimpleAdvice  implements MethodInterceptor { 
     public Object invoke(MethodInvocation invocation)  throws Throwable { 
        System.out.println( ">> 业务方法调用前动作,被代理调用目标方法是: " + invocation.getMethod().getName()); 
        Object retVal = invocation.proceed(); 
        System.out.println( ">> 业务方法调用结束后动作!"); 
         return retVal; 
    } 
}
 
import org.springframework.aop.Advisor; 
import org.springframework.aop.framework.ProxyFactory; 
import org.springframework.aop.support.DefaultPointcutAdvisor; 

import com.apress.prospring.ch6.staticpc.SimpleAdvice; 

/** 
* 动态方法匹配器切入点:客户端测试 
*/
 
public  class DynamicPointcutExample { 

     public  static  void main(String[] args) { 
         //创建目标对象 
        SampleBean target =  new SampleBean(); 

         // 创建通知者 
        Advisor advisor =  new DefaultPointcutAdvisor( 
                 new SimpleDynamicPointcut(),  new SimpleAdvice()); 
         
         //创建代理工厂 
        ProxyFactory pf =  new ProxyFactory(); 
         //将目标加入工厂 
        pf.setTarget(target); 
         //创建通知者 
        pf.addAdvisor(advisor); 

         //获取代理实例(产品) 
        SampleBean proxy = (SampleBean)pf.getProxy(); 

         //调用代理方法,注意参数的变化 
        proxy.foo(1); 
        proxy.foo(10); 
        proxy.foo(100); 
         
        proxy.bar(); 
        proxy.bar(); 
        proxy.bar(); 
    } 
}
 
运行结果:
- Using JDK 1.4 collections 
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类! 
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo 
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类! 
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:bar 
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类! 
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:hashCode 
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类! 
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:toString 
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类! 
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo 
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo 
>> 业务方法调用前动作,被代理调用目标方法是: foo 
SampleBean的foo( int x)方法被调用,参数x=1 
>> 业务方法调用结束后动作! 
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo 
>> 业务方法调用前动作,被代理调用目标方法是: foo 
SampleBean的foo( int x)方法被调用,参数x=10 
>> 业务方法调用结束后动作! 
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo 
SampleBean的foo( int x)方法被调用,参数x=100 
SampleBean的无参bar()方法被调用! 
SampleBean的无参bar()方法被调用! 
SampleBean的无参bar()方法被调用! 

Process finished with exit code 0