Что ж, может быть полезно выполнить такую перезагрузку контекста при тестировании вашего приложения.
Вы можете попробовать метод refresh
одного из классов AbstractRefreshableApplicationContext
: он не обновит ваши ранее созданные компоненты, но следующий вызов контекста вернет обновленные компоненты.
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ReloadSpringContext {
final static String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\"\n" +
" \t\"http://www.springframework.org/dtd/spring-beans.dtd\">\n";
final static String contextA =
"<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
"\t\t<constructor-arg value=\"fromContextA\"/>\n" +
"</bean></beans>";
final static String contextB =
"<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
"\t\t<constructor-arg value=\"fromContextB\"/>\n" +
"</bean></beans>";
public static void main(String[] args) throws IOException {
//create a single context file
final File contextFile = File.createTempFile("testSpringContext", ".xml");
//write the first context into it
FileUtils.writeStringToFile(contextFile, header + contextA);
//create a spring context
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
new String[]{contextFile.getPath()}
);
//echo the bean 'test' on stdout
System.out.println(context.getBean("test"));
//write the second context into it
FileUtils.writeStringToFile(contextFile, header + contextB);
//refresh the context
context.refresh();
//echo the bean 'test' on stdout
System.out.println(context.getBean("test"));
}
}
И вы получите этот результат
fromContextA
fromContextB
Еще один способ добиться этого (и, возможно, более простой) - использовать функцию Refreshable Bean в Spring 2.5+
С помощью динамического языка (groovy и т. Д.) И весны вы даже можете изменить свое поведение компонента. Посмотрите на справочник по пружине для динамического языка :
24.3.1.2. Восстанавливаемые бобы
Один из (если не самый) самый
неотразимая добавка стоимости динамического
поддержка языков в Spring
функция «обновляемый боб».
Обновляемый боб
динамически поддерживаемый язык, который с
небольшое количество конфигурации,
бин с динамическим языком
отслеживать изменения в своей основе
ресурс исходного файла, а затем перезагрузите
сам, когда динамический язык
исходный файл изменен (например,
когда разработчик редактирует и сохраняет
изменения в файле на
файловая система).