Загрузка бобов из банки с зависимостью
У меня есть сценарий, в котором мне нужно смоделировать следующее:
Скажем, у меня есть проект "LoadingBean". Мне нужно загрузить classA (из проекта "Внешний" как JAR, добавленный к пути к классу "Loading Bean") после загрузки контекста приложения для "LoadingBean". Не только это, если classA имеет зависимость от classB, даже classB должен быть загружен.
Текущий контекст приложения и новые классы, которые должны быть загружены, обычно должны работать в двух разных контейнерах JVM.
Я решил проблему таким образом:
- Загрузка Beans содержит
Main.java
package com.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
Object obj = context.getBean("MessageBean");
System.out.println(obj);
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
<bean id="MessageBean" class="com.bean.Message">
<property name="msg" value="Hello World!!!"/>
</bean>
<bean id="HelloWorldBean" class="com.bean.HelloWorld">
<property name="message" value="Howdie World!!!"/>
</bean>
</beans>
- "Внешний" содержит
Message.java
package com.bean;
import org.springframework.beans.factory.annotation.Autowired;
public class Message {
@Autowired
private HelloWorld hw;
private String msg;
public HelloWorld getHw() {
return hw;
}
public void setHw(HelloWorld hw) {
this.hw = hw;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
HelloWorld.java
package com.bean;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.stereotype.Component;
@Component
public class HelloWorld {
private String message;
public String getMessage() {
try {
return new JSONObject(message).toString();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
public void setMessage(String message) {
this.message = message;
}
}
ExternalBeans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
<bean id="MessageBean" class="com.bean.Message">
<property name="msg" value="Hello World!!!"/>
</bean>
<bean id="HelloWorldBean" class="com.bean.HelloWorld">
<property name="message" value="Howdie World!!!"/>
</bean>
</beans>
Я создал из этого простой JAR-файл и включил его в путь к классу для "LoadingBeans". При вызове функции get в Message.java загружается HelloWorld и его JSON-зависимости.
Класс HelloWorld загружается при вызове get для Message.java, но зависимости JSON не загружаются. Есть ли обходной путь для этого? Есть ли еще что-то, о чем мне нужно позаботиться, чтобы проверить этот сценарий? Мне не нужно использовать "работающий JAR" правильно? Поскольку в "Внешнем" нет основного метода.
1 ответ
Ваш вопрос немного сложен, и я не могу связать цитируемый код и JSON-информацию, которую вы упоминаете.
Однако, исходя из вашего кода, поскольку beans.xml идентичен загруженному файлу externalBeans.xml, зачем вам его копировать? Вы можете очень хорошо сослаться на него через ваш основной метод, и beans.xml, classA и classB все взяты из одного и того же "внешнего" jar.