AspectJ, общие pointcut без конструкторов - PullRequest
1 голос
/ 07 сентября 2010

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

@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;
 }
}

И определил точки в 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 советов по профилю бизнес-линии.

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

Cheers

Nik

1 Ответ

3 голосов
/ 09 сентября 2010

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

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

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

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

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

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

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

...