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