4

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

4

2 回答 2

5

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

AbstractApplicationContext恰好是这些课程之一。因此,所有扩展它的 ApplicationContext 实现(如ClassPathXmlApplicationContextFileSystemXmlApplicationContext)都可以使用注入ClassLoader引用。

于 2012-01-19T22:36:11.117 回答
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;
    }
}
于 2015-03-26T19:43:48.490 回答