转载:http://www.riameeting.com/node/448
这是一个系列文章,总共3篇,RIAMeeting将在这3篇文章中为大家讲述Spring ActionScript的基本概念以及使用方法,通过学习这3篇文章,开发者可以创建出一个简单的Spring ActionScript的应用,并体会到Spring ActionScript带来的优势和便捷性。
当然,基本上所有的框架的最大价值在于它给你的结构上的规范和指导意义,所以我们在使用框架的时候,应当尽量去体会框架对于自己编程思想的提升,如 果只是为使用框架而是用框架,就会感觉框架繁琐而且加大工作量,增加编码体积,实际上框架的最大优势都是在后期才体现出来的(比如当项目趋于扩大化时的维 护,管理和团队协作)。
Part1:介绍Spring ActionScript
首先,我们先来介绍一下Spring ActionScript,如果你来自Java社区,应该对Spring并不陌生,实际上在Java社区中Spring作为替代J2EE的一个轻量级的框 架有着非常广泛的应用。Spring包含两个方面的重要功能:IoC和AOP,大家用到Spring最多的地方实际上也是IoC。另一个方面AOP面向切 面在AS中不被支持。简单的说,Spring ActionScript是Spring在ActionScript中的实现。
名词解释:
IoC:控制翻转(inverse of control),Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传 递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就 主动将依赖传递给它。
DI:Dependency Injection (DI),即依赖注入。
Part2:安装Spring ActionScript Framework
在这里以Flash Builder4为例说明如何安装Spring ActionScript Framework。Flash Builder是Flex Builder的最新版本(从4的版本开始更名为Flash Builder)目前还是Beta版,但它从各方面来说都比Flex Builder3提升了不少,所以我们这里使用Flash Builder4以提升编程的效率。
言归正传,如果我们需要安装为Flash Builder安装Spring ActionScript Framework,需要遵循以下的步骤:
- 安装Flash Builder4,你可以从Adobe的网站(http://labs.adobe.com)下载Flash Builder4的安装文件,这个过程非常简单,界面也非常容易使用,因为Flash Builder是基于Eclipse的。
- 创建一个新项目,或者导入原有的Flex Builder3的项目
- 下载Spring ActionScript Framework的SWC文件,下载地址在本文的最底部
- 下载依赖的第三方SWC文件,因为这个项目依赖了很多第三方的类库,所以需要你把这些依赖的类库也都下载下来,这些类库包 括:as3commons-reflect.swc , as3commons-lang.swc , as3commons-logging.swc , flexunit.swc,这些都在最底部的压缩文件中被包含,下载即可
- 将所有下载的SWC文件移动到你的项目的Libs目录,然后你需要修改编译参数,将这些类库编译到SWF中去,步骤是:打开项目属性面板,定位到 Flex Compiler选项,找到additional compiler arguments,输入类似于下面的语句:-locale en_US -default-background-color #000000 -include-libraries ../libs/spring-actionscript.swc ../libs/as3commons-reflect.swc ../libs/as3commons-lang.swc ../libs/as3commons-logging.swc ../libs/flexunit.swc
参见图片说明,点击查看大图:
在上面我们稍感麻烦的一点是还要手工把所有的依赖的SWC编译进去,否则运行时会找不到依赖的库,一旦项目依赖的库比较多,这个配置代码就会很长,也会给部署的人带来麻烦,针对这种情况,Maven有非常好的解决方法,参见RIAMeeting关于Maven的介绍文章:
- http://www.riameeting.com/node/445
- http://www.riameeting.com/node/446
- http://www.riameeting.com/node/447
Part 3: 使用Spring ActionScript中的XML配置
Spring ActionScript 允许你使用XML描述文件来定义你需要在应用中使用的实例以及它们之间的相互依赖关系。这个XML文件可以是一个外部的XML文档,也可以是一个内嵌的 XML(嵌入到Flex的MXML中作为元数据存在)。这两种方式都被支持,只是在使用上稍有区别。
非常需要注意的是在Flex中使用Spring,必须要保证被依赖的类被编译到SWF中,否则会报运行时错误(无法找到所需的类),解决方法参加Part2的编译器参数部分。
下面我们来讨论如何编写Spring的配置文件,这个配置文件遵循XML结构,我们先来看一个典型的配置文件,你可以打开你的Flash Builder4,然后新建一个文本文件,命名为"application_context.xml",然后粘贴下面的代码片段到这个文件中:
<objects> <import file="services.xml"/>//行1 <import file="resources/messageSource.xml"/>//行2 <import file="/resources/themeSource.xml"/>//行3 <object id="object1" class="..."/>//行4 <object id="object2" class="...">//行5 <property name="elements" value="123456" />//行6 </object> </objects>
对于熟悉XML的朋友,这段配置非常容易理解,主要包含以下几个方面:
- 支持导入xml文件(参加行1,2,3),就是说,我们可以按照一定的规则拆解XML中的内容到不同的文件,以便于管理和维护,方法是使用import标签
- 实例化一个对象,使用object标签(参见行4,行5),其中有两个必须的属性,即id和class,id代表对这个object的引用,class代表这个object对应的类,注意要写全类名和包路径,比如:class="mx.containers.Panel"
- 使用property属性定义这个object的依赖(参见行6),比如这个object需要的一些字符串类型的数据,以及对另外一个对象的引用等等,如果是直接赋值,使用value,引用则使用ref
我们还可以使用定义外部变量(常量)的方式,将一些配置方面的信息以变量或常量的形式定义在外部,以便于部署和维护时候的修改,通常我们会建立一个类似于prop.properties这个的一个文本文件,然后使用下面的变量声明方式来声明变量:
s1=First string s2=Second string
在XML中引用,使用${s1}的方式来引用:
<objects> <property file="strings.properties" /> <object id="string1" class="String"> <constructor-arg value="${s1}"/> </object> <object id="string2" class="String"> <constructor-arg value="${s2}"/> </object> </objects>
还可以在一个对象的内部使用内联对象,举例:
<object id="outer" class="..."> <property name="target"> <object class="com.example.Person"> <property name="name" value="Fiona Apple"/> <property name="age" value="25"/> </object> </property> </object>
下表是在配置文件中常用的一些标签以及相关的说明和用法
术语 | 说明 | 代码示例 |
---|---|---|
${变量名} | 你可以把一些变量分离出来写在单独的文本文件中,然后在配置中引用这些变量,这样最大的好处是你可以把配置信息比如Server端的连接地址放在单独的文件中,方便修改和维护 |
新建global.prop文本文件,写入: variable1=10 在配置中引用: ${variable1} |
object | 在XML配置中,每一个对象用Object来表示,然后分别用id和class代表唯一标示和类的名称 | <object id="obj" class="mx.ctrol.Button" /> |
property | 你可以使用property为对象的属性复制,这也是IoC的精髓,即从这里把依赖注入到对象。name就是属性的名称,而value就是你要赋予的具体的值 |
<object … > <property name="name" value="Fiona Apple"/> </object> |
ref | 除了可以直接赋值,你也可以通过使用ref在属性中引用别的对象 |
<object id="a" …/> <object … > <property name="name" ref="a"/> </object> |
constructor-arg | 如果你的对象实例化的时候需要从构造函数中传入参数,那么可以使用这个属性,将所需的参数传递进去 |
<object … > <constructor-arg> </object> |
factory-method | 工厂方法,含义是不使用new对这个Object进行实例化,而是调用这个类的静态方法,可用于单例模式的实现 | <object id="a" class="A" factory-method="getInstance" /> |
dictionary | 相当于AS3中的Dictionary,你可以在配置中声明一个Dictionary对象 | <dictionary> <entry> <key>development</key> <value>dx</value> </entry> </dictionary> |
array | 同样,你可以在配置中声明一个数组对象 | <array> <value>ssnce</value> <value><ref object="s"/></value> </array> |
array-collection | 对应Flex中的ArrayCollection,当然只有Flex的应用才可以使用这个配置方式 | <array-collection> <value>ssnce</value> <value><ref object="s"/></value> </array-collection> |
depends-on | 定义依赖关系,含义就是先初始化它的依赖,然后初始化自己 | depends-on="manager,accountDao" |
lazy-init | 如果值为true,则不马上初始化,而是在第一次调用的时候才初始化 | <object … lazy-init="true"/> |
autowire |
自动装配,Spring ActionScript支持自动装配,含义就是你只要声明某个对象为自动装配,它就会按照规则自动去寻找这个对象的依赖并注入给它,而不需要手工操作。 默认是no,可以选择byName,byType,constructor,autodetect来自动装配对象的依赖。使用自动装配时,应当权衡利弊,合理的与ref的方法相结合,尽量在降低工作量的同时,保证应用的可维护度 |
<object … autowiret="byName"/> |
singleton | 一个布尔量,对一个对象而言,这个属性的设置为True则只创建一个实例,false则每次调用都创建新的实例 | <object … singleton="true"/> |
init-method | 初始化方法,含义是创建实例后,调用实例的这个方法进行初始化 | init-method="init" |
method-invocation | 调用对象的方法 | <method-invocation name="init"/> |
abstract | 定义继承关系,你可以将一个对象的abstract属性设置为true,然后在另一个对象中定义parent=这个对象,含义就是继承原对象的所有的属性 | <object id="inheritedTestObject" abstract="true"> <property name="name" value="parent"/> <property name="age" value="1"/> </object> <object id="inheritsWithDifferentClass" class="org.springactionscript.objects.DerivedTestObject" parent="inheritedTestObject" init-method="initialize"> <property name="name" value="override"/> <!– the age property value of 1 will be inherited from parent –> </object> |
template | 你可以将重复性的设置工作定义为模板,然后其它对象就可以使用这个模板 | <template id="remoteObject"> <object class="mx.rpc.remoting.mxml.RemoteObject"> <property name="makeObjectsBindable" value="${makeBindable}"/> </object> </template> <object id="concreteService" template="remoteObject"> <param name="makeBindable" value="false"/> </object> |
application | Flex专属属性,你可以通过配置下面这个对象:<object class="org.springextensions .actionscript.ioc. factory. config.flex. ApplicationPropertiesResolver"/>,然后就可以在其他的配置中使用application这个变量,使用方式 是:${application.url} |
|
Part 4: 使用容器载入配置文件
上面我们讨论如何编写一个配置文件,然后我们看一下如何在Flex中载入并解析这个文件。
首先需要了解的是,我们如果要在Flex中使用DI注入对象,需要使用一个IoC容器来做这件事。 FlexXMLApplicationContext 或 XMLApplicationContext 是Spring关于IoC的基础容器。两者基本相同,第一个只是增加了对Flex的支持,比如ArrayCollection。一般也认为这是程序的入 口,我们写代码的开始会用到这两个类,用于载入和分析配置文件(XML)。
使用容器载入配置的代码示例:
var applicationContext:XMLApplicationContext = new XMLApplicationContext(); applicationContext.addConfigLocation("application-context.xml"); applicationContext.load();
在下一个章节,我们将来讲述使用Spring ActionScript创建一个简单的实例,而在第三个章节,我们则会引入Cairngorm。