AOP, я думаю, что все очень ясны. Иногда нам нужно обработать некоторые журналы запросов или отслеживать некоторые методы, и что следует обрабатывать, если есть исключения? Теперь мы представляем AOP от Spring-Boot.
[Среда разработки: номер версии JDK - 1,8, весна
Номер версии загрузки равна 1.4.1] {style = ”Founal-Color:#ff0000”}
Во -первых, сначала мы представим пакет JAR.
Файл POM добавляется следующим образом:
<!--Cite AOP--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><!--Cite GSON, for printing--><dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <версия> 2,7 </version> </depervice>
После представления пакета JAR мы добавляем два простых метода обработки запросов для загрузки запуска:
@Springbootapplication (scanbasepackages = {"com"})@restcontrollerpublic class demoapplication {public static void main (string [] args) {springApplication.run (demoApplication.class, args); } // Проверка запроса GET без аргументов @Requestmapping (value = "/testaspect", method = requestMethod.get) public uservo test () {uservo uservo = new uservo (); uservo.setage ("23"); uservo.setname ("он xiaowu"); uservo.setsex ("мужчина"); вернуть USERVO; } // Проверка запроса GET с параметрами, пусть AOP распечатает содержимое параметра @Requestmapping (value = "/testaspectargs", method = requestmethod.get) public uservo test (name string, строковое возраст, строковое секс) {uservo uservo = new uservo (); uservo.setname (имя); Uservo.setage (возраст); Uservo.setsex (секс); вернуть USERVO; }После добавления двух простых методов обработки запросов, давайте добавим наш AOP
/**! private Gson Gson = new Gson (); // Объявит точку в выражении исполнения @pointcut ("execution (public * com.example.demoApplication. * (..))") private void controlleraspect () {} // Печать содержимо (ServletRequestattributes) requestContextholder.getRequestattributes (); Httpservlectrequest request = requestattributes.getRequest (); // распечатать контент запроса log.info ("=============================================================== ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= ======================================================================= // распечатать возвращаемый контент после выполнения метода @afterreturning (returning = "o", pointcut = "controlleraspect ()") public void methodafterreturning (Object o) { log.info ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------После того, как эти два настроены, мы запрашиваем, а затем просматриваем журнал печати. Сначала запустите наш контейнер, а затем сначала запросим метод параметризованной обработки. Журнал печати выглядит следующим образом:
{width = ”1232”
высота = ”132”}
Можно обнаружить, что запрашиваемый URL -адрес, метод, значения параметров ARGS, типы и возвращаемый контент распечатаны, что указывает на то, что это успешно перехват AOP.
Далее мы проверяем метод обработки запроса без параметров и печатаем журнал следующим образом:
{width = ”1100”
высота = ”130”}
Мы можем обнаружить, что параметры метода, напечатанные в этом методе, представляют собой пустой массив, поскольку метод не требует передачи параметров.
Выше приведено Springboot ссылки AOP для обработки журнала веб -обработки. Вот некоторые основные аннотации для разделов AOP. Ниже приведены просто описания и использование аннотаций. Автор не будет тестировать их подробно. Если вам интересно, вы можете проверить их самостоятельно:
Аннотация класса:
@Aspect определяет класс как аспект класса
@Order (i) отмечает приоритет обработки класса Facet. Чем меньше значение I, тем выше уровень приоритета. PS: Вы можете аннотировать класс или аннотировать метод.
Метод аннотация:
@Pointcut определяет метод в виде точки, вырезанного как выражение, следующие детали
@Before выполняет метод перед касательной точкой, содержание является указанной касательной точкой
@After выполняется после вырезания точки, перед возвращением,
@Afterreturning выполняется после точки входа и возврата. Если вы хотите обработать параметры возврата некоторых методов, вы можете управлять им здесь.
@
@AfterThrowing бросает исключение после точки щели для обработки
@Order (i) отмечает приоритет вырезания точек. Чем меньше я, тем выше приоритет
@Pointcut комбинация аннотаций:
В приведенном выше коде мы определяем касательную точку, которая обрабатывает только указанный путь:
@Pointcut ("execution (public * com.example.demoapplication. * (..)") private void controleraspect () {}Теперь мы определяем точку, касающуюся, чтобы справиться с другими путями:
@Pointcut ("execution (public*com.demo.*.*(..))") private void controllerdemo () {}Вышеупомянутые точки касания все обрабатываются отдельно. Если нам нужна касательная точка для обработки их обоих, мы можем настроить ее так:
@Pointcut (value = "controlleraspect () || controllerdemo ()") private void all () {} В аннотации @pointcut непосредственно обращайтесь к другим именам методов, аннотированные @pointcut, так что вырезание точки может обрабатывать методы по двум путям
@Pointcut Annotation Execution Выражение: public*com.demo.*.*(..)
Первый общественный модификатор, представляющий метод, может использовать * вместо первого * для представления возвращаемого значения, и * представляет все
com.demo.* Package Path ,.* Представляет третий пакет в пути.* Представляет методы всех классов в рамках всех пакетов под пути.
(..) означает неограниченные параметры метода
Некоторые заметки об аннотации @Order (i):
Чем класс аннотаций, чем меньше значение, тем выше приоритет, метод аннотации, две аннотации аннотируются: @before, чем меньше значение I, тем выше приоритет, тем выше приоритет, тем более аннотированным: @after или @afterreturning, тем больше значение I, тем выше приоритет.
Подводя итог, это так:
В операции перед точкой входа операция после точки входа выполняется по значению заказа от малого до большого, а операция после точки входа выполняется по значению заказа от крупного до малого
продлевать:
Некоторые читатели могут спросить: если я хочу распечатать время, необходимое для запроса с входящего и окончательного, определить переменную члена, чтобы подсчитать время и дать @before и @afterreturning доступ, могут возникнуть проблемы с синхронизацией. Таким образом, мы ссылаемся на Threadlocal объект, который указывает общий тип. Время записи запроса в @before и вычтении записи в @afterreturning - это потребляемое время. Код заключается в следующем:
/**! private Gson Gson = new Gson (); Threadlocal <Long> startTime = new Threadlocal <long> (); // Объявит точку в выражении выполнения @pointcut ("execution (public * com.example.demoApplication. * (..))") private void controlleraspect () {} // Печать содержимого перед запросом метода @before (value = "controlleraspect ()") public void methodfore (jointpoint jointpoint) {startlime ServletRequestattributes requestAttributes = (servletrequestattributes) requestContexTholder.getRequestattributes (); Httpservlectrequest request = requestattributes.getRequest (); // распечатать контент запроса log.info ("========================================================================================================================= =================================================================== ==================================================================== =================================================================== ==================================================================== ==================================================================== ==================================================================== Arrays.tostring (joinpoint.getargs ())); log.info ("============================================================================================================= Arrays.tostring (joinpoint.getargs ())); log.info ("Содержание ответа:" + gson.tojson (o)); log.info ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Выше приведены все результаты, полученные в результате моего теста. Там могут быть различия или ошибки. Пожалуйста, поправьте меня.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.