1. Введение
В процессе разработки нам часто нужно писать много примеров:
@Getmapping ("/id/get") public result getbyid (идентификатор строки) выбрасывает exception {log.info ("Параметр запроса:"+id); Проверьте (новый Verifyparam ("ID отдела", ID)); Результат результата = новый результат («успешно полученный через ID!», Service.QuerybyId (id)); log.info («Возвращение сообщения:»+result.tostring ()); результат возврата; }Печатные параметры запроса и параметры возврата, и эти операции существуют в каждом методе, что делает наш код более избыточным. По этой причине мы можем использовать Dynamic Proxy для использования параметров печати и распечатать возвращаемые сообщения в качестве разделов, а также использовать выражения с точкой вырезания, чтобы разрезать их в каждый метод.
2. Шаги
1. Введите связанные с AOP зависимости:
<!-AOP-связанные зависимости-> <Dependency> <groupId> org.springframework.boot </GroupId> <Artifactid> Spring-Boot-Starter-Aop </artifactid> </depertive>
После введения зависимостей Spring-AOP загрузит необходимые им зависимости. Spring использует AspectJ по умолчанию для реализации уведомлений.
Среди них AspectJweaver.jar содержит файлы, которые анализируют аспекты вырезанных выражений. Эта зависимость также требуется при использовании вырезанных точечных выражений для обработки транзакций.
2. Конфигурация:
1) Создать класс конфигурации:
/*** @function Описание: класс AOP, используемый для операций уровня контроллера* @Author Administrator*/ @Component // Обработка объектов для пружины для управления @aspept // Представляю этот класс как аспект Class Controleraop {}Аннотация @Aspepe представляет, что это класс управления аспектами, где можно определить выражения с точкой, и структура аспекта будет проанализировать его.
2) Определите выражение точковой вырезанности:
@Pointcut ("execution (public*com.hzt.manage.*. Web.controller ..*.*(..))") // Pointcut Expression public void privilege () {}Где @pointcut представляет этот метод как выражение с точкой. Его значение-это вырезанное выражение, где значение может быть опущено, а его грубый формат:
@Annotation (экспрессия тега + формат экспрессии)
Для этого формата, точечные показатели AspectJ, поддерживаемые Spring AOP, следующие:
1. Выполнение: точка подключения, используемая для соответствия выполнению метода;
2. Внутри: используется для соответствия выполнению методов в указанном типе;
3. Обратите внимание, что сопоставление типа объекта AOP Proxy, которое может включать введение интерфейсов и сопоставление типов;
4. Цель: Метод выполнения, используемый для соответствия текущему типу целевого объекта; Обратите внимание, что сопоставление типа целевого объекта является соответствием типа, так что введение интерфейса не включено;
5. Args: метод выполнения используется для соответствия параметрам, передаваемым в настоящее время выполняемым методом в качестве указанного типа;
6. @within: используется для соответствия, чтобы удерживать методы в указанном типе аннотации;
7. @Target: Метод выполнения, используемый для соответствия текущему типу целевого объекта, где целевой объект содержит указанную аннотацию;
8. @Args: используется для соответствия выполнению параметров, передаваемых в настоящее время выполняемого метода, который содержит указанную аннотацию;
9. @annotation: используется для соответствия методу, который в настоящее время выполняет метод, содержит указанную аннотацию;
10. Bean: Spring Aop расширение, AspectJ не имеет метода выполнения для сопоставления объектов бобов с определенным именем;
11. Справочная точка: означает ссылку на другие точки входа именования, только стиль @apectj поддерживает его, но не стиль схемы.
ARGS определяет параметры при выполнении метода вырезания точечной выреза:
Pointcut (value = "execution (public*com.hzt.manage.*. Web.controller ..*.*(..)) && args (param)", argnames = "param") // pointcut выражение public void privilege1 (string param) {}Мы фокусируемся на выражении точки соединения метода выполнения, а ее грубая структура составляет:
Выполнение (модификаторы-pattern? Ret-тип-паттерн объявляющий тип-pattern? Имя-паттерн (param-pattern) броски?)
1. Сопоставление модификатора (модификатор?) (Можно пропустить)
2. Сопоставление возврата значения (RET-тип-паттерн) может представлять любое возвращаемое значение для *, например (String), представляет только фильтрацию точки входа, которая возвращает тип строки, имена классов полного пути и т. Д. (не может быть опущено)
3. Decling-Type-Pattern? Например, *. Manage представляет пакет первого уровня как произвольный, а пакет второго уровня в качестве имени управления. *.. Управление представляет пакеты подкласса в соответствии с всеми пакетами управления. com .. *. Comtroller представляет все пакеты контроллеров в Com Packages и т. Д. И * означает, что все пакеты соответствуют. (Не опущен)
4. Сопоставление имени метода (PATTERN) может указать имя метода или * представляет все, GET * представляет все методы, начиная с GET, или вы можете указать префикс * GET представляет любой метод с произвольным суффиксом GET (не опущен)
5. Сопоставление параметров (((param-pattern)) может указать конкретный тип параметра, несколько параметров разделены «,», и каждый параметр также может быть «*», чтобы соответствовать параметрам любого типа, например (строка), означает метод соответствия параметру строки; (*, String) означает метод для соответствия двум параметрам, первый параметр может быть любого типа, а второй параметр имеет тип строки; (..) можно использовать для представления любого параметра (не опущен)
6. Сопоставление типа исключений (броски-паттерн?)
3. Определите метод аспекта
@Around ("privilege ()") public oble (trotingjoinpoint pjd) бросает throwable {// получить имя метода string classname = pjd.getSignature (). GetClass (). GetName (); // Получить имя метода выполнения string methodname = pjd.getSignature (). GetName (); / ** Печать журнала инициализации*/ logger log = loggerFactory.getLogger (className); // Определите объект возврата параметра Result = null; // Записать время начала длительного начала = system.currenttimemillis (); // Получить параметры метода [] args = pjd.getargs (); String params = "Передние параметры запроса:"; // Получить сбор и сплайс и сплайс для (объект объекта: args) {params + = object.tostring () + ","; } params = params.substring (0, params.length () - 1); // Распечатать параметр параметра запроса log.info (classname + "class" + methodname + "" + params); // выполнить целевой метод результат = pjd.proudece (); // Распечатайте return Message log.info («Метод возвращает сообщение как:» + (Результат результатов? (Результат) Результат: Результат)); // Получить время выполнения log.info (methodname + «Время выполнения метода:» + (System.currentTimeMillis () - Start)); результат возврата; }5. @Around Округая, как показано в вышеуказанном коде, это окружение уведомления, которое имеет параметр «Продолжающееся
Где pjd.proceed (); Метод представляет выполнение целевого метода и получение возвращаемого значения типа объекта. Мы можем обработать возвращаемое значение, например, обработка украшения и т. Д.
Значение возврата является результатом выполнения метода. В приведенном выше коде сначала получает имя класса, имя метода, параметры запроса метода и т. Д., Выполняет печать сплайсинга и записывает время начала выполнения метода и печатает его в журнале.
Затем выполните метод, получите результат возврата метода, распечатайте время выполнения и результат выполнения.
Наконец, результат выполнения возвращается. То есть раздел AOP, кодирующий сообщение запроса и возвратное сообщение завершено.
Где @Around представляет его как метод окружающего уведомления, он имеет следующие типы:
1. @before предварительный отмену, у которого есть параметр запроса, который используется для подключения деталей подключения текущей точки подключения, как правило, включая имя метода и значение параметра. Тело метода выполняется до выполнения метода, и параметры метода не могут быть изменены, и результаты выполнения метода не могут быть изменены.
@Before (value = "privilege ()") public void до (JoinPoint joinPoint) {}2. @after post уведомление: уведомление о том, что выполнение выполняется независимо от того, происходит ли исключение после выполнения целевого метода. В послеотировании результат выполнения целевого метода не может быть доступен (поскольку может произойти исключение), а результат выполнения метода не может быть изменен.
@Before (value = "privilege ()") public void после (joinpoint joinpoint) {}3. @afterreturning возвращает уведомление. Уведомление, которое выполняется только тогда, когда выполняется целевой метод, такое же, как и пост-оранжевый метод. Он может получить доступ к результату выполнения метода (из -за нормального выполнения) и деталей соединения метода, но не может изменить результат выполнения метода.
@AfterReturning (value = "privilege ()") public void после повторного повторного повторения (JoinPoint JoinPoint, результат объекта) {}Возвратное значение, хранящееся в результате, является методом.
4. @AfterThroing Exception Уведомление: код, который будет выполняться только тогда, когда происходит исключение в целевом методе. Атрибут броска представляет собой исключение, которое приводит к выполнению тела метода, и его значение должно соответствовать значению исключения в методе.
@AfterThrowing (value = "privilege ()", throwing = "ex") public void exceed (JoinPoint JoinPoint, Exception Ex) {}3. тест
Напишите метод контроллера
@Restcontroller@requestmapping ("/api/v1/dept") открытый класс deptcontroller extends basecontroller {/** class*/private logger log = loggerfactory.getlogger (getClass ()); / ** моя собственная услуга*/ @autowired Private Deptservice Service; /*** @function Описание: Метод для запроса содержимого отдела на основе идентификатора* @return Dept*/@getmapping ("/id/get") public result getbyid (идентификатор строки) Throws Exception {verify (new Verifyparam ("ID отдела", id)); вернуть новый результат («успешно полученный через ID!», Service.querybyid (id)); }}Таким образом, метод в нашем уровне контроллера очень кратко.
Результаты теста:
2018-04-10 22: 59: 27.468 Информация 1460 --- [NIO-8088-EXEC-5] NPROUDENTINGJOINPOINT $ MEDICENAUTURAUTIMPLIMPL: параметр запроса фронта
2018-04-10 22: 59: 27,470 Информация 1460 --- [Nio-8088-EXEC-5] NPROUDECTINGJOINPOINT $ MEDICATIONATURAUTIMPL: Метод возвращает сообщение как: Результат [Result_Code = SUC, Result_message = 22-й телефон = 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, указано. CreateTime = Чт 19 апреля 23:38:37 CST 2018, edittime = null]]
2018-04-10 22: 59: 27.470 Информация 1460 --- [NIO-8088-EXEC-5] NPROUDECTINGINPOINT $ MEDICENAUTURAUTIMPL: время выполнения метода GetByID: 2
Это позволяет печатать параметры запроса, возвращать результаты, время выполнения и т. Д. С помощью элегантной, краткой и краткой печати!