先粘贴 转一个文章:
最近一直在研究FLEX,由于项目的需要自己构建了一个FLEX+SPRING+HIBERNATE 的WEB开发框架。在网上找到了一些相关资料,帮助最大的http://coenraets.org/flex-spring/ 。
下面说一下我的配置过程,希望能给大家一些帮助:
1)创建自己的工程,例如 :springtest (project) -> flex(Package),将相关的JAR包放在lib下。这些都是简单WEB开发所必需的,就不多罗嗦了。
2)下载flex-spring.zip 解压 copy flex-spring-sdk/src/flex/samples/factories 下面的SpringFactory.java 放在flex.factory 下。
3)配置applicationContext.xml。关于配置SPRING+HIBERNATE 的东西网上很多,就不多介绍了。
配合例子的配置为
<bean id="testFactory"
class="flex.factory.TestFactory">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
4)配置services-config.xml.
<factories>
<factory id="spring" class="flex.factory.SpringFactory"/>
</factories>
5)配置remoting-config.xml.(关于FLEX与JAVA的交互我采用的是ROMTING)
<destination id="testFac">
<properties>
<factory>spring</factory>
<source>testFactory</source>
</properties>
</destination>
注意此处的source对应的是applicationContext.xml。
自己动手的例子
在services-config.xml文件中配置spring工厂:
<factories>
<factory id="spring" class="com.jetsen.framework.flex.factories.SpringFactory"/>
</factories>
package com.jetsen.framework.flex.factories;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import flex.messaging.FactoryInstance;
import flex.messaging.FlexFactory;
import flex.messaging.config.ConfigMap;
import flex.messaging.services.ServiceException;
/**
* This interface is implemented by factory components which provide
* instances to the flex messaging framework. To configure flex data services
* to use this factory, add the following lines to your services-config.xml
* file (located in the WEB-INF/flex directory of your web application).
*
* <factories>
* <factory id="spring" class="flex.samples.factories.SpringFactory" />
* </factories>
*
* You also must configure the web application to use spring and must copy the spring.jar
* file into your WEB-INF/lib directory. To configure your app server to use spring,
* you add the following lines to your WEB-INF/web.xml file:
*
* <context-param>
* <param-name>contextConfigLocation</param-name>
* <param-value>/WEB-INF/applicationContext.xml</param-value>
* </context-param>
*
* <listener>
* <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
* </listener>
*
* Then you put your spring bean configuration in WEB-INF/applicationContext.xml (as per the
* line above). For example:
*
* <?xml version="1.0" encoding="UTF-8"?>
* <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> ;
*
* <beans>
* <bean name="weatherBean" class="dev.weather.WeatherService" singleton="true"/>
* </beans>
*
* Now you are ready to define a destination in flex that maps to this existing service.
* To do this you'd add this to your WEB-INF/flex/remoting-config.xml:
*
* <destination id="WeatherService">
* <properties>
* <factory>spring</factory>
* <source>weatherBean</source>
* </properties>
* </destination>
*
* @author BOB
*/
public class SpringFactory implements FlexFactory
{
private static final String SOURCE = "source";
/**
* This method can be used to initialize the factory itself. It is called with configuration
* parameters from the factory tag which defines the id of the factory.
*/
public void initialize(String id, ConfigMap configMap) {}
/**
* This method is called when we initialize the definition of an instance
* which will be looked up by this factory. It should validate that
* the properties supplied are valid to define an instance.
* Any valid properties used for this configuration must be accessed to
* avoid warnings about unused configuration elements. If your factory
* is only used for application scoped components, this method can simply
* return a factory instance which delegates the creation of the component
* to the FactoryInstance's lookup method.
*/
public FactoryInstance createFactoryInstance(String id, ConfigMap properties)
{
SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);
instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));
return instance;
} // end method createFactoryInstance()
/**
* Returns the instance specified by the source
* and properties arguments. For the factory, this may mean
* constructing a new instance, optionally registering it in some other
* name space such as the session or JNDI, and then returning it
* or it may mean creating a new instance and returning it.
* This method is called for each request to operate on the
* given item by the system so it should be relatively efficient.
* <p>
* If your factory does not support the scope property, it
* report an error if scope is supplied in the properties
* for this instance.
*/
public Object lookup(FactoryInstance inst)
{
SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;
return factoryInstance.lookup();
}
static class SpringFactoryInstance extends FactoryInstance
{
SpringFactoryInstance(SpringFactory factory, String id, ConfigMap properties)
{
super(factory, id, properties);
}
public String toString()
{
return "SpringFactory instance for id=" + getId() + " source=" + getSource() + " scope=" + getScope();
}
public Object lookup()
{
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext());
String beanName = getSource();
try
{
return appContext.getBean(beanName);
}
catch (NoSuchBeanDefinitionException nexc)
{
ServiceException e = new ServiceException();
String msg = "Spring service named '" + beanName + "' does not exist.";
e.setMessage(msg);
e.setRootCause(nexc);
e.setDetails(msg);
e.setCode("Server.Processing");
throw e;
}
catch (BeansException bexc)
{
ServiceException e = new ServiceException();
String msg = "Unable to create Spring service named '" + beanName + "' ";
e.setMessage(msg);
e.setRootCause(bexc);
e.setDetails(msg);
e.setCode("Server.Processing");
throw e;
}
}
}
}
在remoting-config.xml中配置服务:
<destination id="topologyFile">
<properties>
<factory>spring</factory>
<source>topologyFile</source>
</properties>
</destination>
先构造一个flex专用的spring工厂 在services-config.xml中配
然后在java后台spring的文件中配置所需要的工具类
<bean id="avHardWareServer" class="com.jetsen.flex.javabean.AVHardWareServer">
<property name="flexInterfaceService" ref="flexInterfaceService" />
</bean>
在flex中培植server在remoting-config.xml中
<destination id="exportXmlServer">
<properties>
<factory>spring</factory>
<source>exportXmlServer</source>
</properties>
</destination>
配置完成 在flex的service层调用
<mx:RemoteObject id ="exportXmlServer" destination ="exportXmlServer" showBusyCursor ="true">
</mx:RemoteObject>