我正在寻找一种创建自定义ResourceLoader的方法,该方法将使用从hbase表读取的属性。我发现我可以创建自己的ApplicationContext,重写getResource并使用自己的ResourceLoader。
@Override
public Resource getResource(String location) {
if (location.startsWith(HbaseResource.HBASE_PREFIX) ) {
ResourceLoader loader = (ResourceLoader)getBean(HbaseResourceLoader.class);
return loader.getResource(location);
} else{
return super.getResource(location);
}
}
我正在寻找一种获得相同结果的方法,仅使用ClasspathXmlApplicationContext而不创建自己的contxt类。
阅读有关ResourceLoaderAware的信息,我看到以下内容:
作为ResourcePatternResolver依赖项的替代,请考虑
公开通过模式填充的Resource数组类型的bean属性
Bean工厂使用自动类型转换的字符串。
这可以以任何方式帮助我吗?
我错过了注册自定义ResourceLoader的另一种方法吗?
最佳答案
ResourceLoader是一种特殊的构建块,不能像其他容器服务一样直接注入,但是我相信您对类型转换的观察会有所帮助。您可以安装具有某些适合您的功能的ConversionService(bean名称为“conversionService”),并且,如果可以确保在进行任何转换之前已注册了它,那么我认为它将起作用。如何执行此操作取决于您使用XML还是@Configuration。一个简单的玩具示例:
@Test
public void testResource() {
System.setProperty("value", "123");
System.setProperty("resource", "location:not.found");
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(TestConfig.class);
context.refresh();
Resource resource = context.getBean("resource", Resource.class);
assertTrue(resource.exists());
}
@Configuration
@Import(ConversionConfig.class)
public static class TestConfig {
@Value("${resource}")
private Resource resource;
@Bean
public Resource resource() {
return resource;
}
@Bean
public static PropertySourcesPlaceholderConfigurer placeholders() {
return new PropertySourcesPlaceholderConfigurer();
}
}
@Configuration
public static class ConversionConfig {
@Bean
protected ConversionService conversionService(final ResourceLoader loader) {
GenericConversionService service = new GenericConversionService();
service.addConverter(new Converter<String, Resource>() {
public Resource convert(String location) {
Resource resource = loader.getResource(location);
if (resource.exists()) {
return resource;
}
return new ByteArrayResource("foo".getBytes());
}
});
return service;
}
}