Полное название АОП — Аспектно-ориентированное программирование, то есть аспектно-ориентированное программирование (также называемое аспектно-ориентированным программированием). Это дополнение к объектно-ориентированному программированию (ООП) и стало относительно зрелым методом программирования. В традиционном коде бизнес-обработки обычно выполняются такие операции, как обработка транзакций и регистрация. Хотя ООП может обеспечить повторное использование кода посредством комбинирования или наследования, если вы хотите реализовать определенную функцию (например, ведение журнала), один и тот же код все равно будет разбросан по различным методам. Таким образом, если вы хотите отключить функцию или изменить ее, вам необходимо изменить все связанные методы. Это не только увеличивает нагрузку на разработчиков, но и увеличивает частоту ошибок кода. Для решения этой проблемы родилась идея АОП. АОП использует механизм горизонтального извлечения для извлечения повторяющихся кодов, разбросанных различными методами, а затем применяет эти извлеченные коды к местам, которые необходимо выполнить при компиляции или запуске программы. Очевидно, что этот метод использования механизма горизонтального извлечения невозможно реализовать с помощью традиционного ООП-мышления, поскольку ООП может обеспечить только вертикальное повторное использование отношений родитель-потомок. Хотя АОП — это новая идея программирования, она не заменяет ООП. Это всего лишь расширение и дополнение ООП.
Вы можете взглянуть на взаимосвязь между классами и аспектами. Изображение предоставлено Dark Horse Programmer.
Ладно, теперь, когда я дошёл до этого шага, я не перестану говорить чушь и постараюсь объяснить АОП максимально понятно, не используя слишком много профессиональных терминов.
В нашем традиционном ООП (объектно-ориентированном программировании) мы надеемся внести некоторые изменения в наш исходный метод. Мы надеемся уведомить нашего начальника перед выполнением этого метода и сказать ему, что я начал выполнять задачу и не хочу ее делать. снова. После выполнения метода мне также нужно сообщить начальнику результаты выполнения. Итак, что бы вы сделали, как в приведенном ниже коде?
В этом действительно нет никакой проблемы, но задумывались ли вы об этом, если у нас начальник более серьезный и о каждой задаче нужно докладывать начальнику, вам все равно удобно писать такой код? Если у вас всего несколько задач, это нормально, но немного утомительно, а что, если у вас их пятьдесят или сто?
На этот раз АОП подчеркивает свои преимущества. Если вы не понимаете, что такое АОП, после прочтения введения, давайте сейчас посмотрим, что я понимаю.
У вас много задач, и вы не можете доложить о каждой задаче своему начальнику. В настоящее время существует организация, которая может помочь вам общаться с вашим начальником. Если вы хотите улучшить свои способности в выполнении своих задач, вы должны сообщить этой организации, что вам нужна их помощь. Что это значит? Поясню с картинкой.
Если вам нужна помощь, которую может предоставить вам АОП, вам необходимо предоставить АОП путь к методу, который вы хотите расширить свои бизнес-возможности. АОП улучшит метод, когда найдет этот метод, и он будет улучшен при вызове метода. .
Теперь вы наконец можете понять, что такое АОП.
Я использую только Round в приведенном ниже коде. Для других аннотаций вы можете прочитать другие статьи или попробовать самостоятельно.
Точка входа используется для описания того, какой метод мы хотим улучшить. Нам нужно предоставить ряд выражений, необходимых для точки входа.
Правила для выражений pointcut следующие.
execution(modifier? ret-type declaring-type?name-pattern(param-pattern) throws-pattern?)
Аннотация PointCut ниже передает выражение pointcut.
@Pointcut(value = "execution(* com.example.shardingsphere.controller.*.*(..))")
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Component
@Aspect
public class GlobalAspect {
@Pointcut(value = "execution(* com.example.shardingsphere.controller.*.*(..))")
public void pointCut(){}
@Around(value = "pointCut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object proceed = null;
System.out.println("Сообщите начальнику, чтобы он начал подсчет");
proceed = proceedingJoinPoint.proceed();
System.out.println("Сообщите начальнику статистические результаты");
return proceed;
}
}
Класс ProceedingJointPoint также имеет множество методов, которые можно использовать.,Например, такие функции, как получение параметров исходного метода。Следующее содержание перепечатано.
public interface JoinPoint {
String toString(); //Сопутствующая информация о расположении точки подключения
String toShortString(); //Краткая информация о расположении точки подключения
String toLongString(); //Вся актуальная информация о местоположении точки подключения
Object getThis(); //Возвращение в АОПАктерское объект мастерства, то есть com.sun.proxy.$Proxy18.
Object getTarget(); //Вернем целевой объект, обычно он нам нужен или (то есть интерфейс или класс, определяющий метод, почему это интерфейс?
//Это главным образом потому, что сам целевой объект является динамическим актерским В случае с мастерством, например Mapper. Итак, возвращается объект, в котором определен метод, например
//aoptest.daoimpl.GoodDaoImplилиcom.b.base.BaseMapper<T, E, PK>)
Object[] getArgs(); //Возвращаем список параметров метода уведомления
Signature getSignature(); //Вернем текущую подпись точки подключения. Его метод getName() возвращает полное доменное имя метода, например void aoptest.dao.GoodDao.delete()
//Или com.b.base.BaseMapper.insert(T) (Следует отметить, что часто, когда мы определяем подкласс для наследования родительского класса,
//Мы надеемся получить FQN на основе подкласса, который невозможно получить напрямую и зависит от
//AopUtils.getTargetClass(point.getTarget()) получает исходное актерское объект мастерство, о котором будет подробно рассказано ниже)
SourceLocation getSourceLocation();//Возвращает местоположение в файле класса, где находится метод точки подключения
String getKind(); //Тип точки подключения
StaticPart getStaticPart(); //Вернем статическую часть точки подключения
}
————————————————
Заявление об авторских правах: Эта статья является оригинальной статьей блоггера. CC 4.0 BY-SA авторское соглашение,
Исходная ссылка: https://blog.csdn.net/feiying0canglang/article/details/120711774.
Также добавьте комментарии к автозагрузке программы.
@EnableAspectJAutoProxy
Для тестирования я написал такой метод.
@GetMapping("/test2")
public String test(){
System.out.println("Начать подсчет зарплат компании");
return «Выполнение завершено»;
}
Результаты показаны ниже.
Как видите, АОП успешно расширил нашу исходную бизнес-логику, а это означает, что нам больше не нужно выполнять такую статистику в нашей бизнес-логике в будущем. Мы можем напрямую улучшить функции в аспектном классе, и код аспектного класса может быть изменен. повторное использование, повышая эффективность нашей разработки.
Каждый раз, когда мы хотим улучшить метод, нам нужно написать выражение. Если есть подстановочные знаки, это нормально. Но если мы используем подстановочные знаки, это означает, что все методы могут быть улучшены, но есть некоторые методы, которые мне не нужны. Что мы можем сделать? Это не имеет значения, для этого мы можем использовать собственные аннотации.
Наше выражение больше не указывает на метод, мы указываем на аннотацию. Какой бы метод ни добавил эту аннотацию, его необходимо улучшить.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAspect {
}
Измените выражение. Вот где мы определили эту аннотацию.
@Pointcut(value = "@annotation(com.example.shardingsphere.aop.MyAspect))")
Затем добавьте аннотацию @MyAspect к методу тестирования в нашем контроллере. Чтобы протестировать. Результат тот же.
Позвольте мне кратко упомянуть здесь, что АОП является динамичным актерским средством через Jdk. мастерствоили者Cglibдинамичныйактерское Реализовано мастерством, когда мы вызываем метод, который нам нужно улучшить, мы на самом деле вызываем актерское Методика занятий мастерством по актерскому мастерству Класс мастерства фактически выполняет нашу бизнес-логику. Хочу узнать об актерском динамике JDK. мастерство Вы можете проверить этот мой блог【Java】jdk1.8 Режим прокси-сервера Java, объяснение динамического прокси-сервера Jdk (очень подробное, с прикрепленным файлом класса) - блог CSDN