我正在寻找一种创建自定义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;
    }

}

08-18 00:16