10-spring学习-注入Resource
注入Resource
虽然Resource 的子类利用了字符串格式进行了隐藏,但是此时的代码中,ResourceLoader跟我的开发没有任何关系,
如果真的开发只关心Resource一个接口就够了。
为了解决Resource与ResourceLoader的操作的耦合问题,在spring设计的时候考虑到了数据的自动转型问题。也就是说,利用注入的操作
模式,就可以让ResourceLoader消失。
范例:编写一个资源处理类
package com.Resource.util;
import org.springframework.core.io.Resource; public class ResourceBean { private Resource resource;
public void setResource(Resource resource) {
this.resource = resource;
}
public Resource getResource() {
return resource;
}
}
要想实现数据资源的注入操作,必须编写applicationContext.xml文件,在这个文件里定义所需要的资源。
范例:在applicationContext.xml文件里面定义资源信息
<bean id="rb" class="com.Resource.util.ResourceBean">
<property name="resource" value="file:D:\\text.xml"></property>
</bean>
范例:测试代码:
package com.Test; import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.Resource.util.ResourceBean; public class TestResource { public static void main(String[] args) throws Exception { ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
//实例化,初始ResourceBean类,并且在applicationContext.xml里面给resource赋值,这个值就指定了Resource的资源路径
ResourceBean reb=ctx.getBean("rb",ResourceBean.class);
由这个实例对象,获取它的变量Resource对象,并且通过getInputStream方法,获取资源,给Scannner
Scanner scan=new Scanner(reb.getResource().getInputStream());
scan.useDelimiter("\n");
while(scan.hasNext())
{
System.out.println(scan.nextLine());
}
}
}
运行结果:
范例:获取一个classPath文件
其他代码都不用改,只需要改变bean配置就行了。
<bean id="rb" class="com.Resource.util.ResourceBean">
<property name="resource" value="classpath:META-INF/licence.txt"></property>
</bean>
利用了配置文件的方式进行处理的时候,用户关心的只是Resource一个接口的使用,而ResourceLoader接口被spring封装起来了。
而且最为方便的是,spring允许用户设置资源数组。
范例:修改程序类
package com.Resource.util; import java.util.List; import org.springframework.core.io.Resource; public class ResourceList { private List<Resource> resource;
public void setResource(List<Resource> resource) {
this.resource = resource;
}
public List<Resource> getResource() {
return resource;
}
}
测试代码:
package com.Test;
import java.util.Iterator;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import com.Resource.util.ResourceList; public class TestResourceList { public static void main(String[] args) throws Exception { ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
ResourceList reb=ctx.getBean("rblist",ResourceList.class);
Iterator<Resource> iter=reb.getResource().iterator();
while(iter.hasNext())
{
Scanner scan=new Scanner(iter.next().getInputStream());
scan.useDelimiter("\n");
while(scan.hasNext())
{
System.out.println(scan.nextLine());
}
System.out.println("**************************");
}
}
}
利用spring读取外部文件资源,它的设计比直接使用IO更加容易。
路径通配符
以上内容有一个问题,就是必须设置完整路径,但是很多时候不能完整设置路径。
例如,在不同目录下都有存在"applicationContext-xxx.xml"命名的结构,要想将其完整的全部读取进来。那么必须考虑到路径通配符使用。
在spring中继续发扬了ANT工具的特征。在这个工具下提供几种符号:
1):“?”:匹配任意的一位字符。例如:“applicationContext-?.xml”表示可以访问“applicationContext-1.xml”或"applicationContext-2.xml"。
2):“ * ”:匹配0个或者多个任意字符。
3):“ ** ”:表示匹配任意的目录,可以是零个,一个或者多个。
但是一旦要进行多个路径的匹配,那么返回的内容一定是多个,此时就只能利用ResourceLoader的子接口完成读取。可以使用的
子类:PathMatchingResourcePatternResolver。
范例:读取资源文件
为了测试,建了两个目录:
在spring里面,目录的访问不再成为限制。
package com.Resource.Demo;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class ClassPathResourceLoader {
public static void main(String[] args) throws Exception { ResourcePatternResolver loader=new PathMatchingResourcePatternResolver();
Resource[] resource=loader.getResources("classpath:com/msg/**/applicationContext?.xml"); for(int i=0;i<resource.length;i++)
{
System.out.println("文件名称"+resource[i].getFile()+",数据长度:"+resource[i].contentLength());
}
}
}
1,注意loader对象的类不再是ResourceLoader。
2,注意获取资源的方法是,getResources,比之前多了一个s。
3,resource对象是一个数组。
3,获取资源的目录:getFile,获取资源名称,getFilename。
运行结果:
文件名称D:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\applicationContext2.xml,数据长度:764
文件名称D:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\demo\applicationContext2.xml,数据长度:764
10-spring学习-注入Resource的更多相关文章
- Spring 学习笔记 Resource 资源
Spring Resources 概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理 URL 资源.File 资源.ClassPath相关资源等等.并且在 java 中 Java . ...
- Spring依赖注入—@Resource注解使用
1.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowire ...
- spring学习——注入静态对象属性
spring注入静态对象属性时,因为虚拟机类加载问题,直接在属性上使用@Autowired 是不可以的.需要在属性对应的set方法上@Autowired,并且,set方法不能定义为static. 1. ...
- Spring学习笔记(七)模拟实际开发过程的调用过程XML版-Setter方式注入
模拟实际开发过程的调用过程XML版-Setter方式注入 源码获取github [TOC] 1.项目结构 2.jar包跟上个一样 3.重写set方法 UserServiceImpl.java 1234 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异
为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...
随机推荐
- 【vim】mac配置vim,molokai配色
效果如下: 首先修改主目录下的.vimrc: "======================================================================= ...
- 【动态规划】POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11621 Accepted: 3827 Descr ...
- BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4027 [题目大意] 樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...
- [SRM686]CyclesNumber
题意:求$n$个数的所有排列形成的轮换个数的$m$次方之和 我以前只知道这是GDKOI的题,今天在ckw博客上发现它是TC题...原题真是哪里都有... 就是求$\sum\limits_{i=1}^n ...
- 【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem D. Clones and Treasures
给你一行房间,有的是隐身药水,有的是守卫,有的是金币. 你可以任选起点,向右走,每经过一个药水或金币就拿走,每经过一个守卫必须消耗1个药水,问你最多得几个金币. 药水看成左括号,守卫看成右括号, 就从 ...
- bzoj 4602: [Sdoi2016]齿轮
4602: [Sdoi2016]齿轮 Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合 ...
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) A. Orchestra 水题
A. Orchestra 题目连接: http://www.codeforces.com/contest/635/problem/A Description Paul is at the orches ...
- 按树型显示BOM的结构
在制造企业中,生产的每一个产品都由一道或多道工序组成,在组成成品之前,每一道工序经由物料--物料组成半成品,或物料--半成品组成新的半成品,亦或由半成品--半成品组成新的半成品.复杂的成品经由多道工序 ...
- Windows删除文件时出现,“正在准备 再循环”
初步分析这个问题是由于文件写入时,由于意外事情的发生(如,文件太大,正在写入时你取消了,而系统又没有来得及删除没有写完的数据等原因)没有写完. 错误的类型如下 出现此问题.当你删除不成时.返回系统根目 ...
- Spring WebSocket入门(二) 转载
本文转载自:http://www.jianshu.com/p/8500ad65eb50 WebSocket前端准备 前端我们需要用到两个js文件:sockjs.js和stomp.js SockJS:S ...