转载:http://www.riameeting.com/node/451
本文接上一部分继续完成RSS阅读器实例,在上个部分中我们完成了Lib项目的构建,其实已经基本上完成了项目本身的逻辑代码,而在这一部分,我们将把这个Lib引入到IoC框架中,并编写相应的XML配置文件,最终完成装配,形成完整的应用。
Part4 实现主项目SpringActionScriptCairngormDemo
让我们回到SpringActionScriptCairngormDemo,开始完成IoC的注入工作。
4.1 配置编译参数
打开项目属性,在编译参数部分,将项目依赖的SWC文件都设置好,包括两部分:一部分是已经下载到libs目录下的SWC文件,还要把我们上个例子中编译好的SpringActionScriptCairngormDemoLib.swc也配置进去,配置参数应该如下:
-locale en_US -default-background-color #000000 -include-libraries ../libs/spring-actionscript.swc ../libs/spring-actionscript-cairngorm.swc ../libs/as3commons-reflect.swc ../libs/as3commons-lang.swc ../libs/as3commons-logging.swc ../libs/flexunit.swc ../../SpringActionScriptCairngormDemoLib/bin/SpringActionScriptCairngormDemoLib.swc
参见附图:
4.2 写配置XML
在src目录下,创建一个文件夹名为“config”,然后在config下面再创建两个目录,分别是cairngorm和view,第一个目录是 为了存放和Cairngorm相关的配置,第二个目录是用于存放跟视图相关的配置。当然这样拆分目录是为了便于区分和维护,实际上你也可以根据需要按照自 己的需要拆分目录结构,IoC对此没有硬性要求。
首先我们先来配置Cairngorm的部分,将Cairngorm部分必须的 Service,ModelLocator,FrontControler等部分一一做配置。在cairngorm目录下,创建一个XML文件,名为 “cairngorm.xml”。输入下面的内容:
<objects> <!--ModelLocator--> <object id="appModelInstance" class="com.riameeting.model.ApplicationModel" factory-method="getInstance" singleton="true"> <property name="feedURL" value="http://www.riameeting.com/rss.xml" /> </object> <!--Service Locator--> <object id="serviceLocator" class="org.springextensions.actionscript.cairngorm.business.CairngormServiceLocator" factory-method="getInstance"> <property name="feedService"> <ref>feedService</ref> </property> </object> <object id="feedService" class="mx.rpc.http.HTTPService"> <property name="url" value="http://www.riameeting.com/rss.xml"/> <property name="method" value="GET"/> <property name="useProxy" value="false"/> <property name="resultFormat" value="text"/> </object> <!--Delegate Factory--> <object id="businessDelegateFactory" class="org.springextensions.actionscript.cairngorm.business.BusinessDelegateFactory"> <property name="service" ref="feedService"/> <property name="delegateClass" type="class" value="com.riameeting.business.GetFeedDelegate"></property> </object> <!--FrontControler--> <object id="appAwareCmdFactory" class="com.riameeting.factories.ApplicationModelAwareCommandFactory"> <property name="applicationModel" ref="appModelInstance"/> <method-invocation name="addBusinessDelegateFactory"> <arg> <ref>businessDelegateFactory</ref> </arg> <arg> <array> <value type="Class">com.riameeting.command.GetFeedCommand</value> </array> </arg> </method-invocation> </object> <object id="frontController" class="org.springextensions.actionscript.cairngorm.control.CairngormFrontController"> <constructor-arg> <object> <property name="getFeedEvent" value="GetFeedCommand"/> </object> </constructor-arg> <constructor-arg value="com.riameeting.command"/> <method-invocation name="addCommandFactory"> <arg><ref>appAwareCmdFactory</ref></arg> </method-invocation> </object> </objects>
可以看到主体配置分为4个部分:
- ModelLocator – 对应在Lib中创建的ApplicationModel,在此创建一个Model的实例
- Service Locator – 先创建一个ID为“feedService”的HTTPService,然后创建一个ID为“serviceLocator”的Service Locator,将feedService引入进去
- Delegate Factory – 我们通过配置代理工厂,将第二部分的服务注入到代理中去,这样代理就具备了通过自身调用服务的能力,而不需要同外部服务产生直接的依赖
- FrontControler – 首先我们配置工厂类ApplicationModelAwareCommandFactory,将Model注入到Command中去。然后创建一个前端控制器“frontController”,将事件与命令之间建立映射。
然后我们来创建一个关于视图的配置文件,定义界面上都显示什么样的组件,在view下面创建一个XML文件,名为“global.xml”,然后输入下面的内容:
<objects> <object id="searchForm" class="com.riameeting.view.AddressBar"> <property name="model" ref="appModelInstance"/> <property name="x" value="10"/> <property name="y" value="10"/> </object> <!--<object id="searchResult" class="com.riameeting.view.SearchResultWithTable">--> <object id="searchResult" class="com.riameeting.view.SearchResult"> <property name="model" ref="appModelInstance"/> <property name="x" value="10"/> <property name="y" value="60"/> </object> <object class="com.riameeting.utils.ApplicationViewAssembler" init-method="init"> <property name="elements"> <value> <array> <ref>searchForm</ref> <ref>searchResult</ref> </array> </value> </property> </object> </objects>
你可以看到视图方面配置了三个部分,第一个对应我们在Lib中定义的搜索组件,ID是searchForm,第二个是用于显示Feed内容的列表组 件,ID是searchResult,而第三个配置只是为了使用工具类将前两个组件添加到显示列表中。并且为每一个视图组件,都指定了Model的引用, 就是我们在Cairngom.xml中配置好的Model。
然后我们定义一个主体的XML,在config下面创建一个名为“”的XML文件,引入上面创建的两个XML,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <objects> <import file="view/global.xml"/> <import file="cairngorm/cairngorm.xml"/> </objects>
4.3 实现IoC容器载入
打开SpringActionScriptCairngormDemo.mxml,建立一个代码块,声明一下IoC容器,载入配置文件,代码如下:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute" width="420" height="480" viewSourceURL="srcview/index.html"> <mx:Script> <![CDATA[ import org.springextensions.actionscript.context.support.FlexXMLApplicationContext; private function init():void { var context:FlexXMLApplicationContext = new FlexXMLApplicationContext(appContextPath); context.load(); } trace("loaded"); } ]]> </mx:Script> </mx:Application>
编译并运行项目,就可以看到运行结果了。
演示地址:
http://www.riameeting.com/examples/SpringASCairngormDemo/SpringActionScriptCairngormDemo.html
提示:你可以在Demo上点击右键查看源码。
附件中是两个项目的源码下载。