1 控制流切入點
匹配一個類的某一個方法或該方法下的所有方法調用。
。實現代碼如下:
package cuigh.spring.aop.step02;
import org.aopalliance.aop.Advice;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.ControlFlowPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
/**
* 功能:演示控制流切入點使用
*/
public class ControlFlowPointcutExample {
static Log log = LogFactory.getLog(ControlFlowPointcutExample.class);
public static void main(String[] args) {
//創建目標
TestControlFlowPointcut target = new TestControlFlowPointcut();
//創建 通知
Advice advice = new MyBeforeAdvice();
//創建切入點 MyDynamicPointcut 方法 testNotAdvice() 被攔截
Pointcut pointcut = new ControlFlowPointcut(TestControlFlowPointcut.class,"testNotAdvice");
//創建通知者
Advisor advisor = new DefaultPointcutAdvisor(pointcut,advice);
//創建代理
ProxyFactory pf = new ProxyFactory();
pf.setTarget(target);
pf.addAdvisor(advisor);
TestControlFlowPointcut proxy = (TestControlFlowPointcut)pf.getProxy();
log.info("-----下面未被攔截------");
target.test(proxy);
log.info("-----下面被攔截------");
target.testNotAdvice(proxy);
}
}
package cuigh.spring.aop.step02;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/*
* 功能:控制流切入點示例類
* */
public class TestControlFlowPointcut {
static Log log = LogFactory.getLog(TestControlFlowPointcut.class);
public void test1(){
log.info(this.getClass().getName()+".test1()");
}
public void test2(){
log.info(this.getClass().getName()+".test2()");
}
public void test(TestControlFlowPointcut bean){
bean.test1();
bean.test2();
}
//對此方法進行攔截
public void testNotAdvice(TestControlFlowPointcut bean){
bean.test1();
bean.test2();
}
}
package cuigh.spring.aop.step02;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice {
static Log log = LogFactory.getLog(MyBeforeAdvice.class);
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
log.info("方法執行前攔截,被攔截方法="+method.getName());
}
}
程序輸出:
2013-07-20 19:35:44,343 [ControlFlowPointcutExample.java 39] INFO - -----下面未被攔截------
2013-07-20 19:35:44,359 [TestControlFlowPointcut.java 10] INFO - cuigh.spring.aop.step02.TestControlFlowPointcut.test1()
2013-07-20 19:35:44,359 [TestControlFlowPointcut.java 14] INFO - cuigh.spring.aop.step02.TestControlFlowPointcut.test2()
2013-07-20 19:35:44,359 [ControlFlowPointcutExample.java 41] INFO - -----下面被攔截------
2013-07-20 19:35:44,359 [MyBeforeAdvice.java 15] INFO - 方法執行前攔截,被攔截方法=test1
2013-07-20 19:35:44,359 [TestControlFlowPointcut.java 10] INFO - cuigh.spring.aop.step02.TestControlFlowPointcut.test1()
2013-07-20 19:35:44,359 [MyBeforeAdvice.java 15] INFO - 方法執行前攔截,被攔截方法=test2
2013-07-20 19:35:44,359 [TestControlFlowPointcut.java 14] INFO - cuigh.spring.aop.step02.TestControlFlowPointcut.test2()