Синтаксис @AspectJ для after() : staticinitialization(*)

Я пытаюсь реализовать аспект трассировки, используя модель инстанцирования pertypewithin. Таким образом, я смогу использовать один регистратор для каждого класса для каждого типа.

Из некоторых примеров вокруг мы можем найти этот код для инициализации регистратора:

public abstract aspect TraceAspect pertypewithin(com.something.*) {
    abstract pointcut traced();
    after() : staticinitialization(*) {
        logger = Logger.getLogger(getWithinTypeName());
    }
    before() : traced() {
        logger.log(...);
    }
    //....
}

к сожалению, я не могу полностью перевести это в синтаксис @AspectJ (это требование проекта вне моего контроля), особенно часть, в которой мне нужно настроить регистратор, выполняя этот код только один раз.

Это возможно?

Спасибо,


person Sebastian    schedule 12.09.2011    source источник


Ответы (1)


person    schedule
comment
Я пробовал это перед публикацией вопроса, но безуспешно. Но после того, как вы ответили, я решил вернуться к этому подходу и понял, что реальная проблема была с кодом, который генерировал переполнение стека (без каламбура)... теперь это решено. Спасибо еще раз! - person Sebastian; 14.09.2011
comment
Идеальный ответ, также используются аннотации, которые являются предпочтительными обозначениями для AspectJ 5 и выше. Спасибо :-) - person KomodoDave; 26.08.2012
comment
@KomodoDave, мне просто интересно: почему вы говорите, что аннотации являются предпочтительными обозначениями для AspectJ 5 и выше? Я считаю синтаксис аннотаций для определения аспектов (использованный выше) более сложным, поскольку строковые выражения в атрибутах аннотаций не анализируются до выполнения. Использование собственного синтаксиса AspectJ вместе с ajc менее многословно и проверяется во время компиляции, что, очевидно, улавливает вещи намного раньше, чем во время выполнения. Теперь я действительно думаю, что хорошо использовать аннотации при определении ваших точек, поскольку разработчик может видеть аннотацию как визуальный признак того, что что-то не так. - person Matthew Adams; 13.02.2013
comment
@MatthewAdams AspectJ переплетается во время компиляции или загрузки, а не во время выполнения. Как указано здесь AspectJ 5 не предоставляет явных поддержка плетения во время выполнения. Вы можете создать переплетение во время выполнения только в том случае, если вы используете поддержку AOP прокси-сервера Spring. Что касается моего заявления о том, что аннотации предпочтительнее - я оговорился и должен был сказать .. моя предпочтительная нотация... Подходы с аннотациями и без аннотаций, каждое предложение которых отличается от другого. Это сводится к личным предпочтениям. Я предпочитаю использовать аннотации, потому что я рассматриваю метаданные АОП. - person KomodoDave; 13.02.2013