Статьи

Интеграция Spring BlazeDS с Flex 4 Final


Уже более года SpringSource и Adobe поддерживают партнерские отношения, направленные на оптимизацию интеграции между Spring и BlazeDS.
Проект Spring BlazeDS интеграции удалось добиться Flex передние концы и концы назад пружине слаженно. 
Christophe Coenraets , технический евангелист Adobe, дает обзор интеграции Spring BlazeDS с Flex 4, которая недавно стала GA. Независимо от того, являетесь ли вы разработчиком Spring, который думает об изучении Flex, или разработчиком Flex, который хочет изучать Spring, вы можете извлечь выгоду из знания того, как интегрировать эти лучшие в своем классе фреймворки для сложных и сложных веб-приложений.

BlazeDSэто мощная серверная технология удаленного взаимодействия и обмена сообщениями Java, которая позволяет разработчикам легко подключаться к внутренним распределенным данным и передавать данные в режиме реального времени в Adobe Flex и Adobe AIR. Flex 4 уже может получать доступ к внутренним данным через HTTPService (Flex HTTPService аналогичен XMLHttpRequest в Ajax) или компонентам WebService. Благодаря BlazeDS приложения Flex имеют службы удаленного взаимодействия для вызова методов объектов Java, службы сообщений для публикации сообщений и подписки на место назначения сообщений, а также прокси-службы, которые разрешают междоменные запросы служб безопасным и контролируемым образом. BlazeDS развертывается как набор файлов JAR в вашем веб-приложении. Разработчики, использующие интеграцию Spring Blaze DS, должны знать, что различные модули Spring могут также использоваться для создания удаленных объектов.  

Доступ приложения Flex к Spring Beans

Без интеграции с Spring BlazeDS вам потребуется настроить удаленные объекты BlazeDS в файле remoting-config.xml, расположенном в WEB-INF \ flex, чтобы начать доступ к Spring beans из клиента Flex. В этом примере показано, как можно предоставить Java-класс ProductService удаленной доступности для приложения Flex:

<destination id="product">
<properties>
<source>my.package.ProductService</source>
</properties>
</destination>

Используемое логическое имя — «продукт», и назначение позволяет Flex вызывать открытые методы ProductService. Вот минималистское Flex-приложение Christophe Coenraets, используемое для заполнения DataGrid списком продуктов. Список получается путем удаленного вызова метода findAll () класса ProductService:

<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<s:RemoteObject id="ro" destination="productService"/>
</fx:Declarations>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<mx:DataGrid dataProvider="{ro.findAll.lastResult}" />
<s:Button label="Get Data" click="ro.findAll()"/>

</s:Application>

BlazeDS создает экземпляры и управляет жизненными циклами удаленных объектов, определенных в файле remoting-config.xml, но это противоречит методологии Spring, которая позволяет контейнеру создавать компоненты. Хитрость заключается в том, чтобы найти наилучшее решение при интеграции Spring и BlazeDS, чтобы вы могли использовать службы данных BlazeDS, позволяя контейнеру Spring управлять конфигурацией, созданием экземпляров и жизненными циклами удаленных объектов. Тем не менее, проекты интеграции Spring BlazeDS имеют гораздо лучший способ работы.

Spring Factory: старый способ интеграции

BlazeDS — это механизм интеграции, основанный на шаблоне Factory, то есть вы можете подключить пользовательскую фабрику к определению получателя, чтобы позволить другой подсистеме управлять созданием и жизненным циклом удаленного объекта. У заводского подхода есть некоторые недостатки, которые приводят к интеграции Spring BlazeDS: подход поиска зависимостей идет вразрез с подходом Spring DI, объекты должны быть настроены дважды, общая конфигурация системы распределена по многим файлам, и интеграция возможна только через базовое удаленное взаимодействие без безопасности и обмена сообщениями.

Интеграция Spring BlazeDS

Проект интеграции Spring Blaze DS направлен на устранение некоторых из этих недостатков при запуске клиента Flex с серверной частью Spring. Проект заставляет BlazeDS сотрудничать с парадигмами управления Spring. MessageBroker в BlazeDS настроен и загружен как управляемый Spring компонент, не требующий настройки web.xml. Сообщения Flex направляются через Spring DispatcherServlet в MessageBroker. Удаленные объекты настраиваются в файле конфигурации контекста приложения. Пункты назначения обмена сообщениями настраиваются в «Spring Way», а интеграция безопасности Spring позволяет предоставлять учетные данные безопасности из приложения Flex и защищает управляемые Spring компоненты, представленные как удаленные объекты, как в Spring.

После настройки Spring в файле web.xml настройте посредник сообщений BlazeDS в качестве bean-компонента, управляемого Spring, в файле конфигурации контекста приложения, настройте bean-компоненты, а затем выставьте bean-объекты как удаленные объекты в файле конфигурации контекста приложения, после чего вы можете получить Началось с простого примера, показанного ниже.

Сначала настройте DispatcherServlet для начальной загрузки Spring WebApplicationContext в web.xml. Затем вы сопоставляете все запросы / messagebroker с DispatcherServlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/web-application-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

</web-app>

В файле web-application-config.xml посредник сообщений BlazeDS сначала настраивается как управляемый Spring компонент с использованием простого тега посредника сообщений. Это запускает брокер сообщений BlazeDS. Использование тега посредника сообщений без сопоставления дочерних элементов приводит к тому, что все входящие запросы DispatcherServlet сопоставляются с MessageBroker, но вы, безусловно, можете добавить сопоставляемые дочерние элементы для большего контроля.

Как только вы закончите работу с брокером сообщений, вы сможете нормально настроить bean-компоненты Spring и выставить bean-компоненты, которые вы хотите сделать доступными для удаленного доступа, с помощью тега remoting-destination.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:flex="http://www.springframework.org/schema/flex"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">

<flex:message-broker/>

<bean id="productService" class="org.springframework.flex.samples.product.ProductDAO" >
<flex:remoting-destination />
<constructor-arg ref="dataSource" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/sprinflexdemodb/sprinflexdemodb" />
</bean>
</beans>

С помощью этой конфигурации приложение Flex может вызывать открытые методы bean-компонента productService. Приложение Flex ниже заполняет DataGrid списком продуктов. Продукты приобретаются путем удаленного вызова метода findAll () класса ProductService.

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Declarations>
<s:RemoteObject id="ro" destination="productService"/>
</fx:Declarations>

<s:layout>
<s:VerticalLayout/>
</s:layout>
<mx:DataGrid dataProvider="{ro.findAll.lastResult}" />

<s:Button label="Get Data" click="ro.findAll()"/>

</s:Application>

Это тот же код, который использовался для подключения к простой установке BlazeDS ранее в этой статье! Код на стороне клиента и конкретная реализация на стороне сервера изолированы друг от друга.

Разработчики Spring могут легко использовать свою существующую инфраструктуру и предоставлять компоненты для удаленного доступа с помощью Flex-клиентов BlazeDS. Пользователи Flex могут использовать интеграцию BlazeDS для использования мощных функций Spring Framework.  

Для получения дополнительной информации о других функций , таких как обмен сообщениями и интеграции системы безопасности, чтения
Spring BlazeDS Integration Test Drive .