Jan. 11, 2016, 12:43 a.m.
试了下Spring Framework的古代版本2.5.6, 需求是动态初始化,动态加载动态配置
动态配置放到:
1. classpath:abc/abc.properties
2. file:path/to/abc.properties
包含 abc.service.address=127.0.0.1 的配置
这两种典型情况(为了不重新打包应用就能改配置)
Spring的context是xxx-context.xml
里面包含了例如 ${abc.service.address}这种变量引用。
试了试,这么写一下就能实现动态启动一个spring并且正确加载配置。
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "classpath:xxx-context.xml" },// 可以是多个context配置文件
false, // refresh=false
null);
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); //填充properties用
if (ConfigLoadHelper.getFilepathType(configPath)== ConfigLoadHelper.PathType.CLASSPATH){ //如果是classpath模式
configurer.setLocation(new ClassPathResource(ConfigLoadHelper.removeFilePrefix(configPath)));
}else { //file模式
configurer.setLocation(new FileSystemResource(ConfigLoadHelper.removeFilePrefix(configPath)));
}
((AbstractApplicationContext) ctx).addBeanFactoryPostProcessor(configurer); //比较关键
((AbstractApplicationContext) ctx).refresh(); // 启动spring
((AbstractApplicationContext) ctx).registerShutdownHook(); // shutdownhook
context=(AbstractApplicationContext)ctx;
xxxRpcService=(IXxxService)context.getBean("xxxRpcService");