如何从给定的URL生成Spring加载类(用于bean实例化)?

时间:2012-01-19 22:17:47

标签: java spring urlclassloader

有没有办法告诉Spring在实例化bean时从给定的URL加载类?我需要从不在类路径中的位置加载类。如果我使用纯Java,我可以使用URLClassLoader但是如何在Spring中实现这一点?我使用的是Spring 3.0

2 个答案:

答案 0 :(得分:4)

扩展DefaultResourceLoader的所有Spring类都可以有一个明确的ClassLoader引用集(通过DefaultResourceLoader.setClassLoader(ClassLoader)

AbstractApplicationContext恰好是其中一个类。因此,扩展它的所有ApplicationContext实现(如ClassPathXmlApplicationContextFileSystemXmlApplicationContext)都可以使用注入的ClassLoader引用。

答案 1 :(得分:0)

public class Main {

    public static void main(String[] args) throws Exception {  
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AutodeployConfiguration.class);

        URL[] files = {
            new File("C:\\module1.jar").toURL(),
            new File("C:\\propertiesdirectory\\").toURL()
        };

        URLClassLoader plugin = new URLClassLoader(files, Main.class.getClassLoader());
        Thread.currentThread().setContextClassLoader(plugin);

        Class startclass = plugin.loadClass("de.module1.YourModule");
        ExternalModule start = (ExternalModule) startclass.newInstance();
        AnnotationConfigApplicationContext ivr = start.onDeploy(plugin, ctx);
    }
}


public class YourModule implements ExternalModule {

    @Override
    public AnnotationConfigApplicationContext onDeploy(ClassLoader classloader, GenericApplicationContext parent) {      
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.setClassLoader(classloader);
        applicationContext.setParent(parent);
        applicationContext.register(ModuleConcreteConfiguration.class);
        applicationContext.refresh();


        // other code

        return applicationContext;
    }
}