Spring FrameWork Core Tech

The IoC Container 2. Resources

2019-03-01  本文已影响0人  小鲍比大爷

2. Resources

2.1. Introduction

阐述java.net.URL的种种缺点,说明其不足以用来描述所有资源。

2.2. The Resource Interface

针对资源访问,Spring定义了自己的接口:

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();

}
public interface InputStreamSource {

    InputStream getInputStream() throws IOException;

}

接口相关重要方法说明:

Spring在很多情况下都用了Resource接口。即使用户不使用Spring框架,Spring也非常推荐Resource接口及其相关实现作为java的资源访问的替代方案,虽然这样跟Spring产生了耦合,但是用起来相当于引入了第三方库,没有什么负面影响。

2.3. Built-in Resource Implementations

Spring包含以下Resource的默认实现:

2.4. The ResourceLoader

public interface ResourceLoader {

    Resource getResource(String location);

}

所有application contexts都实现了ResourceLoader接口,所以可以通过自动装配的将ResourceLoader直接注入到bean中使用。同时,application contexts都具有getResource()方法,可以直接调用。ApplicationContext的getResource()方法的返回类型为2.3中提到的几种类型。有两种方式可以决定返回的Resource类型:1,资源前缀classpath或者file等;2,在没有资源前缀的情况下,由ApplicationContext类型决定,比如ClassPathXmlApplicationContext,在不指定资源前缀的情况下,返回ClassPathResource类型。

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");

2.5. The ResourceLoaderAware interface

可以通过继承ResourceLoaderAware接口,由Spring注入ResourceLoader。不过推荐直接使用@Autowired,更方便。

public interface ResourceLoaderAware {

    void setResourceLoader(ResourceLoader resourceLoader);
}

2.6. Resources as Dependencies

可以直接注入Resource类型,Spring会根据前缀情况自动转换相应的Resource类型:

@Data
@Component
public class ResourceBean {

    @Autowired
    @Value("classpath:app.properties")
    private Resource resource;

    @Autowired
    @Value("file:///app.properties")
    private Resource resource1;
}

2.7. Application Contexts and Resource Paths

通配符的使用,兼容性问题和一些使用注意事项。建议直接看官方文档。

上一篇 下一篇

猜你喜欢

热点阅读