使用ClasspathXmlApplicationContext定制Spring ResourceLoader

时间:2013-01-10 07:16:53

标签: java spring

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

1 个答案:

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

}