Java AspectJ Examples
Описание
Проект с примерами подключения библиотеки AspectJ.
Проект разделен на модули, каждый из которых описывает различные способы подключения аспектов:
- связывание с использованием плагина:
- weaving-compile-time
- weaving-post-compile
- связывание во время выполнения:
- weaving-load-time
Дополнительно
Для плагина не продемонстрировано в проекте:
- указание каталогов и шаблонов классов для просмотра через
includes/excludes
- плетение уже скомпилированных классов проекта в секции
weaveDirectories
- подключение скомпилированных зависимостей с аспектами в секции
aspectLibraries
Запуск
Описан в README.md
каждого модуля.
Описание терминов
- Weaving — связывание объектов с соответствующими аспектами (возможно на этапе компиляции, загрузки или выполнения программы);
- JoinPoint — точка наблюдения в выполняемой программе, где добавляется функциональность отдельной инструкции (Advice);
-
@Aspect
— модуль или класс, в котором собраны описания точек среза (Pointcut) и наборы инструкций для них (Advice); -
@Pointcut
(1/2) — точка среза, включающая набор точек наблюдения (JoinPoint);-
execution(static * com.xyz..*.*(..))
— выполнение кода любого статического метода в пакетеcom.xyz
; -
execution(* com.xyz..*.*(..))
— выполнение кода любого метода или конструктора в пакетеcom.xyz
; -
call(void MyInterface.*(..))
— вызов любого метода, возвращающегоvoid
, интерфейсаMyInterface
; -
initialization(MyClass || MyOtherClass)
— инициализация классаMyClass
илиMyOtherClass
; -
staticinitialization(MyClass+ && !MyClass)
— статическая инициализация класса, имя которого начинается наMyClass
, но не самMyClass
; -
preinitialization(MyClass)
— каждая предварительная инициализация объекта, когда первый конструктор, вызванный по типу, соответствует сигнатуре, включая запись первого вызванного конструктора до вызова суперконструктора; -
handler(ArrayOutOfBoundsException)
— выполнение обработчика исключенияArrayOutOfBoundsException
; -
get/set(static int MyClass.x)
— чтение / запись свойстваx
классаMyClass
; -
this/target(MyClass)
— выполнение точки соединения, соответствующей объекту типаMyClass
; -
args(Integer)
— выполнение точки соединения, в которой доступен аргумент типаInteger
; -
if(thisJoinPoint.getKind().equals("call"))
— совпадает со всеми точками соединения, в которых заданное выражение истинно; -
within/withincode(MyClass)
— совпадает со всеми точками соединения, встречающимися в коде заданного класса; -
cflow/cflowbelow(call(void MyClass.test()))
— совпадает со всеми точками соединения, встречающимися в потоке выполнения заданного среза; -
adviceexecution()
— каждое выполнение любого набора инструкций (Advice); -
@annotation(MyAnnotation)
— выполнение точки соединения, цель которой помечена аннотацией@MyAnnotation
;
-
- Advice — инструкции выполняемые на точках среза (Pointcut); на одной точке среза (Pointcut) может быть несколько инструкций;
-
@Before
— запуск совета до выполнения точки соединения; -
@AfterReturning
— запуск совета после нормального выполнения точки соединения; -
@AfterThrowing
— запуск совета после выброса исключения в процессе выполнения точки соединения; -
@After
— запуск совета после любого варианта выполнения точки соединения; -
@Around
— запуск совета вместо выполнения точки соединения (выполнение точки соединения может быть вызвано внутри совета);
-
Ссылки
Аспектно-ориентированное программирование, Spring AOP
AspectJ в автоматическом тестировании — несколько практических примеров