<cfcomponent output="false">

<cfset variables.factoryName=createObject("component","coldspring.beans.util.BeanFactoryUtils").init().DEFAULT_FACTORY_KEY>

<cffunction name="init" output="false" access="public">
	<cfargument name="beanXML" default="/beans.xml" required="false">
	<cfset var beans=''>
	<cfset var bean=''>
	<cfset var beansList=''>
	<cfset var i=''>
	<cflock name="beanFactoryCreateObjectLock" type="readonly" 
		throwontimeout="true" timeout="30">
		<cfif not structKeyExists(application,variables.factoryName)>
			<cflock scope="Application" type="exclusive" 
				throwontimeout="true" timeout="30">
				<cfset application[variables.factoryName] = CreateObject('component', 'coldspring.beans.DefaultXmlBeanFactory').init() />
				<cfset application[variables.factoryName].loadBeansFromXmlFile(arguments.beanXML) />
			
				<cfset beans=application[variables.factoryName].getBeanDefinitionList()>
				<cfset beansList=structKeyList(beans)>
				<cfloop list="#beansList#" index="i">
					<cfif beans[i].getBeanClass() is 'coldspring.aop.framework.RemoteFactoryBean' or 
						 beans[i].getBeanClass() is 'coldspring.metadata.MetadataAwareRemoteFactoryBean'>
						<cfset bean=application[variables.factoryName].getBean("#i#")>
					</cfif>
				</cfloop>
			</cflock>
		</cfif>
	</cflock>
</cffunction>

<cffunction name="destroy" output="false" access="public">
	<cfset structDelete(application,variables.factoryName)>
</cffunction>

</cfcomponent>
