В этой статье представлен метод использования AOP в Springboot Project. Я поделюсь этим с вами. Детали следующие:
1. Обзор
Использование общей логики для реализации технологии AOP может значительно упростить написание программ, таких как проверка подписи, аутентификация и т. Д. Декларативные транзакции Spring также реализуются с помощью технологии AOP.
Для конкретного кода, пожалуйста, обратитесь к примеру проекта https://github.com/qihaiyan/springcamp/tree/master/spring-aop
Technology Spring AOP имеет четыре основных понятия:
PointCut: Point Cut, используемый для определения того, какой метод будет перехвачен, например, выполнение (*cn.springcamp.springaop.service.*.*(..)
Совет: действие, которое должно быть выполнено после перехвата метода
Аспект: среж, объедините точечную подъему и совету
Точка присоединения: экземпляр PointCut во время выполнения
Уивер: структура для реализации AOP, такую как AspectJ или Spring AOP
2. Определение определения точки
Обычно используемые определения точечной кишки включают выполнение и @Annotation. Выполнение определяет без метода и используется для реализации относительно распространенного раздела. @Annotation можно добавить в качестве аннотации к конкретным методам, таким как аннотация транзакции Spring.
Определение точки выполнения должно быть размещено в публичном классе, чтобы централизованно управлять определением с точкой.
Пример:
Public Class CommonJoinpointConfig {@pointcut ("execution (*cn.springcamp.springaop.service.*.*(..)") public void serviceLayerexecution () {}}Таким образом, в конкретном аспекте вы можете обратиться к касательной точке через CommonjoinpointConfig.serviceLayerExecution ().
открытый класс beforeaSpept {@before ("commonjoinpointconfig.servicelayerexecution ()") public void до (joinpoint joinpoint) {system.out.println ("---------------> перед аспектом"); System.out.println ("-----------------> перед выполнением" + joinpoint); }}Когда необходимо изменить касательную точку, вам нужно только изменить класс CommonjoinpointConfig, без изменения каждого класса аспекта.
3. обычно используется разрезание лица
Перед: выполнить советы до выполнения метода, который часто используется для проверки подписи, аутентификации и т. Д.
После: выполнить после завершения выполнения метода, независимо от того, является ли выполнение успешным или исключение.
После повторения: выполнить только после успешного выполнения метода.
Последствия: выполнить только после того, как выполнение метода бросает исключение.
Простой аспект:
@Aspose @ComponentPublic Class BeForeAspepe {@before ("commonjoinpointConfig.serviceLayerexeCution ()") public void до (JoinPoint joinPoint) {System.out.println ("-------------------> перед аспектом"); System.out.println ("----------------> Перед выполнением" + JoinPoint); }}4. Пользовательские аннотации
Предположим, мы хотим собрать время выполнения конкретного метода, более разумным способом является настройка аннотации, а затем добавить эту аннотацию к методу, который должен собирать время выполнения.
Сначала определите трек аннотации:
@Target ({elementType.method, elementtype.type}) @hareveration (armentpolicy.runtime) public @Interface Tracktime {String param () default ";";}Затем определите класс аспекта для реализации поведения аннотации:
@Ampost@ComponentPublic Class TrackTimeAspect {@Around ("@Annotation (TrackTime)") Общедоступный объект вокруг (ход Joinpoint JoinPoint, Tracktime Tracktime) бросает Throwable {Object result = null; long starttime = System.currentTimeMillis (); result = joinpoint.proceed (); long Timetaken = System.currentTimeMillis () - startTime; System.out.println ("------------------> Время, принятое" + joinpoint + "с param [" + tracktime.param () + "]," + timeTaken); результат возврата; }}Используя эту аннотацию по методу, вы можете собрать время выполнения этого метода:
@Tracktime (param = "myservice") public String runfoo () {System.out.println ("--------------------> foo"); вернуть "foo";}Обратите внимание, что аннотация @TrackTime (param = "myService") может быть передана.
Чтобы аннотации проходили параметры, вам необходимо указать параметр string param () по умолчанию «по умолчанию» при определении аннотаций.
В то же время, в классе аспекта, соответствующие параметры добавляются к методу вокруг. Имя переменной параметра также должно быть отслеживанием времени в аннотации @Around, но не в треке имени класса.
@Around ("@Annotation (Tracktime)") Общедоступный объект вокруг (RotingingJoinpoint JoinPoint, Tracktime Tracktime)5. Резюме
При запуске образца проекта консоль выводит следующее:
----------------> Перед аспектом
---------------> Перед выполнением выполнения (String cn.springcamp.springaop.service.myservice.runfoo ())
---------------> Фу
---------------> Время, принятое в результате выполнения (String cn.springcamp.springaop.service.myservice.runfoo ()) с Param [myservice]-8
---------------> после аспекта
---------------> после выполнения выполнения (String cn.springcamp.springaop.service.myservice.runfoo ())
---------------> После повторного аспекта
----------------> execution (String cn.springcamp.springaop.service.myservice.runfoo ()) возвращается со значением foo
Можно видеть, что порядок выполнения нескольких аспектов ранее после повторного повторения (после прохождения)
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.