我正在寻找一种创建自定义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吗?
答案 0 :(得分:2)
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;
}
}