BlazeDS与Spring结合的工厂类分析

  《BlazeDS开发指南》的第十六章介绍了BlazeDS的一种扩展方法——通过工厂类,可以自定义出各种控件以满足实际应用中的需求,在这章中给出了一个与Spring结合的方法,下面先给出具体代码,然后再详细分析一下,个人拙见,如有错误,希望指出,具体代码工程见附件,其中包括一个spring-flex.jar的包,在实际应用中可以直接拷贝到类路径中。

 

public class SpringFactory implements FlexFactory
{
  //工厂源配置名称,在flex配置文件中用到。
  private static final String SOURCE = "source";

  //该方法用于初始化该工厂,会在配置文件中自动调用。
  @Override
  public void initialize(String id, ConfigMap configMap)
  {

  }

  //该方法在一个destination被实例化时调用。
  @Override
  public FactoryInstance createFactoryInstance(String id, ConfigMap properties)
  {
    SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);
    instance.setSource(properties.getPropertyAsString(SOURCE, "source"));
    return instance;
  }

  //返回一个指定source和property的工厂实例,该方法会在每次服务请求时自动调用。
  @Override
  public Object lookup(FactoryInstance inst)
  {
    SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;
    return factoryInstance.lookup();
  }

  class SpringFactoryInstance extends FactoryInstance
  {
    //构造函数。
    SpringFactoryInstance(SpringFactory factory, String id, ConfigMap properties)
    {
      super(factory, id, properties);
    }

    //由Servlet容器中获取上下文内容(context),然后根据配置源获取Spring中创建的Bean。
    @Override
    public Object lookup()
    {
      ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext());
      String beanName = getSource(); //配置文件中声明的源(也即一个bean的名字)。

      try
      {
        return appContext.getBean(beanName); //返回Spring中创建的bean。
      }
      catch(NoSuchBeanDefinitionException nexc) //没有找到指定的bean。
      {
        ServiceException e = new ServiceException();
        String msg = "Spring service named '" + beanName + "' does not exist.";
        e.setMessage(msg);
        e.setRootCause(nexc);
        e.setDetails(msg);
        e.setCode("Spring.Processing");
        throw e;
      }
      catch(BeansException bexc) //创建bean出错。
      {
        ServiceException e = new ServiceException();
        String msg = "Unable to create Spring service named '" + beanName + "'.";
        e.setMessage(msg);
        e.setRootCause(bexc);
        e.setDetails(msg);
        e.setCode("Spring.Processing");
        throw e;
      }
    }

    @Override
    public String toString()
    {
      return "SpringFactory instance for id=" + getId() + " source=" + getSource() + " scope=" + getScope() + ".";
    }
  }
}

 

  (1)在实际应用中,我们首先在BlazeDS的配置文件services-config.xml中定义一个工厂,代码如下:

<factories>
  <factory id="spring" class="org.springflex.factories.SpringFactory" />
</factories>

 

  (2)然后,在该Web应用的配置文件web.xml中添加如下定义,启用Spring的支持:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-vale>
<context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 

 

  (3)接着,我们要在Spring的配置文件applicationContext.xml中定义我们的Bean,如下:

<beans>
  <bean name="someSpringBean" class="org.springflex.SomeBean" />
</beans>

   注意上面的bean名称someSpringBean,会在下面用到。

 

  (4)最后,在BlazeDS的配置文件remoting-config.xml中定义我们的Destination,其中通过factory和source把BlazeDS和Spring相结合起来了,如下:

<destination id="someDestination">
  <properties>
    <factory>spring</factory>
    <source>someSpringBean</source>
  </properties>
</destination>

 

  通过以上步骤,已经把Spring和BlazeDS结合起来了,当我们在Flex客户端调用服务端的someDestination时,因为该Destination中有一个factory——spring,所以转交给org.springflex.factories.SpringFactory处理,而在SpringFactoryInstance类的lookup方法中,先获得该Servlet的上下文环境,再获取该Destination的source,而该source正是在Spring中定义的Bean名称,所以,最后通过获取该Bean来调用org.springflex.SomeBean,达到了最终调用的目的。

 

  附件:SpringFactory.rar(我是在jdk-1.6.u7下编译的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值