Оба стиля ( .aj и @ AspectJ ) имеют функции, которые другой не может сделать.
См. Этот пост о том, что аннотации могут сделать, что декларативный AspectJ не может: Что такое декларативный синтаксис AspectJ для перезаписи аргумента
Файлы .aj по большей части (кроме упомянутых выше) могут сделать намного больше.
Наиболее примечательно, что они могут выполнять ITD (Inter-Type-Definitions, иначе говоря, добавление методов и свойств в классы).
Самая большая причина, по которой вы захотите использовать @AspectJ, заключается в том, что он даже не требует ткачества времени компиляции (CTW) или даже времени загрузки (LTW), если вы используете поддержку Spring прокси AOP. Spring будет имитировать @AspectJ, но во время выполнения, создавая прокси.
Я заметил, что Spring, Eclipse (и я), похоже, поощряют более широкое использование настоящего AspectJ. Я считаю, что это потому, что плагин Eclipse стал настолько хорошим. Также с истинным AspectJ и аннотацией @Configurable вы можете получить проводку Spring на экземплярах bean-компонентов. Вот как работает Spring Roo.
С помощью плагина Eclipse AspectJ IDE вы можете увидеть ссылки pointcut на оба стиля (@ и aj) и получить очень четкое представление о том, что происходит с «волшебством».