Главная » Spring » Объявление советов, выполняемых до или после Spring

0

С помощью элементов настройки механизма Spring AOP компо- нент audience можно превратить в аспект, как показано в листин- ге 5.2.

Листинг 5.2. Определение аспекта audience с использованием элементов настройки Spring AOP

<aop:config>

<aop:aspect  ref="audience">                  <!–  Ссылка  на  компонент  audience  –>

<aop:before pointcut=

"execution(*       com.springinaction.springidol.Performer.perform(..))" method="takeSeats" />                <!– Перед выступлением –>

<aop:before pointcut=

"execution(*       com.springinaction.springidol.Performer.perform(..))" method="turnOffCellPhones" />   <!– Перед выступлением –>

<aop:after-returning  pointcut=

"execution(*       com.springinaction.springidol.Performer.perform(..))" method="applaud" />                   <!– После выступления –>

<aop:after-throwing  pointcut=

"execution(*       com.springinaction.springidol.Performer.perform(..))" method="demandRefund" />        <!– После неудачного выступления –>

</aop:aspect>

</aop:config>

Первое, на что следует обратить внимание, – большинство эле- ментов настройки должны находиться внутри элемента <aop:config>.

Есть некоторые исключения из этого правила, но когда дело доходит до объявления компонентов аспектами, конфигурация всегда долж- на начинаться с элемента <aop:config>.

Внутри <aop:config> можно объявить один или более объектов-со- ветников, аспектов или срезов множества точек сопряжения. В лис- тинге 5.2 был объявлен единственный аспект с помощью элемента

<aop:aspect>. Атрибут ref ссылается на компонент POJO, реализую- щий функциональность аспекта, в данном случае audience. Компо- нент, на который ссылается атрибут ref, определяет методы, вызы- ваемые советами в аспекте.

Сам аспект определяет четыре совета. Два элемента <aop:before> определяют советы, выполняемые перед вызовом метода, которые будут вызывать методы takeSeats() и turnOffCellPhones() компонента Audience перед вызовами любых методов, определяемых срезом с точ- ками сопряжения. Элемент <aop:after-returning> определяет совет, выполняемый после успешного завершения метода и вызывающий метод applaud() после любых методов, определяемых срезом. И эле- мент <aop:after-throwing> определяет совет, выполняемый в случае воз- буждения исключения и вызывающий метод demandRefund(), если было возбуждено какое-либо исключение. На рис. 5.6 иллюстрирует, как логика советов вплетается в основную логику работы приложения.

Рис. 5.6. Аспект Audience включает четыре совета, вплетаемых в логику вызова методов, определяемых срезом с точками сопряжения

Во всех элементах, объявляющих советы, атрибут pointcut – срез множества точек сопряжения, где будет применяться данный совет. Значением атрибута pointcut является определение среза с примене- нием синтаксиса выражений AspectJ.

Обратите внимание, что во всех элементах объявления советов атрибут pointcut имеет одинаковое значение, потому что все советы применяются к одному и тому же срезу множества точек сопряжения.

Однако это является нарушением принципа DRY(don’t repeat yourself – не повторяйся). Если впоследствии потребуется изменить определение среза, это придется сделать в четырех различных местах.

Чтобы избежать дублирования определений срезов множества то- чек сопряжения, можно определить именованный срез с помощью элемента <aop:pointcut>. В листинге 5.3 представлен фрагмент XML, демонстрирующий, как внутри элемента <aop:aspect> определить именованный срез с помощью элемента <aop:pointcut>, который за- тем можно использовать во всех элементах определения советов.

Листинг 5.3. Определение именованного среза множества точек сопряжения для устранения избыточных определений срезов

<aop:config>

<aop:aspect ref="audience">

<aop:pointcut  id="performance"  expression=

"execution(*  com.springinaction.springidol.Performer.perform(..))"

/> <!– Определение среза множества точек сопряжения –>

<aop:before

pointcut-ref="performance"     <!– Ссылка на именованный срез –> method="takeSeats"  />

<aop:before

pointcut-ref="performance"     <!– Ссылка на именованный срез –> method="turnOffCellPhones" />

<aop:after-returning

pointcut-ref="performance"     <!– Ссылка на именованный срез –> method="applaud" />

<aop:after-throwing

pointcut-ref="performance"     <!– Ссылка на именованный срез –> method="demandRefund"   />

</aop:aspect>

</aop:config>

Теперь определение среза, ссылки на который используются в не- скольких местах, существует в единственном экземпляре. Элемент

<aop:pointcut> определяет срез множества точек сопряжения с иден- тификатором performance. Кроме того, во всех элементах, объявляю- щих советы, определения срезов были заменены атрибутом pointcut- ref со ссылкой на именованный срез.

Как показано в листинге 5.3, элемент <aop:pointcut> определяет срез множества точек сопряжения, на который можно ссылаться из любых советов, объявленных внутри того же элемента <aop:aspect>. Однако имеется возможность определять срезы, на которые можно ссылаться из разных аспектов, для чего достаточно поместить эле- менты <aop:pointcut> в область действия элемента <aop:config>.

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

По теме:

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