Spring系列之资源-11


本章介绍 Spring 如何处理资源以及如何在 Spring 中使用资源。

Resource

Resource位于包中的Spring接口org.springframework.core.io.旨在成为一个更强大的接口,用于抽象对低级资源的访问。

虽然Resource接口在 Spring 和 Spring 中被大量使用,但在您自己的代码中将其本身用作通用实用程序类实际上非常方便,用于访问资源,即使您的代码不知道或不关心任何其他部分Spring 。虽然这会将您的代码与 Spring 耦合,但它实际上只是将它耦合到这一小部分实用程序类,它可以作为更强大的替代品,URL并且可以被认为等同于您将用于此目的的任何其他库。

内置Resource实现

UrlResource

UrlResource包装 ajava.net.URL并可用于访问通常可通过 URL 访问的任何对象,例如文件、HTTPS 目标、FTP 目标等。所有 URL 都有一个标准化的String表示,因此使用适当的标准化前缀来指示一个 URL 类型与另一个 URL 类型。这包括 file:访问文件系统路径、https:通过 HTTPS 协议ftp:访问资源、通过 FTP 访问资源等。

ClassPathResource

此类表示应从类路径获取的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。

FileSystemResource

这是文件的Resource实现。

ServletContextResource

这是解释相关 Web 应用程序根目录中的相对路径Resource的资源实现。

ResourceLoader

ResourceLoader接口旨在由可以返回(即加载)Resource实例的对象实现。

public interface ResourceLoader {

    Resource getResource(String location);

    ClassLoader getClassLoader();
}

所有应用程序上下文都实现了该ResourceLoader接口。因此,所有应用程序上下文都可以用于获取Resource实例。

例如,假设下面的代码片段是针对一个ClassPathXmlApplicationContext实例运行的:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

您也可以ClassPathResource通过指定特殊前缀来强制使用,无论应用程序上下文类型如何classpath:

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

UrlResource同样,您可以通过指定任何标准 java.net.URL前缀来强制使用 a 。以下示例使用fileandhttps前缀:

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

ResourcePatternResolver

ResourcePatternResolver接口是ResourceLoader接口的扩展,它ResourceLoader定义了将位置模式(例如,Ant 风格的路径模式)解析为Resource对象的策略。

classpath和classpath*区别: 

classpath:只会到你的class路径中查找找文件。

classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。

注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*。

classpath*的使用:

当项目中有多个classpath路径,并同时加载多个classpath路径下(此种情况多数不会遇到)的文件,*就发挥了作用,如果不加*,则表示仅仅加载第一个classpath路径。

如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:前缀。

在多个classpath中存在同名资源,都需要加载时,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀。

ResourceLoaderAware

提供了回调接口,用于提供希望获得ResourceLoader引用。

@Component
public class CustomResourceLoader implements ResourceLoaderAware {
    @Autowired
    private ResourceLoader resourceLoader;


    public void showResourceData() 
    {
       
        Resource banner = resourceLoader.getResource("path");
			......
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
       showResourceData()    
    }
}

资源作为依赖

如果 bean 本身要通过某种动态过程来确定和提供资源路径,那么 bean 使用ResourceLoaderor ResourcePatternResolver接口来加载资源可能是有意义的。如果资源是静态的,那么完全消除接口,让 bean 公开Resource它需要的属性,并期望它们被注入其中。

package example;

public class MyBean {

    private Resource template;

    public setTemplate(Resource template) {
        this.template = template;
    }

    // ...
}

在 XML 配置文件中,template可以使用该资源的简单字符串配置属性,如以下示例所示:

<bean id="myBean" class="example.MyBean">
    <property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>

如果MyBean该类被重构以用于注释驱动的配置

@Component
public class MyBean {

    private final Resource template;

    public MyBean(@Value("${template.path}") Resource template) {
        this.template = template;
    }

    // ...
}

如果我们想支持在类路径中多个位置的同一路径下发现的多个模板(例如,在类路径中的多个 jar 中),我们可以使用特殊classpath*:前缀和通配符将templates.path键定义为 classpath*:/config/templates/*.txt. 如果我们MyBean如下重新定义类,Spring 会将模板路径模式转换为Resource可以注入MyBean构造函数的对象数组。

@Component
public class MyBean {

    private final Resource[] templates;

    public MyBean(@Value("${templates.path}") Resource[] templates) {
        this.templates = templates;
    }

    // ...
}

应用程序上下文和资源路径

构建应用程序上下文

应用程序上下文构造函数(针对特定应用程序上下文类型)通常采用字符串或字符串数组作为资源的位置路径,例如构成上下文定义的 XML 文件。

当这样的位置路径没有前缀时,Resource从该路径构建并用于加载 bean 定义的特定类型取决于并适用于特定的应用程序上下文。例如,考虑以下示例,该示例创建一个 ClassPathXmlApplicationContext

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

bean 定义是从类路径加载的,因为ClassPathResource使用了 a。但是,请考虑以下示例,该示例创建一个FileSystemXmlApplicationContext

ApplicationContext ctx =
    new FileSystemXmlApplicationContext("conf/appContext.xml");
应用程序上下文构造函数资源路径中的通配符
Ant 风格

路径位置可以包含 Ant 样式的模式,如以下示例所示:

/WEB-INF/*-context.xml
classpath*:前缀

在构建基于 XML 的应用程序上下文时,位置字符串可能会使用特殊classpath*:前缀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值