ColdFusion CFC实例创建的生命周期是什么?

时间:2011-02-23 19:06:16

标签: object coldfusion components instance cfc

我想知道如何在引擎盖下的coldfusion中实例化cfc!我知道你创建了一个组件实例,你将获得对新创建的实例的引用,你可以使用它来调用它们内部的公共方法。

但是当我编写代码

时究竟发生了什么
<cfscript>
 person = createObject('component','human') // what happen here!!!!
 person.speak();
</cfscript>

对我的陈述做了一些修正!!!我问这个问题的原因是因为我有一个存储在应用程序范围内的实例,而实例的使用方法如下所示

application.person.speak();

现在负载非常高。我发现内存不是为obj而发布的,并且在某些时候它达到了200mb ..奇怪! 。因此,按照最佳实践中的说法进行了修正

request.person = duplicate(application.person);

现在有另一个直接的方法来做到这一点

request.person = createObject('component','human');

区别,第一个创建对象并将其保持在共享范围内,每次发出请求时都要执行深层复制(此处实例仅创建一次)。第二个是每次发出请求时都会创建实例。它们之间存在性能差异,因为在第二种方法中,每次都会创建实例。我想知道创建一个实例背后的架构究竟是什么,使它不如前者更好!!

只是想知道!

3 个答案:

答案 0 :(得分:3)

Coldfusion编译成Java,当你调用“createObject”函数时,你正在创建该类的实例。以下是一些可能有助于解释的链接:

http://www.bennadel.com/blog/325-ColdFusion-CreateObject-vs-Java-NewInstance-.htm

http://blog.objectorientedcoldfusion.org/2009/07/16/coldfusion-9-object-creation-performance/

答案 1 :(得分:0)

根据我的理解,它在cfc中运行init方法/函数,然后运行speak方法/函数。

答案 2 :(得分:0)

那里发生了什么?没什么特别的。

对于CFC,init()只是一种用于初始化实例的方法。如果您不需要构造函数,则甚至不需要CFC。但是,它通常包含在社区采用的约定中,源自ColdFusion选择使用init()来调用Java构造函数。*

function init()
{
  // init vars in Variable scope if needed...

  return this;
}

在CF9中,当您使用new运算符时,如果它可用,它将为您调用init(),如果您的CFC没有{{1},它将不会抛出任何错误方法定义。

*在调用Java方法时,init()被转换为调用Java类的正确构造函数。如果您只想调用类的静态方法,请直接调用该方法而不使用init()