Главная » Spring » Использование внедрения методов чтения Spring

0

Внедрение через метод чтения – это особый случай внедрения ме- тодов, когда объявляется метод (обычно абстрактный), возвращаю- щий компонент определенного типа, но фактически возвращаемый компонент определяется в контексте Spring.

Для иллюстрации рассмотрим новую форму класса Instrumentalist

с внедряемым методом, как показано в листинге 3.4.

Листинг 3.4. Класс Instrumentalist с внедряемым методом

package com.springinaction.springidol;

public abstract class Instrumentalist implements Performer { public  Instrumentalist()  {}

public void perform() throws PerformanceException { System.out.print("Playing  "  +  song  +  "  : "); getInstrument().play();   // Используется внедряемый метод

}                                           // getInstrument()

private  String  song;

public  void  setSong(String  song)  { this.song   =   song;

}

public abstract Instrument getInstrument(); // Внедряемый метод

}

В отличие от оригинального класса Instrumentalist, этот класс не получает инструмент посредством внедрения через метод записи. Вместо этого он имеет абстрактный метод getInstrument(), который будет возвращать инструмент исполнителя. Но если getInstrument() – абстрактный метод, тогда возникает вопрос, как этот метод получит реализацию.

Один из возможных подходов – использовать прием замещения методов, как описано в предыдущем разделе. Но для этого придет- ся написать класс, реализующий интерфейс MethodReplacer, хотя нам требуется всего лишь переопределить метод getInstrument(), чтобы он возвращал определенный компонент.

Для поддержки внедрения методов чтения фреймворк Spring предлагает элемент <lookup-method>. Как и <replaced-method>, элемент

<lookup-method> замещает существующий метод новой реализацией во время выполнения. Но элемент <lookup-method> – это упрощенный вариант элемента <replaced-method>, для которого нужно определить компонент в контексте Spring, возвращающий замещающий метод. Элемент <lookup-method> этого не требует. При его использовании не надо писать класс, реализующий интерфейс MethodReplacer.

Следующий фрагмент XML-кода демонстрирует использование элемента <lookup-method> для замещения метода getInstrument() дру- гим методом, который вернет ссылку на компонент guitar.

<bean id="stevie"

class="com.springinaction.springidol.Instrumentalist">

<lookup-method  name="getInstrument"  bean="guitar"  />

<property  name="song"  value="Greensleeves"  />

</bean>

Как и в элементе <replaced-method>, атрибут name элемента <lookup- method> определяет замещаемый метод. Здесь замещается метод getInstrument(). Атрибут bean определяет компонент, возвращаемый методом getInstrument(). В нашем случае это компонент с идентифи- катором guitar. В результате метод getInstrument() фактически будет замещен следующей реализацией:

public   Instrument   getInstrument()   { ApplicationContext  ctx  =  …;

return  (Instrument)  ctx.getBean("guitar");

}

Сам по себе прием внедрения методов чтения является всего лишь разновидностью внедрения через методы записи. Однако это имеет значение, только когда компонент имеет область действия prototype:

<bean   id="guitar"   class="com.springinaction.springidol.Guitar"

scope="prototype"  />

Даже если компонент имеет область видимости prototype, при ис- пользовании приема внедрения через метод записи компонент guitar будет внедрен в свойство только однажды. Использование приема

внедрения методов чтения гарантирует, что каждый вызов метода getInstrument() будет возвращать различные гитары. Это может при- годиться, если гитарист порвет струну во время выступления и по- требует другой инструмент.

Важно помнить, что при использовании элемента <lookup-method>

для внедрения метода чтения совсем необязательно, чтобы замещае- мый метод был методом чтения (то есть методом, имя которого на- чинается со слова get). С помощью элемента <lookup-method> можно заместить любой метод, возвращающий некоторое значение.

Следует также отметить, что даже при том, что прием внедрения методов позволяет замещать их реализации, нет никакой возмож- ности изменить сигнатуру метода. Типы параметров и возвращае- мого значения должны оставаться такими, какие они есть. В случае с элементом <lookup-method>  это означает, что атрибут bean  должен ссылаться на компонент, тип которого совместим с типом значения, возвращаемого методом (Instrument в предыдущем примере).

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

По теме:

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