我有一个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没有被触发。
有什么方法可以让它发挥作用吗?
感谢。
答案 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切入点的任何方面。