Главная » Spring » Объявление перехватчиков с помощью аннотаций Spring

0

Помимо внедрения зависимостей, Pitchfork поддерживает также аннотации EJB 3 объявления перехватчиков. Перехватчики EJB 3 – это простейшая форма советов, выполняемых и до, и после вызова целевого метода, которые могут применяться с помощью аннотаций.

Например, класс Minstrel из главы 1 можно было бы переписать с применением аннотации @AroundInvoke, как показано в листинге 16.3.

Листинг 16.3. Класс менестреля, преобразованный в перехватчик с помощью аннотации EJB 3

package  com.springinaction.knight;

// инструкции импортирования опущены

public  class  Minstrel  {

@AroundInvoke  // Объявление перехватывающего метода public Object singAboutQuest(InvocationContext ctx)

throws  Exception  {

Knight  knight  =  (Knight)  ctx.getTarget();

Logger  song  =

Logger.getLogger(knight.getClass()); Method  method  =  ctx.getMethod();

song.debug("Brave   "   +   knight.getName()   + "  did  "  +  method.getName());

Object rtn =  ctx.proceed();       // Вызов  целевого метода

return rtn;

}

}

Аннотация @AroundInvoke объявляет, что метод будет вызывать- ся при перехвате вызова целевого метода. В данном случае метод singAboutQuest() будет вызываться перед вызовом целевого метода, чтобы менестрель смог воспеть подвиг рыцаря.

Сама аннотация @AroundInvoke лишь определяет метод-перехватчик. Поэтому нам необходимо как-то применить его к классу BraveKnight. Для этого можно воспользоваться аннотацией @Interceptors:

@Interceptors({Minstrel.class})

public  class  BraveKnight  implements  Knight  {

}

Аннотация @Interceptors принимает массив из одного или более классов-перехватчиков (то есть классов, имеющих методы, отме- ченные аннотацией @AroundInvoke). Когда класс отмечается аннота- цией @Interceptors, вызовы всех его методов будут перехватываться классами-перехватчиками, указанными в списке. Поскольку класс BraveKnight имеет единственный метод embarkOnQuest(), перехваты- ваться будут только вызовы этого метода. Однако, если потребует- ся уточнить, вызовы каких методов могут перехватываться, можно переместить аннотацию @Interceptors на уровень методов:

@Interceptors({Minstrel.class}) public void embarkOnQuest() {

quest.embark();

}

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

Другой способ ограничить перечень перехватываемых вызовов методов заключается в использовании аннотации @ExcludeClassInter- ceptors. При применении к конкретному методу аннотация @Exclude- ClassInterceptors будет препятствовать указанным в ней классам-пе- рехватчикам перехватывать вызовы этого метода. Например, чтобы предотвратить перехват вызовов метода embarkOnQuest(), его можно отметить аннотацией, как показано ниже:

@ExcludeClassInterceptors public void embarkOnQuest() {

quest.embark();

}

Фреймворк Pitchfork дает разработчикам приложений на основе Spring свободу выбора. Вы можете использовать обычный механизм

внедрения зависимостей и поддержку AOP в Spring или применять аннотации и AOP EJB 3. Однако практически в любых обстоя- тельствах средства фреймворка Spring выглядят предпочтительнее. Аспекты Spring AOP, например, обеспечивают большую гибкость, чем перехватчики EJB 3. Тем не менее фреймворк Pitchfork увели- чивает свободу выбора.

16.4. В заключение

Модель программирования на основе POJO, поддерживаемая фреймворком Spring, представляет собой весьма привлекательную альтернативу компонентам Enterprise JavaBeans, тем не менее могут существовать факторы (технические, политические или историче- ские), вынуждающие отдать предпочтение компонентам EJB. В та- ких случаях совсем необязательно отказываться от использования Spring, так как Spring поддерживает разработку новых компонентов EJB и использование имеющихся.

В этой главе мы увидели, как обеспечить совместную рабо- ту Spring и EJB, начав с того, как превратить компоненты Spring в клиентов, пользующихся услугами компонентов EJB. С помощью прокси-объектов мы смогли внедрить ссылки на компоненты EJB в контекст приложения Spring. После выполнения настроек в Spring компоненты EJB могут внедряться в компоненты Spring, которые пользуются услугами EJB. Мы также увидели, как можно упростить объявление прокси-объектов для доступа к компонентам EJB с по- мощью элементов <jee:local-slsb>  и <jee:remote-slsb>  в Spring 2.0.

Затем мы повернулись в сторону разработки новых компонентов EJB. Даже при том, что Spring не имеет механизма для непосред- ственного размещения 2.x EJB в контейнере Spring, тем не менее в Spring имеется набор базовых классов, обладающих поддержкой Spring, на основе которых можно создавать новые компоненты EJB. Эти базовые классы экспортируют контекст приложения Spring в EJB, благодаря чему компонент EJB может делегировать выполне- ние операций объектам POJO, управляемым фреймворком Spring.

Наконец, мы познакомились с фреймворком Pitchfork, весьма интересным расширением Spring, позволяющим использовать ан- нотации EJB 3 для внедрения зависимостей и поддержки аспектов в контейнере Spring.

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

По теме:

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