3

我正在寻找一种创建自定义 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 的另一种方法?

4

1 回答 1

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;
    }

}
于 2013-01-10T09:29:26.223 回答