Запустите второй рекомендованный метод из метода, уже рекомендованного весной - PullRequest
0 голосов
/ 31 октября 2011

У меня есть класс, назовите его X, в этом классе я успешно советовал метод, вызывающий метод method () {} из 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 () ... и, конечно, мой method2JP не срабатывает.

Есть ли способ заставить это работать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Поскольку Spring AOP работает посредством прокси-классов, для получения совета вы должны вызывать метод через прокси или оболочку, предоставленную фабрикой бинов.

Если вы не хотите вмешиваться внесколько классов, вы можете иметь метод получения прокси-версии "себя" из beanfactory.Примерно так:

@Service
public class MyService {
    @Autowired
    ApplicationContext context;

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

    public void method2() {
    }

}

Это будет гарантировать, что вызов method2 из method1 применит любые аспекты для pointcut method2.

1 голос
/ 01 ноября 2011

methodJP() должен быть объявлен в другом классе. В обычном сценарии аспекты не запускаются при вызове метода из одного и того же объекта.

...