Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3333183
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类: 系统运维

2012-07-27 11:09:38

1.概述
      flash.system.ApplicationDomain->Object,该类为final 类。

ApplicationDomain类常见属性
(1)currentDomain : ApplicationDomain
    [静态] [只读 (read-only)] 获取正在其中执行代码的当前应用程序域。
(2)parentDomain : ApplicationDomain
    [只读 (read-only)] 获取该应用程序域的父域。

      当程序中牵涉到加载外部.swf程序时,了解程序作用域的概念是非常重要的。
      SWF 文件中的所有代码被定义为存在于ApplicationDomain中。 主应用程序就在当前的应用程序域中运行。 系统域中包含所有应用程序域(包括当前域),这意味着它包含所有 Flash Player 类。
      除系统域以外,每个应用程序域都有一个关联的父域。 主应用程序的应用程序域的父域是系统域。 已加载的类仅在其父级中没有相关定义时才进行定义。 不能用较新的定义覆盖已加载的类定义。

2.程序作用域的三种实现
      所有的Flex/Flash程序都是由一系列类组合而成。这一系列类都维持在一个程序作用域中。当仅有一个程序在运行时,程序作用域的概念只是一个形式,因为不可能发生作用域冲突的事情。当加载额外的.swf程序后,情况就不一样了,此时,可能会发生3种情况:

(1)被加载的.swf在现有作用域的子作用域中运行
    这种情况下,被加载.swf可以使用父作用域中的所有类,类似于“继承”,子域可以直接获得父域所有的类定义,反之父域得不到子域的。和继承关系不同的是,如果子域中有和父域同名的类,子域定义会被忽略而使用父域的定义。
    这样子有3个好处:
        减少内存的占用。
        单态管理者(Singleton manager classes)可以访问父级程序,也可以访问子级程序。
        从技术角度讲,在编译子级程序时,可以不用把重复的类编译进去,从而减少文件大小
    但有时不能忽视子作用域的类。比如碰到类名虽然冲突,但功能却不相同时。

代码如下

点击(此处)折叠或打开

  1. //------------------------------------------------------------
  2. // 被加载的.swf在现有作用域的子作用域中运行
  3. //------------------------------------------------------------
  4. var context:LoaderContext = new LoaderContext();
  5. context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
  6. var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
  7. var loader:Loader = new Loader();
  8. loader.load(request, context);
  9. // 等同于
  10. var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
  11. var loader:Loader = new Loader();
  12. loader.load(request);



(2)被加载的.swf在一个新的完全独立的作用域中运行
    这种情况下,被加载.swf在一个不受任何约束的作用域中运行。虽然不会发生什么冲突,但这样会加大内存的占用。和加载到子域相同,和当前域同名的定义也会被忽略。
代码如下

点击(此处)折叠或打开

       //------------------------------------------------------------
  1. // 被加载的.swf在一个新的完全独立的作用域中运行
  2. //------------------------------------------------------------
  3. var context:LoaderContext = new LoaderContext();
  4. context.applicationDomain = new ApplicationDomain();
  5. var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
  6. var loader:Loader = new Loader();
  7. loader.load(request, context);


(3)被加载的.swf在现有作用域中运行
    这种情况下,被加载.swf在现有的作用域中运行,被看作现有内容的一部分。常常用于运行共享库

代码如下

点击(此处)折叠或打开

  1. //------------------------------------------------------------
  2. // 被加载的.swf在现有作用域中运行
  3. //------------------------------------------------------------
  4. var context:LoaderContext = new LoaderContext();
  5. context.applicationDomain = ApplicationDomain.currentDomain;
  6. var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
  7. var loader:Loader = new Loader();
  8. loader.load(request, context);

3.安全域/系统域的问题
      安全域/系统域是flash的顶级沙箱。我们知道应用程序域只存在于安全域内,并且只能属于唯一的一个安全域。但是安全域可以包含多个应用程序域。
      两个不同安全域下的SWF通常是不可以互相通信的(在没有信任授权的情况下)。

      再看LoaderContent(checkPolicyFile:Boolean = false,,);
      checkPolicyFile检查策略文件的,是否允许加载策略文件(也就是信任授权)。

      如果两个SWF处于不同的安全域下,某个SWF中的数据(比如某个变量)是不可以被其他SWF获取的,当然,代码也不能执行。如果尝试获取其他域中的SWF文件的数据将会产生一个安全错误。

       一般来说,我们常用的就是父域下的新建子域、子SWF和父SWF应用程序域的合并(运行时共享库)。

4.图例说明
      一个窗体只能有一个安全域(系统域)
      一个系统域可以包含多个应用程序域
     




   application1.swf就是主应用程序,它的applicationdomain就是Application doamin1,是 system domain的子节点。
     module3.swf将application1的域作为父域
     module1.swf与application1使用同一个域
     application2.swf使用了单独的域


参考文献
1.Flex框架的基本原理 .http://blog.chinaunix.net/cp.php?ac=blog&blogid=3289689&op=edit
2.ApplicationDomain .
3.Flex的ApplicationDomain .http://blog.csdn.net/skill1986/article/details/6777957
4.AS3应用程序模块化开发与ApplicationDomain . http://www.duzengqiang.com/blog/post/283.html
5.应用程序域ApplicationDomain和安全域Security Domains.
阅读(2410) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~