《Pro Spring》学习笔记之ControlFlowPointCut流程切入点实例

本文介绍了在Spring框架中如何使用ControlFlowPointCut进行流程控制切入点的实践。通过示例展示了当方法在特定上下文中被调用时,如何触发切入通知。测试结果显示,直接调用foo方法不会执行通知,而通过runfoo方法调用foo方法时会执行通知。虽然ControlFlowPointCut能解决特定场景的问题,但在JDK 1.4中性能下降5倍,1.3中下降10倍,因此在性能敏感的场景下需要谨慎使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果有这样的需求:我们对一个方法进行切入通知,但只有这个方法在一个特定方法中被调用的时候执行通知,我们可以使用ControlFlowPointCut流程切入点

 

BeanOne.java

 

package ch7.ControlFlowPointCut;

public class BeanOne {
   
public void foo(){
       System.out.println(
"foo-one");
   }

   
public void bar(){
       System.out.println(
"bar-one");
   }

}

 

SimpleAdvise

 

package ch7.ControlFlowPointCut;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SimpleAdvise implements MethodInterceptor {

    
public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println(
"before");
        Object retVal
=invocation.proceed();
        System.out.println(
"after");
        
return retVal;
    }


}

 

测试代码:

 

package ch7.ControlFlowPointCut;

import org.aopalliance.aop.Advice;
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 Test {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
         BeanOne one
=new BeanOne();
        
         BeanOne proxyOne;
    
         
         Pointcut pc
=new ControlFlowPointcut(Test.class,"runfoo");
         Advice advice
=new SimpleAdvise();
         Advisor advisor
=new DefaultPointcutAdvisor(pc,advice);
         
         
         
//创建BeanOne代理
         ProxyFactory pf1=new ProxyFactory();
         pf1.addAdvisor(advisor);
         pf1.setTarget(one);
         proxyOne
=(BeanOne)pf1.getProxy();
         
        
         
         
//直接调用foo
         proxyOne.foo();
         
//通过runfoo方法调用foo
         Test.runfoo(proxyOne);
         
         
    }

    
public static void runfoo(BeanOne beanOne){
        beanOne.foo();
    }


}

 

测试结果:

foo-one
before
foo-one
after

可以看到直接执行foo没有进行切入,而通过runfoo方法执行foo就进行了切入

使用流程切入点可以解决不少问题,但值得注意的是,使用流程切入点在jdk1.4中比其他切入点要慢5倍,在1.3上则要慢10倍,追求高性能的要慎重使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值