从已经在Spring中建议的方法触发第二个建议的方法

时间:2011-10-31 17:50:12

标签: spring aop

我有一个Class,称之为X,在这个类中我成功地建议一个方法从Annotated Spring调用它的方法(){}。

所以,这是:

public class X {
    public void method(){...}
    public void method2(){...}
}

这是我的方面,当然缩短了:

@Aspect
public class MyAspect{
    @Pointcut("execution(* X.method(..))")
    public void methodJP(){}

    @Pointcut("execution(* X.method2(..))")
    public void method2JP(){}

    @Around("methodJP()")
    public void doMethodJP(ProceedingJoinPoint pjp) throws Exception {
        pjp.proceed(); //Amongst other things!!!
    }

    @After("method2JP()")
    public void doMethod2JP(JoinPoint jp) throws Exception {
        //Do some stuff here
    }
}

现在......两个连接点都运行良好,但是,我在我的X.method中,我也调用了method2JP()建议的方法......当然,我的方法2JP没有被触发。

有什么方法可以让它发挥作用吗?

感谢。

2 个答案:

答案 0 :(得分:1)

methodJP()应该在另一个类中声明。在常规场景中,当您从同一对象中调用方法时,不会触发方面。

答案 1 :(得分:1)

由于Spring AOP通过代理类工作,因此对于要调用的建议,必须通过bean工厂提供的代理或包装器调用该方法。

如果您不想分成多个类,可以让该方法从beanfactory中检索代理版本的“本身”。像这样的东西

@Service
public class MyService {
    @Autowired
    ApplicationContext context;

    public void method1() {
        context.getBean(MyService.class).method2();
    }

    public void method2() {
    }

}

这将保证从method1调用method2将应用method2切入点的任何方面。