- UrlResource 访问网络资源的实现类
- ClassPathResource 访问类加载路径里资源的实现类
- FileSystemResource 访问文件系统里资源的实现类,使用file前缀来区分相对与绝对路径
- ServletContextResource 访问相对于ServletContext路径下的资源的实现类
- InputStreamResource 访问输入流资源的实现类。尽量不要使用,因为其效率低应使用ByteArrayResource或 FileSystemResouce代替
- ByteArrayResource 访问字节数组资源的实现类
下面是各类资源的取得办法
一、让类继承ResourceLoaderAware 通过使用 ResourceLoader.getResource() 取得资源
原理:ApplicationContext会将自己注入到ResourceLoaderAware Bean中,因为ApplicationContext本身就实
ResourceLoader这个接口。当使用ResourceLoader.getResource()时我们如何得知这是6种Resource中的哪一种Resource
这要看你这个ApplictionContext是哪个实现方法:
1. FileSystemXmlApplicationContext 返回 FileSystemResource
2. ClassPathXmlApplicationContext 返回 ClassPathResource
3. XmlWebApplicationContext 返回 ServletContextResource
二、 使用ApplicationContext 的getResource()取得 同理因为ApplicationContext是实现了ResourceLoader这个接口
与一大点中的说明一样,要根据ApplicationContext的实现类型返回相应的Resource实现类
在第一、二大点中取得Resource的方法本质上是一样的都是使用ApplicationContext取得。但使用前缀时可以不
理会ApplicationContext的实现类型如:
FileSystemXmlApplicationContext .getResouce("classpath:bean.xml");
虽然ApplicationContext的实现类是FileSystemXmlApplicationContext ,但还是会其在类路径下查询。同理也可以使用ResourceLoader.getResourc("classpath:bean.xml"); 可使用的前缀有:
- classpath:
- http:
- file:
- ftp:
三、以上两种有一个特点是要在程序中提供资源所在的路径,这意味着:资源所在的物理位置将被耦合到代码中,如果资源位置发生了改变就要改写程序,所有第三种方式就是通过依赖注入Resource的方式.如:
public class Bean{
private Resouce res;
public void setRes(Resource res){
this.res = res;
}
}
<bean id="bean" class="Bean">
<property name ="res" value="classpath:bookXml" />
</bean>
如果使用前缀那么spring会指定具体使用哪个Resouce类,如果不指定那么将使用与当前ApplicationContext相同的资源访问策略来访问资源
在ApplicationContext中资源的访问方法
创建ApplicationContext通常用下面三种实现类
1. FileSystemXmlApplicationContext
2. ClassPathXmlApplicationContext
3. XmlWebApplicationContext
当创建时不指定前缀时,那么就按对应的策略来访问资源。当指定前缀时就根据前缀来访问资源如:
ApplicationContext context = XmlWebApplication("bean.xml"); 使用ServletContextResource 来访问
ApplicationContext context = XmlWebApplication("classpath:bean.xml"); 使用ClassPathResource来访问
使用classpath*: 方法访问时spring将会搜索类加载路径下所有满足该规则的配置文件如:
ApplicationContext context = XmlWebApplication("classpath*:bean.xml");
ApplicationContext context = XmlWebApplication("classpath*:bean*.xml");
PS: 但 context.gerResource("classpath*:bean.xml"); 这样是不行的。因为ApplicationContext 创建时是使用了getResources();