Главная » Spring » Компонент,  управляемый  сценарием Spring

0

Реализацию интерфейса Lime, управляемую сценарием, можно выполнить на языке Ruby, Groovy или BeanShell. Но независимо от выбора языка сначала необходимо добавить некоторые настрой- ки в файл определения контекста Spring. Следующее объявление

<beans> демонстрирует, как это делается:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/

spring-lang-2.0.xsd">

</beans>

В состав Spring 2.0 входят несколько новых конфигурацион- ных элементов, каждый из которых определен в собственном про- странстве имен и в схеме XML. В течение книги нам не раз еще будут встречаться дополнительные пространства имен, имеющиеся в Spring. А пока достаточно будет сказать, что выделенный фраг- мент в этом объявлении <beans> сообщает фреймворку Spring, что

далее будут использоваться некоторые элементы из пространства имен lang.

Теперь, когда пространство имен объявлено в конфигурационном файле контекста Spring, можно приступать к созданию реализации интерфейса Lime, управляемой сценарием. Начнем с рубинового лайма.

Рубиновый лайм

В последние годы язык Ruby привлек внимание многих разработ- чиков приложений на языке Java, поэтому никого не удивит, если вы пожелаете реализовать компонент, управляемый сценарием на этом весьма популярном языке сценариев. Ниже представлен сценарий на языке Ruby, реализующий интерфейс Lime и его метод drink():

class Lime

def  drink

puts  "Called  the  doctor  woke  him  up!"

end

end

Lime.new

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

Внедрение объекта Lime на языке Ruby выполняется с помощью элемента <lang:jruby>, как показано ниже:

<lang:jruby  id="lime"

script-source="classpath:com/springinaction/scripting/Lime.rb" script-interfaces="com.springinaction.scripting.Lime"  />

В элементе <lang:jruby> имеются два обязательных атрибута. Пер- вый, script-source, сообщает фреймворку Spring, где находится файл сценария. В данном случае файл Lime.rb находится в библиотеке классов (classpath), в том же пакете, что и остальной программный код примера. Второй атрибут, script-interfaces, сообщает, какой Java- интерфейс реализует этот сценарий. В данном случае он реализует наш интерфейс Lime.

Компонент, управляемый сценарием на языке Groovy

Несмотря на огромную популярность языка Ruby, многие разра- ботчики предпочитают оставаться на платформе Java. Groovy – это

язык программирования, соединяющий в себе лучшие черты Ruby и других языков сценариев и знакомый синтаксис языка Java. Фак- тически для Java-разработчиков он является примером сочетания всего самого лучшего из двух миров.

Для тех, кто отдаст предпочтение языку Groovy, ниже приводится реализация интерфейса Lime на языке Groovy:

class   Lime   implements   com.springinaction.scripting.Lime   { void  drink()  {

print "Called the doctor woke him up!"

}

}

Внедрение сценария на языке Groovy в компонент Spring вы- полняется с помощью элемента <lang:groovy>. Следующий элемент

<lang:groovy> загрузит реализацию интерфейса Lime на языке Groovy:

<lang:groovy  id="lime"

script-source="classpath:com/springinaction/scripting/Lime.groovy" />

Как и в элементе <lang:jruby>, атрибут script-source определяет местоположение файла со сценарием на языке Groovy. В данном случае файл сценария также располагается в библиотеке классов (classpath), в том же пакете, что и остальной код примера.

Однако, в отличие от элемента <lang:jruby>, элемент <lang:groovy> не требует (и даже не поддерживает) указывать атрибут script- interfaces. Это объясняется тем, что сценарий на языке Groovy со- держит достаточно информации, чтобы определить, какие интер- фейсы он реализует. Обратите внимание, что Groovy-класс Lime явно реализует интерфейс com.springinaction.scripting.Lime.

Компонент, управляемый сценарием на языке BeanShell

Фреймворк поддерживает еще один язык сценариев – BeanShell. В отличие от Ruby и Groovy, имеющих собственный синтаксис, язык BeanShell имитирует синтаксис языка Java, что делает его привлека- тельным для тех, кто собирается встраивать сценарии в приложение, но не желает тратить время на изучение других языков.

В заключение обзора языков сценариев, поддерживаемых фрейм- ворком Spring, ниже приводится реализация интерфейса Lime на языке BeanShell:

void  drink()  {

System.out.println("Called  the  doctor  woke  him  up!");

}

Первое, что бросается в глаза в этом сценарии, – в нем отсутству- ет определение класса, присутствует только метод drink(). В сцена- риях на языке BeanShell определяются только методы, требуемые интерфейсом, но не класс.

Внедрение сценария на языке BeanShell выполняется точно так же, как и сценария на языке Ruby, за исключением того, что в дан- ном случае используется элемент <lang:bsh>, как показано ниже:

<lang:bsh id="lime"

script-source="classpath:com/springinaction/scripting/Lime.bsh" script-interfaces="com.springinaction.scripting.Lime"  />

Как и в предыдущих элементах объявления сценария, атрибут script-source определяет местоположение файла сценария. И, по- добно элементу <lang:jruby>, атрибут script-interfaces определяет интерфейсы, реализованные в сценарии.

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

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

По теме:

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