Предисловие
AOP является аббревиатурой для аспекта, ориентированного на программирование. Это концепция, противоположная объектно-ориентированному программированию. В объектно-ориентированном программировании мы склонны принимать такие понятия, как инкапсуляция, наследование и полиморфизм для реализации каждой функции в объекте. Однако в реальных ситуациях мы также обнаружили, что существует еще одно требование, чтобы во многих методах многих объектов необходим тип функции. Например, некоторые методы для доступа к базе данных имеют требования к управлению транзакциями, и многие методы требуют журналов печати. Объектно-ориентированным образом эти же функции должны осуществляться во многих местах или называются во многих местах. Это очень громоздко и слишком тесно связано с этими независимыми от бизнеса требованиями. Итак, позже, ориентированное на аспект программирование, по-видимому, решает этот тип проблемы и сделал хорошие добавки для объектно-ориентированного программирования
концепция
Чтобы хорошо понять, ориентированное на касательную программу, вы должны сначала понять некоторые концепции AOP. В Java AspectJ реализует функции AOP относительно полным способом, но он также более сложный в использовании, поэтому здесь в основном обсуждать AOP Spring. Spring AOP принимает принцип простоты и адекватности, чтобы реализовать основные функции AOP. Давайте сначала поговорим о конкретных концепциях в AOP
Реализация Sprinboot AOP
Мы использовали несколько глав для описания основного использования Springboot. Таким образом, мы используем Springboot и AOP для объединения для реализации функции вывода всех параметров ввода интерфейса REST и возврата журналов параметров.
Реализуйте функцию службы REST.
Согласно предыдущей статье, мы сначала построим проект Springboot, как показано на следующем рисунке
демонстрационный проект
Конфигурация проекта Springboot
Мы настраиваем проекты Springboot следующим образом
Сервер: порт: 3030 Сервлет: Context-Path: /aop-demospring: Джексон: Дата-формат: yyyy-mm-dd HH: MM: SS Serialization: odent-wput: truelogging: уровень: com.yanggch: отлаживание
Конфигурация, связанная с Джексоном, заключается в выводе объектов в строки JSON и форматировал вывод.
Класс контроллера, который реализует интерфейс отдыха
Здесь мы реализуем два интерфейса отдыха. Один из них - вернуть Hello Information. Одним из них является возвращение информации в системе входа на основе ввода.
Пакет com.yanggch.demo.aop.web; import com.yanggch.demo.aop.domain.loginity; import com.yanggch.demo.aop.domain.securityentity; импорт org.springframework.web.bindation.pathvariable; org.springframework.web.bind.annotation.requestbody; import org.springframework.web.bind.annotation.requestmapping; импорт org.springframework.web.bindtation.requestmethod; импорт org.spramework.web.bindtation.resttroller; java.util.date;/*** Служба отдыха, связанная с безопасностью,** @author: yang gaochao* @since: 2018-05-27*/ @ @restcontroller @requestmapping ("/api/v1/security") Общественный класс SecurityApi {@Requestmapping (value = "/login/{shopiD}", метод methodmet. Login (@Requestbody Loginity Loginity, @Pathvariable Long ShopId) {SecurityEntity SecurityEntity = New SecurityEntity (); SecurityEntity.SetShopid (ShopID); SecurityEntity.SetAccount (loginity.getAccount ()); SecurityEntity.SetPwd (loginity.getPwd ()); SecurityEntity.SetLogintime (New Date ()); вернуть безопасность; } @RequestMapping (value = "/echo/{name}", method = requestMethod.get) public String login (@pathvariable строки) {return "hello," + name; }}Во -первых, мы хотим вывести входные параметры и вернуть результаты всех интерфейсов REST в журнал через функцию AOP.
Реализовать функции Web AOP.
пакет com.yanggch.demo.aop.comment; import com.fasterxml.jackson.databind.objectmapper; import org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspect; импорт org.aspectj.lang.annotation.bere; org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; импорт org.springframework.multiotype.component; импорт org.springframework.web.multipart.multipartfile; javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse;/*** log интерфейса веб-интерфейса** @author: yang gaochao* @since: 2018-05-27*/ @asmocent @compontypubl class weblogaSpect Loggerfactory.getlogger (weblogaspect.class); Частный окончательный Mapper Mapper; @Autowired public weblogaspepe (ObjectMapper Mapper) {this.mapper = mapper; } @Pointcut (" @annotation (org.springframework.web.bind.annotation.requestmapping)") public void weblog () {} @before ("weblog ()") public void dobefore (jointoint jointpoint) {object object: joinpoint.get getargs () {if oancepoint) Httpservletrequest ||. } try {if (log.isdebugenabled ()) {log.debug (joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + ": запрос параметр:" + mapper.writevalueasString (объект)); }} catch (Exception e) {e.printstackTrace (); }}} @AfterReturning (returning = "response", pointcut = "weblog ()") public void doafterReturning (ответ объекта) бросает throgable {if (response! = Null) {log.debug ("Параметр ответа:" + mapper.writevalueSstring (response)); }}}Вот несколько вещей, на которые можно обратить внимание.
тест
На переднем плане запрос инициируется через почтальона, а результат ввода фона ввода заключается в следующем
2018-05-27 19: 58: 42,941 отладка 86072 --- [Nio-3030-Exec-4] C.yanggch.demo.aop.comment.weblogaspept: com.yanggch.demo.aop.web.secuty
"Учетная запись": "Янгч",
"PWD": "123456"
}
2018-05-27 19: 58: 42,941 отладка 86072 --- [Nio-3030-Exec-4] C.yanggch.demo.aop.comment.weblogaspept: com.yanggch.demo.aop.web.secuty
2018-05-27 19: 58: 42,942 отладка 86072 --- [Nio-3030-Exec-4] C.yanggch.demo.aop.comment.weblogaspepe: Параметр ответа: {{
"ShopId": 2001,
"Учетная запись": "Янгч",
"PWD": "123456",
"LogIntime": "2018-05-27 11:58:42"
}
2018-05-27 19: 58: 45,796 отладка 86072 --- [Nio-3030-Exec-5] C.yanggch.demo.aop.comment.weblogaspept: com.yanggch.demo.aop.web.securitpi
2018-05-27 19: 58: 45,796 Отладка 86072 --- [Nio-3030-EXEC-5] C.yanggch.demo.aop.comment.weblogaspepe: Параметр ответа: «Привет, янгхч»
Из этого мы можем видеть, что, хотя мы не записываем код для вывода журнала в методе интерфейса REST, мы можем автоматически добавить код для вывода параметров входа и возврата параметров в каждый метод ввода REST через AOP и правильно его выполнить.
Другие инструкции
Типы советов и язык выражения AOP для Pointcut упоминаются ранее. Для конкретных ссылок, пожалуйста, обратитесь к ним следующим образом.
Тип совета
AOP языка выражения
1. Сопоставление параметров метода
@args ()
2. Сопоставление описания метода
Выполнение (модификаторы-pattern? Ret-тип-паттерн объявляющий тип-pattern? Имя-паттерн (param-pattern) броски?)
где необходим шаблон возвращающегося типа, шаблон имени и шаблон параметров.
Полем Парттерн рет-типа: может быть имя класса, которое представляет любое возвращаемое значение, полный путь и т. Д.
*. Имя Pattern: укажите имя метода, * представляет все
.set представляет все методы, начиная с набора.
Полем Параметры Параметры: Укажите параметры метода (объявленный тип), (..) представляет все параметры, и () представляет один параметр
Полем (, Строка) означает, что первый параметр является любое значение, а второй - это тип строки.
3. Сопоставление типа типа объекта AOP AOP
4. Сопоставление целевого класса
@цель()
@в пределах()
5. Соответствующие методы, отмеченные этой аннотацией
@annotation ()
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.