有时候,应用可能需要从不同的未知(例如文件系统、classpath或者URL)读取外部资源。通常,我们必须处理用于不同位置加载资源的不同API。
Spring资源加载器提供统一的getResource()方法,安装资源路径读取外部资源。我们可以为路径指定不同的前缀从不同的位置加载资源。
Resource是Spring中代表外部资源的通用接口。Spring提供Resource接口的多个实现。资源加载器的getResource()方法根据资源路径决定实例化那个Resource实现。
一、显示的加载外部资源
(1)代码片段
public class LoadResource implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@PostConstruct //注解方式初始化类 配置文件必须加入 <context:annotation-config/>
public void initResource() throws IOException{
//Resource resource = resourceLoader.getResource("file:E:\\debug.log");
Resource resource = resourceLoader.getResource("classpath:debug.log");
//加载资源文件
BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
while(true){
String line = reader.readLine();
System.out.println(line);
if(line==null){
break;
}
}
//可以加载属性文件
// Properties props = new Properties();
// props.load(resource.getInputStream());
}
}
(2)XML配置代码片段
<!-- 加载外部资源 -->
<bean id="loadResource" class="com.apress.springrecipes.resource.LoadResource"/>
除了调用getResource()方法显示的加载资源文件,我们还可以使用设值方法注入资源:
(1)代码片段
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.annotation.PostConstruct;
import org.springframework.core.io.Resource;
public class InfectResource{
private Resource resource;
public void setResource(Resource resource) {
this.resource = resource;
}
@PostConstruct
public void initResource() throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
while(true){
String line = reader.readLine();
System.out.println(line);
if(line==null){
break;
}
}
}
}
(2)配置片段
<!-- 注入资源 -->
<bean id="infectResource" class="com.apress.springrecipes.resource.InfectResource">
<property name="resource">
<value>classpath:debug.log</value>
</property>
</bean>
注:有关详细实例代码会在后面提供下载地址