[Весна] Введение и базовое использование AOP в Spring, SpringBoot использует AOP.
[Весна] Введение и базовое использование AOP в Spring, SpringBoot использует AOP.

1. Введение в АОП

Полное название АОП — Аспектно-ориентированное программирование, то есть аспектно-ориентированное программирование (также называемое аспектно-ориентированным программированием). Это дополнение к объектно-ориентированному программированию (ООП) и стало относительно зрелым методом программирования. В традиционном коде бизнес-обработки обычно выполняются такие операции, как обработка транзакций и регистрация. Хотя ООП может обеспечить повторное использование кода посредством комбинирования или наследования, если вы хотите реализовать определенную функцию (например, ведение журнала), один и тот же код все равно будет разбросан по различным методам. Таким образом, если вы хотите отключить функцию или изменить ее, вам необходимо изменить все связанные методы. Это не только увеличивает нагрузку на разработчиков, но и увеличивает частоту ошибок кода. Для решения этой проблемы родилась идея АОП. АОП использует механизм горизонтального извлечения для извлечения повторяющихся кодов, разбросанных различными методами, а затем применяет эти извлеченные коды к местам, которые необходимо выполнить при компиляции или запуске программы. Очевидно, что этот метод использования механизма горизонтального извлечения невозможно реализовать с помощью традиционного ООП-мышления, поскольку ООП может обеспечить только вертикальное повторное использование отношений родитель-потомок. Хотя АОП — это новая идея программирования, она не заменяет ООП. Это всего лишь расширение и дополнение ООП.

Вы можете взглянуть на взаимосвязь между классами и аспектами. Изображение предоставлено Dark Horse Programmer.

Ладно, теперь, когда я дошёл до этого шага, я не перестану говорить чушь и постараюсь объяснить АОП максимально понятно, не используя слишком много профессиональных терминов.

2. Личное обсуждение АОП

В нашем традиционном ООП (объектно-ориентированном программировании) мы надеемся внести некоторые изменения в наш исходный метод. Мы надеемся уведомить нашего начальника перед выполнением этого метода и сказать ему, что я начал выполнять задачу и не хочу ее делать. снова. После выполнения метода мне также нужно сообщить начальнику результаты выполнения. Итак, что бы вы сделали, как в приведенном ниже коде?

В этом действительно нет никакой проблемы, но задумывались ли вы об этом, если у нас начальник более серьезный и о каждой задаче нужно докладывать начальнику, вам все равно удобно писать такой код? Если у вас всего несколько задач, это нормально, но немного утомительно, а что, если у вас их пятьдесят или сто?

На этот раз АОП подчеркивает свои преимущества. Если вы не понимаете, что такое АОП, после прочтения введения, давайте сейчас посмотрим, что я понимаю.

У вас много задач, и вы не можете доложить о каждой задаче своему начальнику. В настоящее время существует организация, которая может помочь вам общаться с вашим начальником. Если вы хотите улучшить свои способности в выполнении своих задач, вы должны сообщить этой организации, что вам нужна их помощь. Что это значит? Поясню с картинкой.

Если вам нужна помощь, которую может предоставить вам АОП, вам необходимо предоставить АОП путь к методу, который вы хотите расширить свои бизнес-возможности. АОП улучшит метод, когда найдет этот метод, и он будет улучшен при вызове метода. .

Теперь вы наконец можете понять, что такое АОП.

3. Несколько аннотаций основных методов в АОП

Я использую только Round в приведенном ниже коде. Для других аннотаций вы можете прочитать другие статьи или попробовать самостоятельно.

4. Несколько основных атрибутов АОП

1. Пойнт Кут

Точка входа используется для описания того, какой метод мы хотим улучшить. Нам нужно предоставить ряд выражений, необходимых для точки входа.

Правила для выражений pointcut следующие.

Язык кода:javascript
копировать
execution(modifier? ret-type declaring-type?name-pattern(param-pattern) throws-pattern?)
  • модификатор: соответствует модификаторам, общедоступным, частным и т. д., соответствует любому модификатору, если он опущен.
  • ret-type: соответствует типу возвращаемого значения, используйте * для соответствия любому типу
  • тип объявления: соответствует целевому классу, соответствует любому типу, если он опущен
    • .. Соответствует любому пакету и его подпакетам.
  • name-pattern: имя метода сопоставления, использование * Представляет собой подстановочный знак
    • * Представляет все методы
    • set* Сопоставьте имена с set Как начать
  • param-pattern: соответствие типа и количества параметра.
    • () соответствует методам без параметров
    • (..) соответствует методам с любым количеством аргументов
    • (*) Сопоставляет методы с произвольным параметром
    • (*,int) Соответствует методу с двумя аргументами, где первый имеет любой тип, а второй — int тип
  • throws-pattern: Соответствует типу выброшенных исключений.,Если этот параметр опущен, соответствует любому типу.

Аннотация PointCut ниже передает выражение pointcut.

Язык кода:javascript
копировать
@Pointcut(value = "execution(* com.example.shardingsphere.controller.*.*(..))")

5. Демонстрация кода

1.SpringBoot представляет зависимости

Язык кода:javascript
копировать
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2. Определите АОП, который является классом аспектов.

Язык кода:javascript
копировать
@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 также имеет множество методов, которые можно использовать.,Например, такие функции, как получение параметров исходного метода。Следующее содержание перепечатано.

Язык кода:javascript
копировать
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.

Также добавьте комментарии к автозагрузке программы.

Язык кода:javascript
копировать
@EnableAspectJAutoProxy

Для тестирования я написал такой метод.

Язык кода:javascript
копировать
@GetMapping("/test2")
    public String test(){
        System.out.println("Начать подсчет зарплат компании");
        return «Выполнение завершено»;
    }

Результаты показаны ниже.

Как видите, АОП успешно расширил нашу исходную бизнес-логику, а это означает, что нам больше не нужно выполнять такую ​​​​статистику в нашей бизнес-логике в будущем. Мы можем напрямую улучшить функции в аспектном классе, и код аспектного класса может быть изменен. повторное использование, повышая эффективность нашей разработки.

3. Улучшите свои возможности с помощью пользовательских аннотаций

Каждый раз, когда мы хотим улучшить метод, нам нужно написать выражение. Если есть подстановочные знаки, это нормально. Но если мы используем подстановочные знаки, это означает, что все методы могут быть улучшены, но есть некоторые методы, которые мне не нужны. Что мы можем сделать? Это не имеет значения, для этого мы можем использовать собственные аннотации.

Наше выражение больше не указывает на метод, мы указываем на аннотацию. Какой бы метод ни добавил эту аннотацию, его необходимо улучшить.

Язык кода:javascript
копировать
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAspect {
}

Измените выражение. Вот где мы определили эту аннотацию.

Язык кода:javascript
копировать
@Pointcut(value = "@annotation(com.example.shardingsphere.aop.MyAspect))")

Затем добавьте аннотацию @MyAspect к методу тестирования в нашем контроллере. Чтобы протестировать. Результат тот же.

6. Принципы реализации АОП

Позвольте мне кратко упомянуть здесь, что АОП является динамичным актерским средством через Jdk. мастерствоили者Cglibдинамичныйактерское Реализовано мастерством, когда мы вызываем метод, который нам нужно улучшить, мы на самом деле вызываем актерское Методика занятий мастерством по актерскому мастерству Класс мастерства фактически выполняет нашу бизнес-логику. Хочу узнать об актерском динамике JDK. мастерство Вы можете проверить этот мой блог【Java】jdk1.8 Режим прокси-сервера Java, объяснение динамического прокси-сервера Jdk (очень подробное, с прикрепленным файлом класса) - блог CSDN

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose