Как я могу заставить Spring загружать классы с заданного URL (для создания экземпляров bean)? - PullRequest
3 голосов
/ 20 января 2012

Есть ли способ сообщить Spring, чтобы загружать классы с заданного URL при создании экземпляров bean-компонентов? Мне нужно загрузить классы из местоположения, которого нет в пути к классам. Если бы я использовал чистую Java, я мог бы использовать URLClassLoader, но как я могу добиться этого весной? Я использую Spring 3.0

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Все классы Spring, которые расширяются DefaultResourceLoader, могут иметь явный набор ссылок ClassLoader (через DefaultResourceLoader.setClassLoader(ClassLoader).

AbstractApplicationContext оказывается одним из тех классов. Поэтому все реализации ApplicationContext, которые расширяют его (например, ClassPathXmlApplicationContext и FileSystemXmlApplicationContext), могут использовать вставленную ссылку ClassLoader.

0 голосов
/ 26 марта 2015
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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...