有没有办法告诉Spring在实例化bean时从给定的URL加载类?我需要从不在类路径中的位置加载类。如果我使用纯Java,我可以使用URLClassLoader
但是如何在Spring中实现这一点?我使用的是Spring 3.0
答案 0 :(得分:4)
扩展DefaultResourceLoader
的所有Spring类都可以有一个明确的ClassLoader
引用集(通过DefaultResourceLoader.setClassLoader(ClassLoader)
。
AbstractApplicationContext
恰好是其中一个类。因此,扩展它的所有ApplicationContext实现(如ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
)都可以使用注入的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;
}
}