Spring 執行中 動態載入xml並例項化Bean
阿新 • • 發佈:2019-01-08
工作中總有各種各樣另類問題發生,比如像我遇到的需要動態載入指定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();
}
}
}