下面是各種資源的取得辦法spring
1、讓類繼承ResourceLoaderAware 經過使用 ResourceLoader.getResource() 取得資源數組
原理:ApplicationContext會將本身注入到ResourceLoaderAware Bean中,由於ApplicationContext自己就實網絡
ResourceLoader這個接口。當使用ResourceLoader.getResource()時咱們如何得知這是6種Resource中的哪種Resourcethis
這要看你這個ApplictionContext是哪一個實現方法:spa
1. FileSystemXmlApplicationContext 返回 FileSystemResource xml
2. ClassPathXmlApplicationContext 返回 ClassPathResource 繼承
3. XmlWebApplicationContext 返回 ServletContextResource接口
2、 使用ApplicationContext 的getResource()取得 同理由於ApplicationContext是實現了ResourceLoader這個接口資源
與一大點中的說明同樣,要根據ApplicationContext的實現類型返回相應的Resource實現類get
在第1、二大點中取得Resource的方法本質上是同樣的都是使用ApplicationContext取得。但使用前綴時能夠不
理會ApplicationContext的實現類型如:
FileSystemXmlApplicationContext .getResouce("classpath:bean.xml");
雖然ApplicationContext的實現類是FileSystemXmlApplicationContext ,但仍是會其在類路徑下查詢。同理也可使用ResourceLoader.getResourc("classpath:bean.xml"); 可以使用的前綴有:
3、以上兩種有一個特色是要在程序中提供資源所在的路徑,這意味着:資源所在的物理位置將被耦合到代碼中,若是資源位置發生了改變就要改寫程序,全部第三種方式就是經過依賴注入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();