аспекты-js
Используйте аспекты в Node.js
Установите с помощью npm
$ npm install --save aspects-js
Сначала требуется импортировать aspects-js в основной js-файл
require('aspects-js');
Добавьте js-файл для записи аспекта.
Сначала вам следует импортировать класс Aspect
из aspects-js.
// файл: testAspect.js
const { Aspect } = require('aspects-js');
Затем вы должны объявить класс, расширяющий Aspect
, и реализовать свойства pointcut
и функции для точки соединения.
// файл: testAspect.js
class TestAspect extends Aspect {
get pointcut() { return '*.do*()' };
before() { console.log('это для точки соединения до выполнения') };
after() { console.log('это для точки соединения после выполнения') };
}
После этого экспортируйте экземпляр вашего класса, который расширяет Aspect
.
// файл: testAspect.js
module.exports = new TestAspect();
Наконец, импортируйте ваши аспекты в основной файл entry.js
// файл: 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): void;
afterReturn(joinPoint: JoinPoint, result: any): any;
afterThrow(joinPoint: JoinPoint, error: Error): void;
before(joinPoint: JoinPoint): void;
around(joinPoint: JoinPoint): any;
}
```### Класс `JoinPoint`
```typescript
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(joinPoint: JoinPoint): boolean;
}
```## 5. Выражение pointcut
### 1. Обычное
```javascript
"ClassName.FunctionName()"
execution
"execution(ClassName.FunctionName())"
within
"within(ClassName)"
"FunctionName(. .)"
"FunctionName(Type1,Type2)"
"FunctionName(Type1,. .,Type2)"
*
Соответствие всем словам шаблонов
"*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
Высший приоритет при меньших значениях
Поддержка функций для точки отсечения
Добавлено свойство order
для класса Aspects
Используется AST для точки отсечения
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )