Spring AOP本质(7)
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
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 本文出自 “熔 岩” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |



leizhimin
博客统计信息
热门文章
最新评论
友情链接