Объяснение аспектно-ориентированного программирования весной с помощью spring-proxy


Здравствуйте, я начал изучать spring MVC. Сделано достаточно хорошо, чтобы написать код, но я все еще нахожу AOP как трудную концепцию для понимания, уже проверил этот пост . И прошелся по весенней документации. Я все еще нахожу это запутанным, так как объяснение не в мирских терминах и трудно понять. АОП имеют общий пример ведения журнала. Все еще не понимала ее душа. Не могли бы вы объяснить на непрофессиональном языке, что такое понятия с образцовой реализацией и без нее. Один ссылка на хороший учебник приветствуется. Пожалуйста, не публикуйте длинные аргументы, чтобы этот пост стал бесполезным. Это предназначено только для объяснения. Преимущества / недостатки его использования можно пока игнорировать.

1 2

1 ответ:

Я думаю, что самый простой способ взглянуть на Аспектирование с точки зрения определения-это декларативный способ определить прокси (или прокси) с помощью одного выражения.

Надуманная ситуация:

Скажите, что вы хотите подсчитать, сколько раз вызывается метод 'getter', любой метод getter в вашем приложении. Ну, вы находите каждый метод "добытчика" индивидуально и увеличиваете некоторый статический счетчик. Это может быть приемлемо для вас, но вам также нужно будет убедиться, что вы делаете то же самое для каждого метода "геттера", который добавляется в ваше приложение с этого момента.

Рассмотрим один аспект:

Аспект состоит из двух основных вещей. Прокси, который является выполняемым кодом, и декларативное выражение, которое сообщает, где применяется прокси-код.

Прокси-сервер может быть написан для "геттера", который либо до, либо после вызова метода автоматически увеличивает счетчик. Проблема с этим прокси-сервером заключается в том, что он все еще должен быть применяется к каждому методу "добытчика". Вот где сияет аспект. Вы можете написать краткое определение (с помощью вашего любимого языка выражения aspecting libraries), которое говорит: "Сделайте этот прокси для всех методов "getter".

Пример Использования SpringAOP:

@Aspect
public class MyAspect
{
    private static int counter = 0;

    @Before("execution(* get*())")
    public void incrementCounterProxy()
    {
        counter++;
    }
}

Описание примера:

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

  1. @Aspect помечает наш класс как класс, который является кандидатом на содержание аспектов.
  2. @Before отмечает наш прокси-тип. Код в методе будет прокси-сервером, который выполняет действия только перед вызовом целевого метода.
  3. execution(* get*()) - это наше декларативное выражение, которое применяет этот прокси ко всем исполнениям методов, которые начинаются с " get " и не имеют параметров.