代码改变世界

ActionScript3.0: 应用程序域

2009-02-14 23:39  宝宝合凤凰  阅读(395)  评论(0)    收藏  举报

ActionScript3.0: 应用程序域

帖子igoo 于 2008年 11月 15日 22:51

AS3.0 提供对加载外部SWF文件的安全域控制, 也就是说, 你可以决定所加载的SWF是在什么范围下运行. 这个"范围"的概念是被加载的SWF文件是在当前的SWF中运行还是以它本身做为一个安全域独立运行代码.
例如: 可以使同一个应用程序域中的类划分到该域中的不同域去, 也可以在这些不同的子域中对同一个类进行分别定义等等.

使用应用程序域时, 要记住以下几点:
  • SWF 文件中的所有代码被定义为存在于这个应用程序的域中并运行. "系统域"是包含所有应用程序域(包括当前域)的域, 也就是说它包含所有 Flash Player 类.
  • 系统域下的所有应用程序域都有关联的父域, 主应用程序域的父域就是系统域. 已加载的类仅在其父级中没有定义时才进行定义, 也就是说不能用较新的定义覆盖已加载的类.
 
load_content_app.png (61.13 KiB) 被浏览 10 次

图中显示了某个应用程序在单个域 (domain1.com) 中加载多个 SWF 文件的逻辑内容。根据加载内容的不同,可以使用不同的应用程序域。

主应用程序文件为 application1.swf。它包含从其它 SWF 文件加载内容的 Loader 对象。在此方案下,当前域为应用程序1。用法 A、用法 B 和用法 C 说明了为应用程序中的每个加载的 SWF 文件设置适当应用程序域的不同方法。

  • 用法 A:通过创建系统域的子级划分子级 SWF 文件。在示意图中,应用程序2创建为系统域的子级。application2.swf 文件在应用程序2中加载,因此其类定义从 application1.swf 中定义的类中划分出来。

    此方法的一个用处是使旧版应用程序能够动态加载相同应用程序的更新版本,而不会发生冲突。之所以不发生冲突,是因为尽管使用的是同样的类名称,但它们划分到不同的应用程序域中。

    以下代码将创建作为系统域子级的应用程序域:
    代码: 全选
    request.url = "application2.swf";
    request.applicationDomain = new ApplicationDomain();

  • 用法 B:在当前类定义中添加新的类定义。module1.swf 的应用程序域设置为当前域 (应用程序1)。这可让您将新的类定义添加到应用程序的当前一组类定义中。这可用于主应用程序的运行时共享库。加载的 SWF 被视为远程共享库 (RSL)。使用此方法可以在应用程序启动之前使用预加载器加载 RSL。

    以下代码将某应用程序域设置为当前域:
    代码: 全选
    request.url = "module1.swf";
    request.applicationDomain = ApplicationDomain.currentDomain;

  • 用法 C:通过创建当前域的新子域,可以使用父级的类定义。module3.swf 的应用程序域是当前域的子级,并且子级使用的类将是父级中的版本。
    此方法的一个用处在于作为一个使用主应用程序类的多屏幕丰富 Internet 应用程序 (RIA) 模块,该模块作为主应用程序的子级加载。适用于如下情况:
    如果要确保所有类始终更新为向后兼容,并且主应用程序始终比其加载的软件版本要新,则子级将使用父级版本。
    如果要确保不继续拥有对子级 SWF 的引用,则拥有了新的应用程序域还使您能够卸载所有的类定义以便于垃圾回收。

    此方法使加载的模块可以共享加载者的 singleton 对象和静态类成员。

    以下代码将创建当前域的新子域:
    代码: 全选
    request.url = "module3.swf";
    request.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);