Главная » Spring » Обновление компонентов, управляемых  сценариями Spring

0

Одним из основных преимуществ использования сценариев, вмес- то статически компилируемого программного кода на языке Java, является возможность их изменения без необходимости повторно разворачивать приложение. Если бы реализация интерфейса Lime была написана на языке Java и вы решили бы изменить четверо- стишье, которое она выводит, вам пришлось бы заново скомпили- ровать реализацию класса и повторно развернуть приложение. Но при использовании сценариев реализацию можно изменить в любой момент и почти немедленно получить результат.

Это самое «почти немедленно» зависит от того, как часто фрейм- ворк Spring проверяет наличие изменений в сценариях. Все элемен- ты настройки компонентов, управляемых сценариями, имеют атри- бут refresh-check-delay, позволяющий определить, как часто (в мил- лисекундах) сценарий должен обновляться фреймворком.

По умолчанию атрибут refresh-check-delay имеет значение –1, что означает запрет на обновление. Но если представить, что вам тре- буется обновлять сценарий каждые 5 секунд, тогда можно было бы использовать следующее определение элемента <lang:jruby>:

<lang:jruby  id="lime"

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

refresh-check-delay="5000"/>

Обратите внимание: несмотря на то что в этом примере исполь- зован элемент <lang:jruby>, атрибут refresh-check-delay действует оди- наково и в элементах <lang:groovy> и <lang:bsh>.

Создание  компонентов, управляемых  сценариями, непосредственно в конфигурации

Обычно сценарии для компонентов принято сохранять во внешних файлах и ссылаться на них с использованием атрибута script-source. Однако в некоторых случаях бывает удобно сохранять программный код сценария непосредственно в конфигурационном файле Spring.

Для этого все элементы объявления сценариев поддерживают включение в них вложенного элемента <lang:inline-script>. Напри- мер, следующий фрагмент XML-кода объявляет компонент lime, управляемый сценарием на языке BeanShell, непосредственно в кон- фигурационном файле Spring:

<lang:bsh id="lime"

script-interfaces="com.springinaction.scripting.Lime">

<lang:inline-script><![CDATA[ void  drink()  {

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

}

]]>

</lang:inline-script>

</lang:bsh>

Вместо атрибута script-source в этом определении компонента lime используется элемент <lang:inline-script>, содержащий сценарий на языке BeanShell.

Отметьте, что здесь программный код сценария заключен в эле- мент <![CDATA[…]]>. Сценарий может содержать символ или текст, который по ошибке может быть воспринят как код разметки XML. Конструкция <![CDATA[…]]> предотвращает это. В данном примере сценарий не содержит ничего, что могло бы ввести в заблужде- ние парсер XML. Тем не менее лучше всегда использовать элемент

<![CDATA[…]]>, чтобы не попасть впросак в будущем, когда придется изменить сценарий.

В этом разделе вы познакомились с несколькими элементами кон- фигурации фреймворка Spring, выходящими за пределы элементов

<bean> и <property>, представленные в главе 2. Эти элементы явля- ются лишь несколькими из новых конфигурационных элементов, появившихся в версии Spring 2.0. По мере чтения книги вы познако- митесь с еще большим количеством конфигурационных элементов.

В заключение

Основной функцией Spring является связывание объектов при- ложения между собой. В главе 2 были показаны основные приемы связывания компонентов, используемые в повседневной разработке, а в этой главе мы познакомились с дополнительными, редко исполь- зуемыми приемами.

Для уменьшения объема повторяющегося XML-кода при опре- делении похожих компонентов фреймворк Spring предоставляет возможность объявления абстрактных компонентов, описывающих общие свойства, и затем определения «дочерних» компонентов от абстрактного компонента.

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

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

Фреймворк Spring использует редакторы свойств для присваи- вания значений, указанных в конфигурации, благодаря чему даже такие сложные объекты, как URL-адреса или массивы, могут быть настроены с использованием строковых значений. В этой главе было показано, как создавать собственные редакторы, чтобы упростить настройку сложных свойств.

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

Наконец, для любителей динамических языков сценариев, таких как Ruby, Groovy и BeanShell, фреймворк Spring позволяет созда- вать компоненты, управляемые сценариями на этих языках. Эта возможность обеспечивает динамическое поведение приложения, делая возможным «горячую» замену определения компонента, реа- лизованного на одном из трех языков сценариев.

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

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

По теме:

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