diff --git a/source/java/org/alfresco/util/ApplicationContextHelper.java b/source/java/org/alfresco/util/ApplicationContextHelper.java index 4aded2c80d..12052fb47e 100644 --- a/source/java/org/alfresco/util/ApplicationContextHelper.java +++ b/source/java/org/alfresco/util/ApplicationContextHelper.java @@ -39,6 +39,7 @@ public class ApplicationContextHelper { private static ClassPathXmlApplicationContext instance; private static String[] usedConfiguration; + private static boolean useLazyLoading = false; /** location of required configuration files */ public static final String[] CONFIG_LOCATIONS = new String[] { "classpath:alfresco/application-context.xml" }; @@ -79,8 +80,13 @@ public class ApplicationContextHelper } // The config has changed so close the current context (if any) closeApplicationContext(); - - instance = new ClassPathXmlApplicationContext(configLocations); + + if(useLazyLoading) { + instance = new LazyClassPathXmlApplicationContext(configLocations); + } else { + instance = new ClassPathXmlApplicationContext(configLocations); + } + usedConfiguration = configLocations; return instance; @@ -102,6 +108,25 @@ public class ApplicationContextHelper usedConfiguration = null; } + /** + * Should the Spring beans be initilised in a lazy manner, or + * all in one go? + * Normally lazy loading/intialising shouldn't be used when + * running with the full context, but it may be appropriate + * to reduce startup times when using a small, cut down context. + */ + public static void setUseLazyLoading(boolean lazyLoading) { + useLazyLoading = lazyLoading; + } + /** + * Will the Spring beans be initilised in a lazy manner, or + * all in one go? The default it to load everything in one + * go, as spring normally does. + */ + public static boolean isUsingLazyLoading() { + return useLazyLoading; + } + public static void main(String ... args) { ClassPathXmlApplicationContext ctx = (ClassPathXmlApplicationContext) getApplicationContext(); diff --git a/source/java/org/alfresco/util/LazyClassPathXmlApplicationContext.java b/source/java/org/alfresco/util/LazyClassPathXmlApplicationContext.java new file mode 100644 index 0000000000..97128f16a4 --- /dev/null +++ b/source/java/org/alfresco/util/LazyClassPathXmlApplicationContext.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.util; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; +import org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader; +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; +import org.springframework.beans.factory.xml.XmlReaderContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.w3c.dom.Element; + +/** + * A wrapper around {@link ClassPathXmlApplicationContext} which forces + * all beans to be loaded lazily. + * You shouldn't do this in production, but it can be handy with + * unit tests, as it allows a quicker startup when you don't touch + * much of the application. + * + * @author Nick Burch + */ +public class LazyClassPathXmlApplicationContext extends + ClassPathXmlApplicationContext { + + public LazyClassPathXmlApplicationContext(String[] configLocations) + throws BeansException { + super(configLocations); + } + + protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) { + super.initBeanDefinitionReader(reader); + + reader.setDocumentReaderClass(AlwaysLazyInitBeanDefinitionDocumentReader.class); + } + + protected static class AlwaysLazyInitBeanDefinitionDocumentReader extends DefaultBeanDefinitionDocumentReader { + @Override + protected BeanDefinitionParserDelegate createHelper( + XmlReaderContext readerContext, Element root) { + BeanDefinitionParserDelegate helper = super.createHelper(readerContext, root); + helper.getDefaults().setLazyInit("true"); + return helper; + } + } +}