@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 не предоставя изрично поддръжка за тъкане по време на изпълнение. Можете да създадете преплитане по време на изпълнение само ако използвате поддръжка на Spring прокси AOP. Що се отнася до моето посочване, анотациите са предпочитани - изразих се погрешно и трябваше да кажа, че ..е моята предпочитана нотация... Подходи с анотация срещу не-анотация, всяка оферта включва характеристики, които другата не. Това се свежда до лични предпочитания. Предпочитам да използвам анотации, защото вземам под внимание AOP метаданните. - person KomodoDave; 13.02.2013