Java编程—Spring AOP本质(6)
还有很多接口和类没有画出,这里简要说明下。
在org.springframework.aop.support包下,还有一些很重要的切点类,是Spring定义好的,几乎可以满足所用应用的需要。
DynamicMethodMatcherPointcut
NameMatchMethodPointcut
Perl5RegexpMethodPointcut
StaticMethodMatcherPointcut
JdkRegexpMethodPointcut
ControlFlowPointcut
ComposablePointcut
与这些切点对应,还有一些切面类,名字都是以PointcutAdvisor结尾。
通过上面的原理图,简单查看一下API,就可以直到,通过通知Advice和切点Pointcut可以生成通知者Advisor。有了通知者,有了目标对象,就可以通过ProxyFactory生成代理对象。
下面给个例子看看Spring如何通过切点来选取类和方法的,并如通知所选取的方法。
例子:扩展StaticMethodMatcherPointcut,实现静态切入点过滤。
/**
* 业务组件:BeanOne
*/
public class BeanOne {
public void foo() {
System.out.println("BeanOne的foo()被调用!");
}
public void bar() {
System.out.println("BeanOne的bar()被调用!");
}
}
/**
* 业务组件:BeanTwo
*/
public class BeanTwo {
public void foo() {
System.out.println("BeanTwo的foo()被调用!");
}
public void bar() {
System.out.println("BeanTwo的bar()被调用!");
}
}
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
* 自定义通知: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 java.lang.reflect.Method;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
/**
* 自定义静态切入点:Pointcut
*/
public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {
public boolean matches(Method method, Class cls) {
//类方法名为foo时候匹配
System.out.println("切入点方法匹配,正在匹配"+cls.getName()+"的"+method.getName()+"方法!");
return ("foo".equals(method.getName()));
}
public ClassFilter getClassFilter() {
return new ClassFilter() {
public boolean matches(Class cls) {
System.out.println("切入点类匹配,正在匹配"+cls.getName()+"类!");
//BeanOne类匹配
return (cls == BeanOne.class);
}
};
}
}
上一页 [1] [2] [3] 下一页

【责编:Ken】