spring · 26 4 月, 2021 0

Srping 资源管理

引入动机

  • 为什么Spring不适用Java标准资源管理,而选择重新发明轮子

    • Java标准资源管理很强大,然而扩展复杂,资源存储方式并不统一

    • Spring要自立门户

    • Spring ,

Java标准资源管理

  • Java标准资源定位

职责 说明
面向资源 文件系统,artifactory(jar, war, ear文件)以及远程资源
API整合 java.lang.ClassLoader#getResource, java.io.File 或 java.net.URL
资源定位 java.net.URL或java.net.URI
面向流式存储 java.net.URLConnection
协议扩展 java.net.URLStreamHandler或java.net.URLStreamHandlerFactory

Java URL协议扩展

  • 基于java.net.URLStreamHandlerFactory

  • 基于java.net.URLStreamHandler

基于java.net.URLStreamHandler扩展协议

Spring 资源接口

  • 资源接口

类型 接口
输入流 org.springframework.core.io.InputStreamSource
只读资源 org.springframework.core.io.Resource
可写资源 org.springframework.core.io.WritableResource
编码资源 org.springframework.core.io.support.EncodedResource
上下文资源 org.springframework.core.io.ContextResource

Spring 内建Resource实现

  • 内建实现

资源来源 资源协议 实现类
Bean定义 BeanDefinitionResource
数组 ByteArrayResource
类路径 classpath:/ ClassPathResource
文件系统 file:/ FileSystemResource
URL URL支持的协议 UrlResource
ServletContext ServletContextResource

Spring Resource接口扩展

  • 可写资源接口

    • WritableResource

      • FileSystemResource

      • FileUrlResource(@since 5.0.2)

      • PathResource(@since 4.0 & @Deprecated)

  • 编码资源接口

    • EncodedResource

Spring 资源加载器

  • Resource加载器

    • ResourceLoader

      • DefaultResourceLoader

        • FileSystemResourceLoader

        • ClassRelativeResourceLoader

        • AbstractApplicationContext

Spring 统配路径资源加载器

  • 通配路径 ResourceLoader

    • ResourcePatternResolver

      • PathMatchingResourcePatternResolver

  • 路径匹配器

    • PathMatcher

      • AntPathMathcher – Ant模式匹配实现

依赖注入Spring Resource

  • 基于@Value实现

    • 如:

      • @Value("classpath:/...")

      • private Resource resource;

依赖注入ResourceLoader

  • 方法一: 实现ResourceLoaderAware回调

  • 方法二: 实现@Autowired注入ResourceLoader

  • 方法三: 注入ApplicationContext作为ResourceLoader

Java标准资源管理扩展的步骤

  • 简易实现

    • 实现URLStreamHandler并放置在sun.net.protocol.${protocol}.Handler包下

  • 自定义实现

    • 实现URLStreamHandler

    • 添加-Djava.protocol.handler.pkgs启动参数,执行URLStreamHandler实现类的包下

  • 高级实现

    • 实现URLStreamHandlerFactory并传递到URL之中