Spring入门学习——加载外部资源

来源:互联网 发布:软件系统验收标准 编辑:程序博客网 时间:2024/06/06 16:45
有时候应用可能需要从不同的位置(例如文件系统、classpath或者URL)读取外部资源(例如文本文件、XML文件、属性文件或者图像文件)。因此你必须处理用于从不同位置加载资源的不同API。
Spring的资源装载器提供统一的getResource()方法,按照资源路径读取外部资源。可以为路径指定不同的前缀从不同位置加载资源。为了从文件系统加载资源,使用file前缀。从classpath加载资源则使用classpath前缀。还可以在资源路径中指定一个URL。Resource是Spring中代表外部资源的通用接口,Spring提供了Resource接口的多个实现,资源装载器的getResource()方法根据资源路径决定实例化哪一个Resource实现。

应用场景:假如希望商店的应用启动的时候有一个简单的欢迎横幅,这个横幅如下:

*********************
*Welcome to my shop!*
*********************

这个横幅存储在文本文件banner.txt中(该文件就在项目根目录下),文件放在了当前应用程序的路径下。

编写一个BannerLoader类加载横幅并将其输出到控制台,因为加载这个资源需要访问一个资源装载器,因此必须实现ApplicationContext接口或者ResourceLoaderAware接口(ResourceLoaderAware就是之前博客学习中的“感知”接口之一)
代码如下:

package com.cgy.springrecipes.shop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
//这里实现作用域较小的ResourceLoaderAware而不是ApplicationContext接口
public class BannerLoader implements ResourceLoaderAware{

private ResourceLoader resourceLoader;

public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}


public void showBanner() throws IOException {
Resource banner = resourceLoader.getResource("file:banner.txt");
InputStream in = banner.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while(true) {
String line = reader.readLine();
if(line == null) {
break;
}
System.out.println(line);
}
reader.close();
}
}

配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="banner" class="com.cgy.springrecipes.shop.BannerLoader" init-method="showBanner"/>

</beans>

配置文件调用了bean的初始化属性init-method来执行showBanner()方法,这样子只要实例化后就能立刻在控制台打印横幅。

Main函数代码如下:

package com.cgy.springrecipes.shop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("beans_two.xml");

//后来亲测,下面这句代码没有也是可以出现横幅的,因为Bean已经被容器实例化了
BannerLoader banner = (BannerLoader) context.getBean("banner");
}
}

运行后可在控制台看见横幅内容

********************************************************************************************************************************************
资源前缀
除了类似

file:banner.txt

这种相对路径还可以使用绝对路径,如

file:c:/shop/banner.txt

当然,如果资源位于classpath时,必须使用classpath前缀,如

classpath:banner.txt

如果是maven项目结构,classpath就是放在src/main/resources中
如果资源位于一个特定的包里面,可以指定从classpath根开始的绝对路径

classpath:com/springrecipes/shop/banner.txt

除了文件系统路径和classpath之外,还可以指定一个URL加载

http://example.com/banner.txt

如果资源路径中没有指定前缀,则要根据应用上下文从一个位置加载,比如你使用FileSystemXmlApplicationContext,那么资源将从文件系统加载。使用ClassPathXmlApplicationContext,那么资源将从classpath加载。

如果想利用IoC容器注入资源,避免从代码中显示定义。则可以通过设值方法来解决,代码进行改变
BannerLoader代码修改如下:

package com.cgy.springrecipes.shop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

public class BannerLoader{

private Resource banner;

public void setBanner(Resource banner) {
this.banner = banner;
}

public void showBanner() throws IOException {
InputStream in = banner.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while(true) {
String line = reader.readLine();
if(line == null) {
break;
}
System.out.println(line);
}
reader.close();
}
}

配置文件修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">


<bean id="banner" class="com.cgy.springrecipes.shop.BannerLoader" init-method="showBanner">
<property name="banner">
<value>classpath:banner.txt</value>
</property>
</bean>

</beans>


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 纹完眼线眼睛磨的很难受怎么办 我的脸型眼睛好看牙不好看怎么办 陌陌当日打招呼人数已达上限怎么办 新生婴儿白天睡觉晚上不睡怎么办 被有翅膀的蚂蚁咬了怎么办 被带翅膀的蚂蚁蛰了怎么办 被长翅膀的蚂蚁咬了怎么办 宝宝被带翅膀的蚂蚁咬了怎么办 新的小白鞋鞋子有点夹脚怎么办 单反快门按不下去里面响怎么办 在上海动漫城游戏厅里输了钱怎么办 电缝纫机扎快了上线有套那是怎么办 老式缝纫机底线总夹梭子上怎么办 两个月宝宝脸一边大一边小怎么办 炒股入金10万亏3万怎么办 如果一支股票有好几个庄家怎么办 浦发信用卡查询密码被锁定怎么办 浦发信用卡输错密码被锁定怎么办 浦发手机银行查询密码锁定怎么办 宝宝吃母乳没吃饱就睡着了怎么办 量柱画线不是方屏电脑怎么办 夏天卧室开空调太干了怎么办 健身房锻炼手臂抻的肌肉疼怎么办 人累了可以休息 心累了怎么办 上来两天班感觉不想做了怎么办 休产假的时候公司解散了怎么办 上三天班老板不给结工资怎么办 老师说孩子上课纪律不好我该怎么办 大班的孩子记不住拼音怎么办呢 家长跟孩子沟通出现问题该怎么办? 如果孩子入学分配出现问题该怎么办 2岁多的宝宝喜欢动手打人怎么办 儿童新长出的大门牙像两边撇怎么办 被烫伤了怎么办的活动反思怎么写 生完孩子脸上起蝴蝶斑了怎么办 鼻子部位突然长了晒斑怎么办 我脸上长有日晒斑.该怎么办 做为小领导同事不听你的怎么办 二年级的小孩叫写作业不听怎么办 苹果手机微信出现黑框怎么办 百度网盘下载原画视频会闪退怎么办