• 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(" "); 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("
    ");
                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:MyeclipsedocumentSpringResourceWebRootWEB-INFclassescommsgapplicationContext2.xml,数据长度:764
    文件名称D:MyeclipsedocumentSpringResourceWebRootWEB-INFclassescommsgdemoapplicationContext2.xml,数据长度:764
  • 相关阅读:
    FreeIPA部署及基本使用
    第7天:Django模板使用与表单
    第6天:数据库配置与模型
    第5天:基于类的视图与中间件
    linux下修改MySQL表名与表的字符编码
    webService理解(一)
    查询MySQL库下所有表名,数据为空的表名
    linux中MySQL连接找不到mysql.sock文件
    初步书写Webservice项目,运行后报错:Cannot assign requested address: bind
    linux配置jdk,MySQL环境
  • 原文地址:https://www.cnblogs.com/alsf/p/8060095.html
Copyright © 2020-2023  润新知