5.3 Spring使用策略模式对访问资源的封装

Spring通过Resource接口抽象资源访问,提供多种资源访问实现如UrlResource、ClassPathResource等。ResourceLoader接口用于获取Resource实例,实现策略+工厂模式,使得资源访问方式灵活且易于扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准API访问资源

java 提供的标准API中,资源是使用URI来标识资源本身,
而如果需要访问资源,则通常使用URL以及文件IO来完成,
尤其是访问来自网络的资源是,通常会使用URL类。

URL类不能方便的访问所有资源,比如无法从ClassPath或者
ServletContext的路径来加载和访问资源。
虽然Java可以自己定义一些URL前缀,但同时需要安装一个协议处理器
使URL类支持这个协议,但这样做通常比较复杂。

Spring中资源访问相关的类关系

spirng 使用Resource接口来抽象资源,接口中定义了一些对资源的操作,该接口提供了更强的资源访问能力。Spring 框架本身大量使用了 Resource 接口来访问底层资源。
Resource继承了InputStreamSource接口,使其可以获取资源的底层输入流。

Resource接口有一些不同的实现类,主要有:

  • UrlResource:访问网络资源的实现类。
  • ClassPathResource:访问类路径资源。
  • FileSystemResource:访问文件系统资源。
  • ServletContextResource:访问相对于ServletContext路径下的资源的实现类。
  • InputStreamResource:访问输入流资源的实现类。
  • ByteArrayResource:访问字节数组资源。

实现了ResourceLoader接口的类可以获得某个Resource的实例。ApplicationContext也是该接口的子接口,因此ApplicationContext也具有加载资源的能力。

Spring对资源访问的封装是策略模式的经典实现。

策略模式

这是一篇关于策略模式的博客:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html

策略模式的UML图:

image

策略模式封装了算法或者行为的细节到单独的类中,使算法之间可以相互替换,扩展算法的同时不会影响到其他算法,即是开闭原则的体现。

Spring封装资源访问的策略模式

Resource 接口就代表资源访问策略,但具体采用哪种策略实现,Resource 接口并不理会。
客户端程序只和 Resource 接口耦合,并不知道底层采用何种资源访问策略,
这样应用可以在不同的资源访问策略之间自由切换。

通常普通的策略模式中,客户端还是需要指定策略类,即将策略类传入到Context对象中,
这样就会把具体的策略类与客户端耦合。Spring中使用了策略+工厂的方式实现了客户端和具体策略类的解耦。

ResourceLoader即是一个Context也是Factory,它可以提供Resource实例。
客户端只需要提供访问资源路径前缀ResourceLoader就能选择不同的访问策略。
ResourceLoader的一些子类(即一些Spring容器)也做了一些默认处理,即在未指定路径访问前缀时,
会根据当前不同的ApplicationContext自动选择访问资源的策略。

有时那些具体的策略类(比如:ClassPathResource FileSystemResource)会有一些公共的行为,
这种情况比较好的做法是把这些共有行为方法抽象策略类里面(比如:AbstractResource),方便复用。

这是上面博客链接中的一个图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值