1. 程式人生 > >Spring 執行中 動態載入xml並例項化Bean

Spring 執行中 動態載入xml並例項化Bean

工作中總有各種各樣另類問題發生,比如像我遇到的需要動態載入指定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();
        }
    }

}