Мой совет @Around не вызывается для всех методов в пакете - PullRequest
1 голос
/ 29 июля 2010

У меня есть этот код ниже в моем классе LoggingAspect, и я ожидаю, что это будет работать для моих методов, таких как

gov.ssa.rome.service.impl.save () gov.ssa.rome.dao.impl.save ()

но он работает только один раз, несмотря ни на что. я не знаю почему я использовал autowire, чтобы связать dao с слоем servcice. Я очень ценю вашу помощь.

Что я должен сделать, чтобы этот метод запустился для всего потока моего приложения, чтобы увидеть поток в журналах?

@Around("execution(* gov.ssa.rome..*.*(..))")
public Object log(ProceedingJoinPoint pjp) throws Throwable {

 System.out.println("aspect Around started");

        Object ret = pjp.proceed();

    System.out.println("aspect Around ended);

  return ret;
}

1 Ответ

2 голосов
/ 30 июля 2010

Аспекты могут быть созданы с использованием различных технологий. Если вы являетесь JDK-прокси, они будут работать только для методов, определенных в интерфейсе. Если они являются прокси-серверами cglib, они будут работать для всех, кроме финальных методов. Я думаю, что Spring по умолчанию будет использовать JDK-прокси, если соответствующий класс реализует интерфейс, а в противном случае - cglib-прокси.

Проверьте, как выглядит ваш класс с помощью метода save и выполняется ли сохранение из интерфейса. Вы можете использовать прокси-компоненты aspectjweaver, чтобы все работало, но они требуют некоторой манипуляции с байт-кодом. Я бы порекомендовал придерживаться прокси-серверов JDK и создавать / расширять интерфейсы, где это необходимо. Для получения дополнительной информации см. Главу AOP документации по пружинам.

...