From f2554d0f6380f0c67ff4afb6c8e77d8af9545bea Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 4 Feb 2010 14:35:49 +0000 Subject: [PATCH] Allow lazy loading of beans from the ApplicationContext if requested git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@18453 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../util/ApplicationContextHelper.java | 29 +++++++- .../LazyClassPathXmlApplicationContext.java | 67 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 source/java/org/alfresco/util/LazyClassPathXmlApplicationContext.java 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; + } + } +}