аспекты-js
Использование аспектно-倾诉编程在NodeJS中
Установите с помощью NPM
$ npm install --save aspects-js
Необходимо импортировать aspects-js в вашем входном файле
require('aspects-js');
Добавьте аспект, определение которого будет записано в новом файле.
Сначала, импортируйте Aspect
интерфейс из aspects-js в начале файла с определением аспекта
// Файл: testAspect.js
const { Aspect } = require('aspects-js');
Затем, объявите пользовательский класс аспекта, который наследует Aspect
интерфейс, перезаписывая метод get pointcut
, чтобы вернуть выражение аспекта, а также можно переопределить некоторые методы для обработки соединительных точек
// Файл: testAspect.js
class TestAspect extends Aspect {
get pointcut() { return '*.do*()' };
before() { console.log('this is for before join point') };
after() { console.log('this is for after join point') }
}
После этого экспортируйте экземпляр данного пользовательского класса аспекта
// Файл: testAspect.js
module.exports = new TestAspect();
Наконец, загрузите указанный экземпляр класса аспекта в проектном входном файле (перед тем, как его потребуется загрузить)
// Файл: entry.js
require('./testAspect.js');
Теперь все последующие загружаемые классы будут обрабатываться пользовательским классом аспекта при выполнении их методов.
Aspect
interface Aspect {
readonly pointcut: Pointcut | string | ((joinPoint: JoinPoint) => boolean);
readonly order: number;
after(joinPoint: JoinPoint, result: any, error: Error);
afterReturn(joinPoint: JoinPoint, result: any): any;
afterThrow(joinPoint: JoinPoint, error: Error): void;
before(joinPoint: JoinPoint): void;
around(joinPoint: JoinPoint): any;
}
JoinPoint
class JoinPoint {
readonly type: Class;
readonly fun: Function;
readonly thisArg: any;
readonly target: any;
readonly args: any[];
proceed(...args: any[]): any;
}
Pointcut
class Pointcut {
constructor(pointcut: string);
} matches(join_point: JoinPoint): boolean;
}
```## 5. Аспектные выражения
### 1. Стандартное выражение
```javascript
"ClassName.FunctionName()"
execution
"execution(ClassName.FunctionName())"
within
"within(ClassName)"
"FunctionName(. .)"
"FunctionName(Type1, Type2)"
"FunctionName(Type1, . ., Type2)"
#### > `*` сопоставляет несколько символов *`шаблон`*
```javascript
"*Service.do*()"
Соответствует всем методам, начинающимся с do
в типах, заканчивающихся на Service
.
?
сопоставляет один символ шаблон
"you?.do?()"
+
логический оператор "или" для названий"within(Test1 + Test2)"
Соответствует всем методам в Test1
или Test2
.
|
, ||
логический оператор "или""within(Test1) | within(Test2)"
Соответствует всем методам в Test1
или Test2
.
&
, &&
логический оператор "и""within(Test1) & abc"
Соответствует методу abc
в Test1
.
!
логический оператор "не""! within(Test)"
Соответствует всем методам, кроме тех, что находятся в классе Test
.
()
оператор скобок (логическое группирование)Увеличивает приоритет выражений внутри скобок.
()
оператор вызова метода"abc()"
"abc(. .)"
Соответствует всем методам, названным abc
.
"abc(Type1)"
Соответствует всем методам, названным abc
, где передается один аргумент типа Type1
.
,
оператор разделения аргументов"*(Type1, Type2)"
```Соответствует всем методам, где передаются два аргумента типа `Type1` и `Type2` соответственно.
#### > `. ` оператор свойства
```javascript
"Test.abc()"
Соответствует методу abc
в классе Test
.
. .
Оператор нескольких аргументовСоответствует нескольким последовательным аргументам.### 5. Другое
order
интерфейса Aspects
Этот атрибут используется для управления порядком выполнения аспектов; чем меньше значение, тем выше приоритет.
Добавлены pointcuts, которые могут использовать функции как значения.
К интерфейсу Aspects
добавлен атрибут order
для управления порядком выполнения аспектов.
Используется AST вместо регулярных выражений в pointcuts.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )