2016-11-10 1 views
3

У меня есть этот код:нагрузки класса со всеми компонентами это от Outter баночки

// Getting the jar URL which contains target class 
    URL[] classLoaderUrls = new URL[]{new URL("LINKTOJAR")}; 

    // Create a new URLClassLoader 
    URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls); 

    // Load the target class 
    Class<?> beanClass = urlClassLoader.loadClass("com.my.class"); 

    // Create a new instance from the loaded class 
    Constructor<?> constructor = beanClass.getConstructor(); 
    Object beanObj = constructor.newInstance(); 

    // Getting a method from the loaded class and invoke it 
    Method method = beanClass.getMethod("sayHello"); 
    method.invoke(beanObj); 

Это должно вызвать метод SayHello, который необходимо один компонент для работы.

Метод печатает «Hello% Name», где это имя @AutoWired String.

Вызов метода работает, но проблема в том, что он просто говорит «Привет», потому что String не автоподключен, и это «null».

Как я могу сделать это возможным для Autowired, если весь контекст находится в банке, которую я вызываю и, кажется, не загружается?

Спасибо.

EDIT ::

Идея заключается в том, чтобы иметь что-то вроде:

ApplicationContext context = new ClassPathXmlApplicationContext(
     "classpath*:**/applicationContext*.xml"); 

MyAdder myAdder = (MyAdder) context.getBean("myAdder"); 

Для того, чтобы загрузить контекст, но я не знаю, как загрузить этот контекст из Outter баночке.

ответ

0

Как вы ожидаете, что это сработает, поскольку Spring не имеет представления о ваших внешних классах - это вне контекста приложения. Инъекция действительно выглядит как «магия», но она просто выполняется контейнером Spring.

Вам нужно будет использовать свой собственный контекст приложения и получить bean-файл «Spring-путь».

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

Один из способов будет для вас, чтобы ввести требуемую строку в текущем контексте, и передать его в качестве аргумента метода.

Другим, более «инъецируемым» методом является установка строки самостоятельно с помощью отражения - это более или менее то, как это делается контейнером Spring внутри.

+2

Да, это вопрос, как я могу загрузить контекст фонаря, чтобы сделать эту работу. Проблема в том, что не просто вставлять String, представьте, что строка исходит из базы данных, которая настроена с помощью MyBatis ... Мне нужна эта логика для загрузки, но я не вижу способа выполнить jar, чтобы иметь все working –

+0

Вы можете попробовать autowire с существующим контекстом приложения. http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html – Antoniossss

Смежные вопросы