Объяснение аспектно-ориентированного программирования весной с помощью spring-proxy
Здравствуйте, я начал изучать spring MVC. Сделано достаточно хорошо, чтобы написать код, но я все еще нахожу AOP как трудную концепцию для понимания, уже проверил этот пост . И прошелся по весенней документации. Я все еще нахожу это запутанным, так как объяснение не в мирских терминах и трудно понять. АОП имеют общий пример ведения журнала. Все еще не понимала ее душа. Не могли бы вы объяснить на непрофессиональном языке, что такое понятия с образцовой реализацией и без нее. Один ссылка на хороший учебник приветствуется. Пожалуйста, не публикуйте длинные аргументы, чтобы этот пост стал бесполезным. Это предназначено только для объяснения. Преимущества / недостатки его использования можно пока игнорировать.
1 ответ:
Я думаю, что самый простой способ взглянуть на Аспектирование с точки зрения определения-это декларативный способ определить прокси (или прокси) с помощью одного выражения.
Надуманная ситуация:
Скажите, что вы хотите подсчитать, сколько раз вызывается метод 'getter', любой метод getter в вашем приложении. Ну, вы находите каждый метод "добытчика" индивидуально и увеличиваете некоторый статический счетчик. Это может быть приемлемо для вас, но вам также нужно будет убедиться, что вы делаете то же самое для каждого метода "геттера", который добавляется в ваше приложение с этого момента.
Рассмотрим один аспект:
Аспект состоит из двух основных вещей. Прокси, который является выполняемым кодом, и декларативное выражение, которое сообщает, где применяется прокси-код.
Прокси-сервер может быть написан для "геттера", который либо до, либо после вызова метода автоматически увеличивает счетчик. Проблема с этим прокси-сервером заключается в том, что он все еще должен быть применяется к каждому методу "добытчика". Вот где сияет аспект. Вы можете написать краткое определение (с помощью вашего любимого языка выражения aspecting libraries), которое говорит: "Сделайте этот прокси для всех методов "getter".
Пример Использования SpringAOP:
@Aspect public class MyAspect { private static int counter = 0; @Before("execution(* get*())") public void incrementCounterProxy() { counter++; } }
Описание примера:
Предполагая, что у вас есть все настроено с вашим контейнером весны должным образом, чтобы забрать аспекты, это должно выполнить нашу надуманную цель.
@Aspect
помечает наш класс как класс, который является кандидатом на содержание аспектов.@Before
отмечает наш прокси-тип. Код в методе будет прокси-сервером, который выполняет действия только перед вызовом целевого метода.execution(* get*())
- это наше декларативное выражение, которое применяет этот прокси ко всем исполнениям методов, которые начинаются с " get " и не имеют параметров.