Главная » Spring » Поддержка AOP в Spring

0

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

За последние несколько лет в AOP многое изменилось. В резуль- тате наведения порядка в этой области некоторые фреймворки объ- единились, а некоторые исчезли со сцены. В 2005 году произошло слияние проектов AspectWerkz и AspectJ, ознаменовавшее самое

значительное событие в мире AOP и оставившее нам три домини- рующих фреймворка AOP:

#  AspectJ (http://eclipse.org/aspectj);

#  JBoss AOP (http://www.jboss.org/jbossaop);

#  Spring AOP (http://www.springframework.org).

Поскольку данная книга посвящена фреймворку Spring, мы со- средоточимся на Spring AOP. Тем не менее проекты Spring и AspectJ тесно взаимодействуют друг с другом, и реализация поддержки AOP в Spring многое заимствует из AspectJ.

Фреймворк Spring поддерживает четыре разновидности AOP:

# классическое  аспектно-ориентированное  программирование на основе промежуточных объектов;

# аспекты, создаваемые с применением аннотаций @AspectJ;

#  аспекты на основе POJO;

# внедрение аспектов AspectJ (доступно во всех версиях Spring). Первые три разновидности являются вариантами аспектно-ориен-

тированного программирования на основе промежуточных объектов.

Соответственно, поддержка AOP в Spring ограничивается перехва- том вызовов методов. Если для работы аспекта потребуется нечто более сложное, чем простой перехват вызовов методов (например, перехват вызова конструктора или определение момента изменения значения свойства), следует подумать о возможности реализации аспектов в AspectJ, возможно, через внедрение компонентов Spring в аспекты AspectJ посредством механизма внедрения зависимостей.

Как? В Spring отсутствует поддержка классического AOP? Опре- деление «классический» обычно несет положительную эмоциональную окраску. Классические автомобили, классические турниры по гольфу, классическая кока-кола – все это воспринимается как положительная характеристика.

Но классическая модель аспектно-ориентированного программирования в Spring не отличается положительными качествами. Да, она была хороша в свое время. Но сейчас фреймворк Spring поддерживает более ясные и простые способы работы с аспектами. В сравнении с простым декла- ративным AOP и AOP на основе аннотаций классическое AOP выглядит громоздким и слишком сложным. Работа непосредственно с объектами ProxyFactoryBean может оказаться слишком утомительной.

Поэтому я решил не включать в это издание обсуждение поддержки клас-

сического аспектно-ориентированного программирования в Spring. Если вам действительно интересно знать, как действует данная модель, за- гляните в два первых издания этой книги. Но я думаю, что новые модели Spring AOP покажутся вам более простыми в использовании.

В этой главе мы исследуем приемы аспектно-ориентированного программирования с использованием фреймворка Spring, но прежде разберемся с некоторыми ключевыми понятиями фреймворка AOP.

Советы в Spring реализуются на языке Java

Все советы, которые вы будете создавать с использованием фреймворка Spring, будут написаны как стандартные Java-классы. То есть при создании аспектов можно пользоваться той же самой интегрированной средой разработки, которая используется для раз- работки обычного программного кода на Java. К тому же срезы мно- жества точек сопряжения, указывающие, где должны применяться советы, обычно определяются в XML-файле конфигурации Spring.

Сравните это с AspectJ. Сейчас AspectJ поддерживает возмож- ность определения аспектов на основе аннотаций, но это – расши- рение языка Java. В таком подходе есть свои преимущества и недо- статки. Наличие языка AOP предполагает широкие возможности и богатый набор инструментов AOP, однако прежде чем все это ис- пользовать, необходимо изучить инструменты и синтаксис.

Советы в Spring – это объекты времени выполнения

При использовании  фреймворка  Spring,  аспекты  вплетаются в компоненты во время выполнения посредством обертывания их прокси-классами. Как показано на рис. 5.3, прокси-класс играет роль целевого компонента, перехватывая вызовы методов и передавая эти вызовы целевому компоненту.

Рис. 5.3. Аспекты Spring реализуются в виде прокси-объектов, обертывающих целевые объекты. Прокси-объект обрабатывает вызовы методов, выполняет дополнительную логику аспекта

и затем вызывает целевой метод

Между моментами времени, когда прокси-объект перехватывает вызов метода, и вызовом метода целевого компонента выполняется логика аспекта.

Фреймворк Spring не создает проксированные объекты, пока в них нет необходимости. При использовании контекста приложения ApplicationContext проксированные объекты создаются после загруз- ки всех компонентов из BeanFactory. Поскольку Spring создает прок- си-объекты во время выполнения, для вплетения аспектов в Spring AOP не требуется специальный компилятор.

Spring поддерживает точки сопряжения только для методов

Как упоминалось выше, различные реализации AOP обеспечива- ют несколько моделей точек сопряжения. Так как поддержка AOP в Spring основана на использовании динамических прокси-объектов, точками сопряжения могут служить только методы, в отличие от неко- торых других фреймворков AOP, таких как AspectJ и JBoss, где поми- мо методов роль точек сопряжения могут играть поля и конструкторы. Отсутствие в Spring возможности применения аспектов к полям пре- пятствует созданию высокоизбирательных аспектов, например для от- слеживания изменений полей в объектах. Невозможность применить аспект к конструктору также препятствует реализации логики, кото- рая должна выполняться в момент создания экземпляра компонента.

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

Теперь, получив общее представление о возможностях AOP и осо- бенностях его поддержки в Spring, можно перейти к практическому изучению принципов создания аспектов в Spring. Сначала познако- мимся поближе с декларативной моделью AOP.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии