Главная » Spring » Передача параметров советам Spring

0

До сих пор наши аспекты отличались простотой реализации и не принимали параметров. Единственное исключение – метод watchPerformance(), реализующий совет, выполняемый и до, и после це- левого метода, который принимает параметр типа ProceedingJoinPoint. Реализованный нами совет никак не заботится о параметрах для передачи целевому методу. Впрочем, в этом нет ничего страшного, потому что вызываемый нами метод perform() не принимает никаких параметров.

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

Чтобы увидеть, как действует эта возможность, познакомимся с но- вым участником конкурса «Spring Idol». Наш новый участник обла- дает талантом чтения мыслей и определяется интерфейсом MindReader:

package com.springinaction.springidol;

public interface MindReader {

void   interceptThoughts(String   thoughts);

String getThoughts();

}

Человек, читающий мысли, выполняет два основных задания: он читает мысли добровольца и сообщает их публике. Ниже представ- лен простой класс Magician, реализующий интерфейс MindReader:

package com.springinaction.springidol;

public class Magician implements MindReader { private   String   thoughts;

public  void  interceptThoughts(String  thoughts)  { System.out.println("Intercepting    volunteer’s    thoughts"); this.thoughts   =   thoughts;

}

public  String  getThoughts()  { return   thoughts;

}

}

Теперь нам нужен доброволец, чьи мысли будут прочитаны. Для этой цели определим интерфейс Thinker:

package   com.springinaction.springidol; public  interface  Thinker  {

void thinkOfSomething(String thoughts);

}

Класс Volunteer представляет собой простейшую реализацию ин- терфейса Thinker:

package   com.springinaction.springidol; public class Volunteer implements Thinker {

private  String  thoughts;

public void thinkOfSomething(String thoughts) { this.thoughts   =   thoughts;

}

public  String  getThoughts()  { return   thoughts;

}

}

Детали реализации Volunteer не представляют особого интереса или важности. Что действительно интересно – как фокусник (объ- ект Magician) будет читать мысли добровольца (объект Volunteer) с использованием Spring AOP.

Для осуществления телепатического контакта воспользуемся теми же элементами <aop:aspect> и <aop:before>, что и прежде. Но на этот раз настроим в них передачу совету параметров для целевого метода.

<aop:config>

<aop:aspect ref="magician">

<aop:pointcut  id="thinking" expression="execution(*

com.springinaction.springidol.Thinker.thinkOfSomething(String)) and  args(thoughts)"  />

<aop:before

pointcut-ref="thinking" method="interceptThoughts" arg-names="thoughts"  />

</aop:aspect>

</aop:config>

Ключ к телепатическим возможностям фокусника Magician нахо- дится в определении среза множества точек сопряжения и в атри- буте arg-names элемента <aop:before>. Срез идентифицирует метод thinkOfSomething() интерфейса Thinker, указывая, что метод принимает строковый аргумент, и уточняя имя аргумента thoughts с помощью указателя args.

Элемент <aop:before> определения совета также ссылается на аргумент thoughts, указывая, что он должен передаваться методу interceptThoughts()   класса  Magician.

Теперь всякий раз, когда будет вызываться метод thinkOfSomething()

компонента volunteer, аспект Magician будет перехватывать его мысли.

Чтобы убедиться в этом, ниже представлен простой тестовый класс со следующим методом:

@Test

public void magicianShouldReadVolunteersMind() { volunteer.thinkOfSomething("Queen   of   Hearts");

assertEquals("Queen  of  Hearts",  magician.getThoughts());

}

Подробнее о  создании  модульных  и  интеграционных  тестов в Spring будет рассказываться в следующей главе. А пока просто отметьте, что тест выполняется без ошибок, потому что фокусник всегда будет знать, о чем думает доброволец.

Теперь посмотрим, как с помощью Spring AOP добавлять новые функциональные возможности в существующие объекты.

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

По теме:

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