Главная » Spring » Внедрение с помощью аннотаций Spring

0

Выше было показано, как с помощью элемента <aop:declare- parents> внедрить реализацию интерфейса в существующий компо- нент, не изменяя исходного программного кода. Теперь посмотрим на этот же пример с другой стороны, но на этот раз задействуем аннотации AOP.

Эквивалентом элемента <aop:declare-parents> в множестве анно- таций @AspectJ является аннотация @DeclareParents. Она действует практически так же, как и родственный ей XML-элемент, когда используется внутри класса, отмеченного аннотацией @Aspect. Лис- тинг 5.8 демонстрирует использование аннотации @DeclareParents.

Листинг 5.8. Внедрение интерфейса Contestant с использованием аннотаций  @AspectJ

package com.springinaction.springidol;

import  org.aspectj.lang.annotation.Aspect;

import  org.aspectj.lang.annotation.DeclareParents;

@Aspect

public  class  ContestantIntroducer  {

@DeclareParents(                                        // Внедрение  интерфейса  Contestant value    =    "com.springinaction.springidol.Performer+",

defaultImpl = GraciousContestant.class) public  static  Contestant  contestant;

}

Как видите, ContestantIntroducer – это аспект. Но в отличие от аспектов, создававшихся до сих пор, он не содержит никаких сове- тов. Зато он внедряет интерфейс Contestant в компоненты Performer. Подобно элементу <aop:declare-parents>, аннотация @DeclareParents со- стоит из трех частей.

#  Атрибут value  является эквивалентом атрибуту types-matching

элемента <aop:declare-parents>. Он определяет тип компонен- тов, в которые должен быть внедрен интерфейс.

# Атрибут defaultImpl является эквивалентом атрибуту defaultimpl

элемента <aop:declare-parents>. Он определяет класс, реализую- щий внедряемый интерфейс.

# Статическое свойство, к которому применяется аннотация

@DeclareParents, определяет внедряемый интерфейс.

Как и для любых других аспектов, класс ContestantIntroducer сле- дует объявить компонентом в контексте приложения Spring:

<bean   class="com.springinaction.springidol.ContestantIntroducer"   />

Теперь, когда элемент <aop:aspectj-autoproxy> обнаружит компо- нент, отмеченный аннотацией @Aspect, он автоматически создаст прокси-объект, делегирующий вызовы методов либо целевому объ- екту, либо реализации внедренного интерфейса, в зависимости от принадлежности вызываемого метода.

Обратите внимание, что аннотация @DeclareParents не имеет эк- вивалента атрибуту delegate-ref элемента <aop:declare-parents>. Это обусловлено тем, что @DeclareParents является аннотацией @AspectJ.

@AspectJ – это независимый от Spring проект, поэтому его анно- тации не обеспечивают поддержку компонентов. Отсюда следует, что если реализация внедряемого интерфейса оформлена в ви- де компонента, объявленного в конфигурации Spring, аннотация

@DeclareParents может оказаться бесполезной и вам придется прибег- нуть к использованию элемента <aop:declare-parents>.

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

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

По теме:

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