使用自定义ResourceLoader在Spring中的@PropertySource中使用自定义资源/协议

时间:2016-01-28 16:34:09

标签: spring spring-mvc

您好我想在春天使用@PropertySource获取自定义资源,例如xyz://path/x.txt而不是类似路径文件等标准协议,它已经支持了。我找到了一种方法来做与SpringApplication相同的Spring引导,如下所示,自定义ResourceLoader

 protected WebApplicationContext run(SpringApplication app){
  app.setResourceLoader(new MyCustomResourceLoader);
  return (WebApplicationContext )app.run();
 }

同样有效,现在我可以像@PropertySource一样定义propertySource(“xyz://path/y.txt”)。但我无法弄清楚如何在普通的spring应用程序中覆盖/自定义相同的内容虽然尝试使用ResourceLoaderAware和BeanPostProcessor,但无法解决这个问题。

任何帮助..

更新 我将在我的自定义ResourceLoader

中进行操作
public Class CustomResourceLoader extends DefaultResourceLoader{

@Override
public Resource getResource(String location){
if(location.startsWith("xyz://"){
return new XYZResource(new URI(location));
}
return super.getResource(location);
}

现在我只需要一种方法告诉spring使用它而不是defaultresourceloader,正如我在SPring启动中提到的那样,但是需要弄清楚如何在纯Spring中实现它。

2 个答案:

答案 0 :(得分:1)

查看ConfigurableEnvironment,您将在那里找到注册和订购自定义PropertySource个实例的一流支持:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ConfigurableEnvironment.html

答案 1 :(得分:0)

感谢@ chris-beam,他给出了一个解决方法。总而言之,需要进行以下更改:

使用您的自定义资源加载器扩展AnnotationConfigWebApplicationContext并覆盖其getResource方法,如下所示

   @Override
   public Resource getResource(String location)
   {
      ResourceLoader loader = SingletongINSTANCE.getCustomResourceLoader();
      return loader.getResource(location);
   }

这可以通过在web.xml中使用自定义AnnotationConfigWebApplicationContext条目或通过WebApplicationInitializer来完成。

另外,为了更方便地支持自定义资源加载器https://jira.spring.io/browse/SPR-13905