如果只想拦截在某种情况下调用的方法,可以使用Spring AOP提供的ControlFlowPointcut来完成这个功能。比如,只有在MainTest类中的aaMethod方法中调用的目标类的方法才会被拦截,其它地方调用的目标类的方法将不会被拦截。
示例如下,应用上一篇日志的前置通知,不同就是这里应用ControlFlowPointcut,而上一篇日志应用了一个自定义的继承了NameMatchMethodPointcut的MyPointcut类。
本例相关的applicationContext.xml文件中的内容:
<!-- 定义前置通知 --> <bean id="beforeLogAdvice" class="com.aop.BeforeLogAdvice"></bean> <bean id="controlFlowPointcut" class="org.springframework.aop.support.ControlFlowPointcut"> <!-- 构造函数的参数 --> <constructor-arg index="0"> <value>com.test.MainTest</value> </constructor-arg> <constructor-arg index="1"> <value>aaMethod</value> </constructor-arg> </bean> <bean id="myAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut"> <ref local="controlFlowPointcut"/> </property> <property name="advice"> <ref local="beforeLogAdvice"/> </property> </bean>
beforeLogAdvice还是以前那个前置通知,DefaultPointcutAdvisor跟上一篇日志中的用法一样。controlFlowPointcut的bean里面,第一个构造函数参数就是拦截的目标类,第二个构造函数参数就是要拦截的方法名,也就的意思就是说只拦截com.test.MainTest下的aaMethod方法中调用的UserService类的所有方法。
MainTest测试类代码:
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.service.IUserService;
public class MainTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
IUserService userService = (IUserService) context.getBean("myProxy");
userService.addUser("ton", 56); //不会被拦截
userService.deleteUser("ton");//不会被拦截
aaMethod(userService);
}
public static void aaMethod(IUserService userService){
userService.addUser("ton2", 56);//被拦截
userService.deleteUser("Alex");//被拦截
}
}