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("\n"); 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("\n");
            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:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\applicationContext2.xml,數據長度:764
文件名稱D:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\demo\applicationContext2.xml,數據長度:764

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM