Flex整合Spring

工程需要整合Spring和Flex,在网上众多方法中找到了下面这种,记录留存。

个人认为该方法更适合在已有Spring框架的工程中添加Flex时使用,对原工程内容(主要指配置文件)改动较小。

1.添加Spring,在web.xml文件里添加配置

<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>

2.在flex的services-config.xml文件里添加Spring工厂

<factories>
    <factory id="spring" class="com.flex.factories.SpringFactory"/>
</factories>

3.在Spring里面定义bean

<bean id="testClass" class="com.....TestService">
    <property name="dataSource" ref="dataSource"/>
</bean>

4.在flex的远程对象配置文件里配置远程对象,这里要指定远程对象的创建工厂为第2步配置的工厂,远程对象的source要指向Spring里定义的bean

<destination id="test">
    <properties>
        <factory>spring</factory>
        <source>testClass</source>
    </properties>
</destination>

5.在页面就可以使用远程对象了

private function send():void{

    test.doSomething(...);

}

附:需要的SpringFactory

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;  
  
  
public class SpringFactory implements FlexFactory  
{  
    private static final String SOURCE = "source";  
  
     
    public void initialize(String id, ConfigMap configMap) {}  
  
     
    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()  
  
     
    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;  
            }  
        }  
          
    }  
  
}  

 

 

posted @ 2013-08-02 15:01  艾布拉布斯  阅读(496)  评论(0)    收藏  举报