首页 > 其他分享 >Spring:资源管理

Spring:资源管理

时间:2022-12-08 16:02:56浏览次数:60  
标签:core resource Spring Resource springframework org java 资源管理

java 标准资源管理

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

基于java.net.URLStreamHandler扩展协议:jdk1.8内建协议实现,

image-20221207173609015

自定义URLStreamHandler 对象,可以通过以下俩种方式注入到URL中:

  • 设置自定义的URLStreamHandler类名为Handler,然后在程序启动的时候加上-Djava.protocol.handler.pkgs="Handler所在包名"参数,如果存在多个包名指定,可以通过分隔符"|"
  • 自定义java.net.URLStreamHandlerFactory ,然后通过URL#setURLStreamHandlerFactory设置

具体原理可参考:URL#getURLStreamHandler(String)方法源码

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

image-20221208112039349

Spring资源加载器

下面列举了三个常见的资源加载器实现,通过资源加载器加载对应的资源

image-20221208140106602

测试:

public class FileSystemResourceLoaderDemo {

    public static void main(String[] args) throws IOException {
        String filePath = System.getProperty("user.dir") + "/spring-framework/spring-core/src/main/java/com/wj/resource/FileSystemResourceLoaderDemo.java";
        FileSystemResourceLoader resourceLoader = new FileSystemResourceLoader();
        Resource resource = resourceLoader.getResource(filePath);
        EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");

        Reader reader = encodedResource.getReader();
        System.out.println(FileCopyUtils.copyToString(reader));
    }
}

打印结果:

image-20221208140914550

spring通配路径资源加载器

通配路径:

  • org.springframework.core.io.support.ResourcePatternResolver
    • org.springframework.core.io.support.PathMatchingResourcePatternResolver

路径匹配器:

  • org.springframework.util.PathMatcher
    • Ant模式匹配:org.springframework.util.AntPathMatcher

可以通过通配路径资源加载器获取到所有匹配的资源

示例如下:获取指定路径下的所有java文件

public class ResourcePatternResolverDemo {

    public static void main(String[] args) throws IOException {
        String filePath = System.getProperty("user.dir") + "/spring-framework/spring-core/src/main/java/com/wj/";
        String pattern = "**/*.java";

        PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(new FileSystemResourceLoader());

        Resource[] resources = patternResolver.getResources(filePath + pattern);

        for (Resource resource : resources) {
            System.out.println(resource.getFile().getName());
        }
    }

}

image-20221208143712321

依赖注入Spring Resource

我在resource下面放了一个属性配置文件:

image-20221208144907608

代码示例:

@Configuration
public class ResourceInjectDemo {

    @Value(ResourceUtils.CLASSPATH_URL_PREFIX + "resource.properties")
    private Resource resource;

    public Resource getResource() {
        return resource;
    }

    public static void main(String[] args) throws IOException {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ResourceInjectDemo.class);

        ResourceInjectDemo demo = applicationContext.getBean(ResourceInjectDemo.class);

        EncodedResource encodedResource = new EncodedResource(demo.getResource(), "UTF-8");
        Reader reader = encodedResource.getReader();
        System.out.println(FileCopyUtils.copyToString(reader));
    }

}

这里通过@Value的形式就可以注入Resource对象到Bean中。

简单说明一下原理,spring通过AutowiredAnnotationBeanPostProcessor后置处理器处理bean中的@Value注解,获取到注解的value值,然后通过TypeConverter类型转换器,实际上通过的是ResourceEditorString类型转换成Resource,最后通过反射注入。

ResourceEditor中使用的就是ResourceLoader去加载Resource

image-20221208151459624

此外,还可以注入数组类型Resource

    @Value(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "*.properties")
    private Resource[] resources;

原理与前面类似,只不过最后类型转换使用的是ResourceArrayPropertyEditor,而该类中使用的就是前面说到的PathMatchingResourcePatternResolver去路径匹配,

image-20221208151407287

关于类型转换详细原理可参考我前面的博客:

ResourceLoader依赖注入

  • ResourceLoaderAware回调
  • @Autowired注入ResourceLoader
  • 直接注入ApplicationContext,因为ApplicationContext实现了ResourceLoader

示例不就写了,比较简单。

原理解释:

spring容器在启动的时候,调用了prepareBeanFactory方法中,有这么几行:

image-20221208152900438

这几行说明 Spring在依赖注入的时候,当需要注入这四个类型的接口时,会把设置的指定对象注入进去,这里ResourceLoader指定的对象就是ApplicationContext。

依赖注入的代码:

image-20221208153215617

ResourceLoaderAware的原理就更简单了:主要通过ApplicationContextAwareProcessor后置处理器进行设置,

image-20221208153337931

标签:core,resource,Spring,Resource,springframework,org,java,资源管理
From: https://www.cnblogs.com/wwjj4811/p/16966332.html

相关文章

  • springboot jpa创建表自动添加注释
    @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})public@interfaceComment{Stringvalue()default......
  • spring mvc中modelattribute和sessionatrribute
    摘自http://tengj.top/2016/05/02/springmvcyuanli/SpringMVC支持使用@ModelAttribute和@SessionAttributes在不同的模型和控制器之间共享数据......
  • spring batch不错的教程
    springbatch不错的资料教程中文:​​​http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/​​​http://www.ibm.com/developerworks/......
  • SpringCloud组件入门使用
    SpringCloud1、远程调用1.1、微服务远程调用RestTemlpate1.2、微服务远程调用-Feign 2、Eureka注册中心2.1、Eureka注册中心搭建及入门使用2.2、Ribbon负载均......
  • Spring如何处理循环依赖问题
    Spring如何处理循环依赖问题什么是循环依赖:就是多个bean之间相互依赖,形成了一个闭环,比如beanA需要引用BeanB,BeanB需要引用BeanA,形成循环关系。一般默认在单例模式中,属性......
  • JAX-RS之resteasy跟spring整合
    其实,在JAX-RS标准下,jboss的resteasy跟spring结合的话,无非是如何去取得spring中的bean而已.两个方法,例子如下1比如有个接口和实现类J......
  • Spring Cloud之统一配置中心Config配置手工刷新
    实际上,配置文件也是随着应用场景变化的,如果服务已经启动并在使用过程中时需要修改其中某些配置,微服务可以直接识别并使用么?下面以SpringCloud之统一配置中心Config初......
  • flex3+blazeds+spring+hibernate整合小结
       近来flex盛行,因此这两天也借了本书看了两天,发觉作为非页面设计人员,flex还是很好的,flexbuilder很好用,拖拉就有很COOL的界面了,而且flex总的来说基本东西不难学,有编程基础......
  • 解析Spring中的ResponseBody和RequestBody
    ​​https://www.cnkirito.moe/2017/08/30/%E8%A7%A3%E6%9E%90Spring%E4%B8%AD%E7%9A%84ResponseBody%E5%92%8CRequestBody/​​​spring,restful,前后......
  • spring security 4.1两个不错功能介绍
    一转眼,springsecurity已经发布4.1了,查看了下新特性,有两个比较值得关注:1)可以在pathvariable形式的URL中进行保护了 比如有个方法:[code=......