2011-10-31 59 views
0

我在这个类中有一个Class,称之为X,我已经成功地建议了一个方法从Annotated Spring调用它的method(){}。从已经在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 
    } 
} 

现在......两个连接点,我十之内很好地工作,但是,我方法,我也调用method2JP()建议的方法...当然,我的method2JP不会被触发。

有什么办法可以让这个工作?

谢谢。

回答

1

由于Spring AOP通过代理类工作,对于要调用的通知,您必须通过bean工厂提供的代理或包装来调用方法。

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

@Service 
public class MyService { 
    @Autowired 
    ApplicationContext context; 

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

    public void method2() { 
    } 

} 

这东西将保证方法2,从方法1调用将适用于方法2切入点任何方面。

+0

我喜欢它......让我给它“旋转”! –

+0

我觉得贫民窟这样做,但它的工作。谢谢! –

+1

是的,它完全是贫民窟。更重要的是,它打破了AOP的全部想法,因为它迫使你修改你建议的代码。它的工作原理(我自己也用过几次“黑客”),但将第二种方法分解成另一个bean可能更优雅。它是凝聚力/碎片化以及符合Springs限制的平衡。但就像有人说,如果它有效,它很漂亮... – pap

1

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

+0

谢谢,我很害怕这种情况。 –