上一个里面,给出静态方法切点匹配的例子,现在给出一个动态的实现例子:
没有
/**
* 业务组件
*/
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()方法被调用!");
}
}
* 业务组件
*/
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);
}
};
}
}
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;
}
}
* 自定义通知: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();
}
}
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
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
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/76174,如需转载请自行联系原作者