Loading Multiple Spring Application Contexts with their own ClassLoader
here's a quick snippet to support creating an application context with it's own classloader.
package de.incompleteco.spring.context; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.DefaultResourceLoader; public class ApplicationContextClassLoader { public ClassLoader getClassLoader(String location) throws Exception { File f = new File(location); return new URLClassLoader(new URL[]{f.toURI().toURL()}); } public ApplicationContext getContext(String location,String... contextPaths) throws Exception { return getContext(null,location,contextPaths); } public ApplicationContext getContext(ApplicationContext parentContext,String location,String... contextPaths) throws Exception { //init GenericApplicationContext context = new GenericApplicationContext(); //build the app context if (parentContext != null) { context = new GenericApplicationContext(parentContext); }//end if XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(context); //get the classloader ClassLoader loader = getClassLoader(location); //set the loader reader.setBeanClassLoader(loader); reader.setResourceLoader(new DefaultResourceLoader(loader)); //get the bean definitions reader.loadBeanDefinitions(contextPaths); //init context.refresh(); //return return context; } }
this supports XML configuration but annotation can be swapped in/out as the case may require. i'm sure there are prettier ways and i'll tighten it up when i get the chance
No comments:
Post a Comment