SyntaxHighlighter

Showing posts with label ClassLoader. Show all posts
Showing posts with label ClassLoader. Show all posts

Tuesday, July 9, 2013

Loading Multiple Spring Application Contexts with their own ClassLoader

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