Spring学习历程---Resource及相关类的介绍

37 篇文章 0 订阅
29 篇文章 2 订阅

Resource接口的主要方法:

boolean exists():资源是否存在;

boolean isOpen():资源是否打开;

URL getURL() throws IOException:如果底层资源可以表示成URL,该方法返回对应的URL对象;

File getFile() throws IOException:如果底层资源对应一个文件,该方法返回对应的File对象;

InputStream getInputStream() throws IOException:返回资源对应的输入流。

Resource在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,这些资源包括配置文件资源、国际化属性文件资源等。下面我们来了解一下Resource的具体实现类,如图3-5所示:

 
(点击查看大图)图3-5  Resource和其实现类的关系

ByteArrayResource:二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造;

ClassPathResource:类路径下的资源,资源以相对于类路径的方式表示,如代码清单3-14所示;

FileSystemResource:文件系统资源,资源以文件系统路径的方式表示,如D:/conf/bean.xml等;

InputStreamResource:以输入流返回表示的资源;

ServletContextResource:为访问Web容器上下文中的资源而设计的类,负责以相对于Web应用根目录的路径加载资源,它支持以流和URL的方式访问,在WAR解包的情况下,也可以通过File的方式访问,该类还可以直接从JAR包中访问资源;

UrlResource:Url封装了java.net.URL,它使用户能够访问任何可以通过URL表示的资源,如文件系统的资源、HTTP资源、FTP资源等。

有了这个抽象的资源类后,我们就可以将Spring的配置信息放置在任何地方(如数据库、LDAP中),只要最终可以通过Resource接口返回配置信息就可以了。

Spring的Resource接口及其实现类可以在脱离Spring框架的情况下使用,它比通过JDK访问资源的API更好用,更强大。

假设有一个文件位于Web应用的类路径下,用户可以通过以下方式对这个文件资源进行访问:

通过FileSystemResource以文件系统绝对路径的方式进行访问;

通过ClassPathResource以类路径的方式进行访问;

通过ServletContextResource以相对于Web应用根目录的方式进行访问。

相比于通过JDK的File类访问文件资源的方式,Spring的Resource实现类无疑提供了更加灵活的操作方式,用户可以根据情况选择适合的Resource实现类访问资源。下面,我们分别通过FileSystemResource和ClassPathResource访问同一个文件资源

			String filePath = "D:/masterSpring/chapter3/WebRoot/WEB-INF/classes/conf/file1.txt";
			Resource res1 = new FileSystemResource(filePath);
            Resource res2 = new ClassPathResource("conf/file1.txt");
            
            InputStream ins1 = res1.getInputStream();
            InputStream ins2 = res2.getInputStream();
            System.out.println("res1:"+res1.getFilename());
            System.out.println("res2:"+res2.getFilename());            
注意: Resource及其相关的类是可以脱离Spring框架使用的,比如:

		Resource r=new ClassPathResource("1.txt");
		EncodedResource es=new EncodedResource(r,"utf-8");
		String content=FileCopyUtils.copyToString(es.getReader());
		System.out.println(content);
这里的ClassPathResource是以src下目录为起点的,使读取文件变的简单。

spring支持哪些资源类型的地址前缀:


其中和"classpath:"对应的,还有另一种比较难理解的"classpath*:"前缀。假设有多个JAR包或文件系统类路径都拥有一个相同的包名(如com.coder)。"classpath:"只会在第一个加载的com.coder包下查找,而"classpath*:"会到扫描所有这些JAR包及类路径下出现的com.coder类路径。
Ant风格资源地址支持3种匹配符:
● ?:匹配文件名中的一个字符;
● *:匹配文件名中任意个字符;
● **:匹配多层路径。
下面是几个Ant风格的资源路径的示例:
● classpath:com/t?st.xml :匹配com类路径下com/test.xml,com/tast.xml或者com/txst.xml;
● file:D:/conf/*.xml:匹配文件系统D:/conf目录下所有以xml为后缀的文件;
● classpath:com/**/test.xml:匹配com类路径下(当前目录及其子孙目录)的test.xml文件;
● classpath:org/springframework/**/*.xml:匹配类路径org/springframework下所有以xml为后缀的文件;
● classpath:org/**/servlet/bla.xml:匹配类路径org/springframework/servlet/bla.xml,也匹配org/springframework/testing/servlet/bla.xml,还匹配org/servlet/bla.xml。

Spring支持以上种资源的加载,代码:

		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		Resource resources[] =resolver.getResources("classpath*:com/baobaotao/**/*.xml");
		for(Resource resource:resources){
			System.out.println(resource.getDescription());
		}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-boot-seckill分布式秒杀系统是一个用SpringBoot开发的从0到1构建的分布式秒杀系统,项目案例基本成型,逐步完善中。 开发环境: JDK1.8、Maven、Mysql、IntelliJ IDEA、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 启动说明: 1、启动前 请配置application.properties中相关redis、zk以及kafka相关地址,建议在Linux下安装使用。 2、数据库脚本位于 src/main/resource/sql 下面,启动前请自行导入。 3、配置完成,运行Application中的main方法,访问 http://localhost:8080/seckill/swagger-ui.html 进行API测试。 4、秒杀商品页:http://localhost:8080/seckill/index.shtml ,部分功能待完成。 5、本测试案例单纯为了学习,某些案例并不适用于生产环境,大家根据所需自行调整。 秒杀架构: 架构层级 1、一般商家在做活动的时候,经常会遇到各种不怀好意的DDOS攻击(利用无辜的吃瓜群众夺取资源),导致真正的我们无法获得服务!所以说高防IP还是很有必要的。 2、搞活动就意味着人多,接入SLB,对多台云服务器进行流量分发,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 3、基于SLB价格以及灵活性考虑后面我们接入Nginx做限流分发,来保障后端服务的正常运行。 4、后端秒杀业务逻辑,基于Redis 或者 Zookeeper 分布式锁,Kafka 或者 Redis 做消息队列,DRDS数据库中间件实现数据的读写分离。 优化思路 1、分流、分流、分流,重要的事情说三遍,再牛逼的机器也抵挡不住高级别的并发。 2、限流、限流、限流,毕竟秒杀商品有限,防刷的前提下没有绝对的公平,根据每个服务的负载能力,设定流量极限。 3、缓存、缓存、缓存、尽量不要让大量请求穿透到DB层,活动开始前商品信息可以推送至分布式缓存。 4、异步、异步、异步,分析并识别出可以异步处理的逻辑,比如日志,缩短系统响应时间。 5、主备、主备、主备,如果有条件做好主备容灾方案也是非常有必要的(参考某年锤子的活动被攻击)。 6、最后,为了支撑更高的并发,追求更好的性能,可以对服务器的部署模型进行优化,部分请求走正常的秒杀流程,部分请求直接返回秒杀失败,缺点是开发部署时需要维护两套逻辑。 分层优化 1、前端优化:活动开始前生成静态商品页面推送缓存和CDN,静态文件(JS/CSS)请求推送至文件服务器和CDN。 2、网络优化:如果是全国用户,最好是BGP多线机房,减少网络延迟。 3、应用服务优化:Nginx最佳配置、Tomcat连接池优化、数据库配置优化、数据库连接池优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值