您的位置:首页 > 编程语言 > Java开发

Spring 运行中 动态加载xml并实例化Bean

2015-10-16 13:27 537 查看
工作中总有各种各样另类问题发生,比如像我遇到的需要动态加载指定jar文件并实例化运行。拿到这个问题,主要问题就是

动态指定的jar文件不存在于classpath中,如何让Spring知道并引用

都知道jvm是通过classloader加载class,并且是通过加载当前类的classloader加载本class应用的class(有些拗口),当加载本类的classloader找不到再用父类加载。(细流程可参见网上其他分享)

需要做的就是 使用指定的ClassLoader并添加到系统classPath中。所以如下

private void loadXml(String jarPath) {
try {
ClassLoaderUtil.addUrlToClassPath(new URL("file:" + jarPath), Thread.currentThread().getContextClassLoader().getSystemClassLoader());
} catch (MalformedURLException e) {
e.printStackTrace();
}

XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(
(BeanDefinitionRegistry) ((ConfigurableApplicationContext) applicationContext).getBeanFactory());
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(applicationContext));

logger.info("loading ......");
// 将jar文件添加到classpath中后,就可以通过Spring工具类,找到jar文件下的xml文件。
org.springframework.core.io.Resource resouce =  new ClassPathResource("spring-executor.xml");
beanDefinitionReader.loadBeanDefinitions(resouce);
logger.info(resouce);
}


ClassLoaderUtil 工具类添加指定路径jar到classpath。

public class ClassLoaderUtil {

public static void addUrlToClassPath(URL url, ClassLoader classLoader) {
Method addURL_method = ReflectionUtils.findMethod(classLoader.getClass(), "addURL",new Class[]{URL.class});
ReflectionUtils.makeAccessible(addURL_method);
try {
addURL_method.invoke(classLoader, new Object[]{url});
} catch (Exception e) {
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息