Gui*_*ume 11
那么,在测试你的应用程序时执行这样的上下文重新加载会很有用.
您可以尝试refresh
其中一个AbstractRefreshableApplicationContext
类的方法:它不会刷新以前的instanciated bean,但下一次调用上下文将返回刷新的bean.
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
你得到了这个结果
fromContextA
fromContextB
Run Code Online (Sandbox Code Playgroud)
另一种实现这一目标的方法(也许是一个更简单的方法)是使用Spring 2.5+的Refreshable Bean功能.使用动态语言(groovy等)和spring,你甚至可以改变你的bean行为.看一下动态语言的spring参考:
24.3.1.2.可磨豆
Spring中动态语言支持的一个(如果不是)最引人注目的增值是"可刷新的bean"功能.
可刷新bean是一个动态语言支持的bean,只需少量配置,动态语言支持的bean就可以监视其底层源文件资源的变化,然后在动态语言源文件发生变化时重新加载(对于例如,开发人员编辑并保存对文件系统上文件的更改).
Dov*_*vmo 11
对于那些最近磕磕绊绊的人来说 - 解决这个问题的当前和现代方法是使用Spring Boot的Cloud Config.
只需添加@RefreshScope注释您刷新豆类和@EnableConfigServer你的主/配置.
所以,例如,这个Controller类:
@RefreshScope
@RestController
class MessageRestController {
@Value("${message}")
private String message;
@RequestMapping("/message")
String getMessage() {
return this.message;
}
}
Run Code Online (Sandbox Code Playgroud)
每当更新配置时,都会message
为/message
端点返回String属性的新值.
有关更多实现详细信息,请参阅官方的Spring Central for Centralized Configuration示例.
归档时间: |
|
查看次数: |
47556 次 |
最近记录: |