AspectJ, общие pointcut без конструкторов

Я сделал метод профилирования:

@Around("tld.mycompany.business.aspects.SystemArchitecture.inServiceLayer() && !tld.mycompany.business.aspects.SystemArchitecture.publicConstructor()")
public Object profileBusiness(ProceedingJoinPoint pjp) throws Throwable {
 try {
    long start = System.currentTimeMillis();
    String name = pjp.getSourceLocation().toString() + " " + pjp.getSignature().getName();
    Object output = pjp.proceed();
    long elapsedTime = System.currentTimeMillis() - start;
    if(elapsedTime > 100)
        System.err.println("TimerAspect: Businessmethod " + name + " execution time: " + elapsedTime + " ms.");

    return output;
 } catch (Exception ex) {
     ex.printStackTrace(System.err);
     throw ex;
 }
}

И определил pointcuts в tld.mycompany.business.aspects.SystemArchitecture как

@Pointcut("execution(public new(..))")
public void publicConstructor() {}

а также

@Pointcut("within(tld.mycompany.business..*Impl) && 
           !execution(private * tld.mycompany.business.*.dataType()) && 
           !handler(java.lang.Exception)")

public void inServiceLayer() {}

Я хочу профилировать все методы в моем сервисном слое, которые не являются конструкторами и исключениями (так что я не получаю "при инициализации не поддерживается (ограничение компилятора)" и "при предварительной инициализации не поддерживается (ограничение компилятора) "Предупреждения) и игнорировать dataType(), который я получил в нескольких.

Тем не менее, я все еще получаю предупреждения о конструкторе и исключениях. Также кажется, что это совет для любого метода Java, поэтому отладка моего приложения стала почти невозможной, так как я нашел много советов для каждой строки. Затмение говорит мне, что у него есть 2747 советов только для профиля profileBusiness.

Очевидно, я что-то неправильно понял, но что? Как я могу сделать это, чтобы быть рядом со всеми методами (кроме конструкторов) в классах в иерархии tld.mycompany.business, которые заканчиваются на Impl?

ура

Nik

1 ответ

Решение

Эта часть вашего pointcut:

within(tld.mycompany.business..*Impl)

предназначается для всех точек соединения во всех ваших *Impl классах. Вот почему вы видите маркеры советов на каждой строке.

Вам нужно добавить строку вроде:

execution(* tld.mycompany.business..*Impl.*(..))

Кроме того,! Handler(java.lang.Exception) не имеет смысла, так как точка-указатель обработчика ссылается на предложения catch (исключая точки выполнения).

Наконец, ваша точка доступа publicConstructor кажется мне неправильной. Не хотите ли вы также удалить защищенные, приватные и защищенные конструкторы пакетов?

Другие вопросы по тегам