Spring的横空出世完全颠覆了传统Java服务端的开发方式。它鼓励通过依赖注入的方式来装配POJO,这极大地简化了应用的开发与测试。
Spring的核心配置是通过Java bean实现的。借助于bean,任何Java类都能被公开成为服务。一般有两种最常见的对象配置方法:
var myObject = new Object()
)var myObject = registry.getMyObject()
)而利用IOC,你可在一个独立层中实例化应用程序要用到的对象,并传入它们所需的依赖。具体来说,最常见的实现方法也有两种:
instance.myObject = new Object()
)instance = new Instance( new Object() )
)一个IOC框架,通常由如下三个部分组成:配置、工厂和注入机制。
我们可以在配置中描述对象之间的关系。最常用的配置描述方法是在文件中声明。这样的文件有时候也被称为上下文文件(context file)。也可以用元数据/注释(metadata/annotation),甚至直接在程序中描述配置。/
工厂负责配置的解析和所有对象的准备工作,程序一旦运行,就可以根据需要取得这些对象。
在经典的Spring框架(最流行的Java IOC框架)中,所有对象(我称其为客户对象)都由IOC容器负责准备,并且它们以接口形式声明自己的依赖。在配置文件中,被声明的依赖都被设置为对应的实现类。
所谓注入机制,是指如何将工厂创建的对象实例注入到应用或其他对象。
就Spring Web应用而言,注入方法是通过web.xml来实现的。Spring会监听Web应用上下文的加载事件,并利用钩子捕获类加载器的行为,从而分离出任何 需被创建的对象。此后,若有需要,工厂将实例化对象,并填充它所需的依赖。当然在向应用返回对象之前,这些依赖本身也可能需要实例化。这个过程即所谓的 “(将依赖与对象)捆绑在一起”。
在Flex中,类的加载原理有所不同,因此捆绑方法也就不同。目前有两种方法:
这两个项目让你在客户端的Actionscript编码中以及服务端的Java编码中,都能够使用Spring的各种优秀特性。
两者的不容之处在于
Spring BlazeDS Integeration 允许你在服务端使用Spring容器来组织你的代码,维护的你代码依赖。并且,把你的服务通过相应的配置暴露给客户端。
Spring Actionscript则是一个基于Actionscript代码的Ioc容器(目前还不支持AOP).可以让你在客户端使用Ioc管理依赖注入.
下面分别看下,首先来探讨下Spring Actionscript以及其它的IoC框架。
Spring ActionScript前身为Prana,因其成熟度高,成为了一个知名框架。
任何使用过Spring的Java或.NET版本的人,都会很快熟悉Spring ActionScript。你在运行时加载的配置文件,可以给工厂提供足够信息,用于实例化被应用请求的任何对象。
在标准例子工程中使用Spring ActionScript,需如下三个基本步骤:
在Spring ActionScript中,对象声明在应用可访问的XML文件(通常命名为application-context.xml)中。此配置文件由XMLApplicationContext(是ObjectFactory的子类)加载。
Spring ActionScript是一个优秀的、成熟的、开发活动十分活跃的IOC框架,任何用过Spring框架的人都熟悉的。
以XML形式声明对象存在一个问题,即在XML中声明一个类,并且这个类没被包含在SWF中(因为在你的应用中没有对它的直接引用)时,Flash Player会在运行时抛出异常。其解决办法是创建一个ActionScript类,声明它对上下文XML的依赖,并将此类包含在应用中。
Parsley也是一个成熟的IOC框架,最初灵感来源于Spring。它近期经历过一次较大规模的重写。新版本支持一些本地Flex特性,如绑定和元数据,使你在配置你的工程时有更多更好的选择。
Parsley的核心概念是源自于Spring的上下文,也即应用的依赖注入的配置。
Parsley的配置现在支持多种形式,其中包括XML和MXML。你可以使用本地的MXML标记或Parsley库提供的自定义MXML标签。Parsley使用元数据标签实现对注入机制的支持,这和Swiz框架是类似的。
Parsley还支持消息模式。基本不需代码干预,你就能将你的对象配置为事件源或事件处理器。在这个例子中,我会用这个特性替代Controller模式。
Parsley的配置分三个基本步骤:
准备配置文件的方法有多种,不过在这个例子中,我使用支持本地标记和Parsley标签的MXML文件。这种方法的好处是在编译时就将类引入,当然这样一来,也就不能直接修改已被编译的应用的配置了。
在Config.mxml中,你能看到应用中用到的从域模型到代理的所有对象。声明这些对象的方式有两种:
在后面的内容中,我将详细介绍这种方法。