Spring ActionScript一些有用的小技巧

Spring ActionScript还有一些有用的小技巧,合理利用将非常有裨益于我们的项目,整理如下,欢迎大家补充:

  1. Inner objects

    Spring ActionScript允许你直接在属性的XML标签内部声明一个对象,而无需先在外部声明,然后用ref去获得引用。注意你可以同时应用于property 或 constructor-arg。举例如下:

    1. <object id="outer" class="...">
    2. <!-- instead of using a reference to a target object, simply define the target object inline -->
    3. <property name="target">
    4. <object class="com.example.Person"> <!-- this is the inner object -->
    5. <property name="name" value="Fiona Apple"/>
    6. <property name="age" value="25"/>
    7. </object>
    8. </property>
    9. </object>
  2. Collections

    Spring ActionScript包含了一些有用的基础的数据集合,让我们方便的归类数据,这些可用的标签包括array, array-collection , dictionary 和 vector。注意如果要使用array-collection,上下文的类型必须是FlexXMLApplicationContext,因为这个集合是Flex特有的。代码示例:

    1. <object id="moreComplexObject" class="example.ComplexObject">
    2. <property name="adminEmails">
    3. <dictionary>
    4. <entry key="administrator" value="administrator@example.org"/>
    5. <entry key="support" value="support@example.org"/>
    6. <!-- or a more verbose way of defining an entry -->
    7. <entry>
    8. <key>development</key>
    9. <value>development@example.org</value>
    10. </entry>
    11. </dictionary>
    12. </property>
    13.  
    14. <property name="someList">
    15. <array>
    16. <value>a list element followed by a reference</value>
    17. <value><ref object="myOtherObject" /></value>
    18. </array>
    19. </property>
    20.  
    21. <!-- Only use this in a Flex based application -->
    22. <property name="someOtherList">
    23. <array-collection>
    24. <value>a list element followed by a reference</value>
    25. <value><ref object="myOtherObject" /></value>
    26. </array-collection>
    27. </property>
    28.  
    29. <!-- Only use this in an application made for Flash player 10 and higher -->
    30. <property name="vectorProperty">
    31. <vector type="String">
    32. <value>string1</value>
    33. <value>string2</value>
    34. <value>string3</value>
    35. <value>string4</value>
    36. </vector>
    37. </property>
    38.  
    39. </object>
  3. 使用this

    Spring ActionScript提供了this的关键字可以直接让你在配置中使用,它指向当前的上下文。这个特性是非常有用的,因为很多情况下你配置的实例,需要获得Spring ActionScript上下文的引用,你可能会直接从父级的对象去获取这个引用,但这样就破坏了解耦的原则。而使用this,你可以直接在配置的XML中将上下文传入,这样是不是优雅很多?

    1. <method-invocation name="someMethod">
    2. <arg ref="this"/>
    3. </method-invocation>
  4. 延迟初始化对象

    有时我们不希望一个对象在上下文被初始化的同时也被初始化,比如对象特别多的情况下,基于性能的考虑,这时可以使用延迟初始化,举例如下:

    1. <object id="lazy" class="com.foo.ExpensiveToCreateObject" lazy-init="true"/>
    2.  
    3. <object name="not.lazy" class="com.foo.AnotherObject"/>
  5. 使用Meta的自动装配

    Spring ActionScript对于自动装配有非常好的支持,包括byName,byType等各种模式,这里我们只介绍基于Metadata的自动装配,其它方式请参考官方文档(http://www.springactionscript.org/docs/reference/html/container-documentation.html)。

    首先要保证在XML配置中加入了自动装配的处理器:

    1. <object id="autowiringStageProcessor" class="org.springextensions.actionscript.stage.DefaultAutowiringStageProcessor"/>

    简单的属性装配可以像下面一样:

    1. public class ExampleComponent extends UIComponent {
    2.  
    3. [Autowired]
    4. public var modelInstance:IModelLocator;
    5.  
    6. public function ExampleComponent() {
    7. super();
    8. }
    9.  
    10. }

    如果你希望按照名称装配,则改为:

    1. public class ExampleComponent extends UIComponent {
    2.  
    3. [Autowired(mode='byName')]
    4. public var modelInstance:IModelLocator;
    5.  
    6. public function ExampleComponent() {
    7. super();
    8. }
    9.  
    10. }

    当然你也可以指定到配置中一个对象:

    1. public class ExampleComponent extends UIComponent {
    2.  
    3. [Autowired(name='ModelLocator')]
    4. public var modelInstance:IModelLocator;
    5.  
    6. public function ExampleComponent() {
    7. super();
    8. }
    9.  
    10. }
  6. 标注必须注入的属性

    你可以为需要注入的属性标记[Required],来保证它会在XML配置中被注入:

    1. [Required]
    2. public var myProperty:Type;

    如果你这样标记了,但是没有在XML配置中找到它的依赖,那么就会抛出IllegalArgumentError的错误。要使用这个特性,你要包含下面的对象:

    1. <object class="org.springextensions.actionscript.ioc.factory.config.RequiredMetadataObjectPostProcessor"/>
  7. 将某一个对象的属性注入其它对象

    有时候你会有这样的需求,即你要为某个对象的属性配置的依赖不是另一个对象,而是另一个对象的属性,那怎么办呢?可以使用FieldRetrievingFactoryObject

    1. <object id="trafficEventManager" class="com.myclasses.TrafficEventManager">
    2. <constructor-arg>
    3. <object class="org.springextensions.actionscript.ioc.factory.config.FieldRetrievingFactoryObject">
    4. <property name="targetObject" ref="modelLocator" />
    5. <property name="targetField" value="trafficEventTypes" />
    6. </object>
    7. </constructor-arg>
    8. </object>

    同时它也支持静态属性:

    1. <object class="org.springextensions.actionscript.ioc.factory.config.FieldRetrievingFactoryObject">
    2. <property name="staticField" value="CURRENT_VERSION"/>
    3. <property name="targetClass" value="mx.core.FlexVersion/>
    4. </object>
  8. 如何在编写配置XML的时候使用语法提示?

    首先你需要为你的FlashBuilder安装一个XML编辑器插件,比如XMLBody。然后创建一个XML文件,并使用下面的代码作为根标签:

    1. <objects
    2. xmlns="http://www.springactionscript.org/schema/objects"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springactionscript.org/schema/objects
    5. http://www.springactionscript.org/schema/objects/spring-actionscript-objects-1.0.xsd">
    6. </objects>

    熟悉XML的朋友就会发现,关键之处在于我们通过xsi:schemaLocation指定了XSD的位置,编辑器就知道该如何规范这个XML的编写。试着开始编写object,看到代码提示了吧

未完待续...

riadevID: 
您给予的分值: None 平均分: 5 ( 5 票)

发表新评论

  • 网页地址和电子邮件地址将会被自动转换为链接。
  • 行和段被自动切分。
  • 您可以使用下面的标签来高亮显示您的评论内容: <code>, <blockcode>. 可以使用"[foo]".旁边显示标签样式 "<foo>" PHP代码可以用这样的区块来包含<?php ... ?> or <% ... %>

更多格式化选项信息

验证区域
系统验证:请回答下面的问题