注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 可扩展、高可用、负载均衡..
 帮助

Spring AOP本质(7)


2008-05-09 17:41:49
 标签:Spring AOP   [推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
Spring AOP本质(7)
 
上一个里面,给出静态方法切点匹配的例子,现在给出一个动态的实现例子:
 
没有
 
/**
* 业务组件
*/

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

本文出自 “熔 岩” 博客,转载请与作者联系!





    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: