Resourceワイルドカードのパス

10345 ワード

4.4.1.  パスパスパスのワイルドカードを使ってResourceをロードします.
       前に紹介したリソースパスはすべて非常に単純な経路でリソースにマッチしています.Springはまた、より強力なAntモードのワイルドカードマッチングを提供しています.
 
       Antパスパスのワイルドカードは「?」、「*」、「*」をサポートしています.ワイルドカードのマッチングにはディレクトリのセパレータ「/」が含まれていないことに注意してください.
 
         「?」:「config?xml」などの文字にマッチします.「config 1.xml」にマッチします.
         「*」:「cn/config.xml」のように0つ以上の文字列とマッチしますが、「cn/javass/config.xml」にはマッチしません.一方、「cn/config-*.xml」は「cn/config-dao.xml」にマッチします.
         「*」:マッチング経路における0個以上のディレクトリ、例えば「cn/***/config.xml」は「cn/config.xml」にマッチし、「cn/javass/spring/config.xml」にもマッチします.「cn/javass/config-*.xml」は「cn/javass/config-dao.xml」にマッチします.つまり「*」を二つの「*」として処理します.
 
SpringはAntPathMatchを提供してAntスタイルのパスマッチングを行います.具体的なテストはcn.javass.spring.chapter 4.AntPathMatch Testを参照してください.
 
Springは、クラスパスリソースをロードする際に、プレフィクス「classpath:」を提供することによって、Resourceをロードすることをサポートするだけでなく、プレフィクス「classpath*」を提供して、一致するすべてのクラスパスをロードするResourceをサポートします.
 
SpringはResource PatternResoloverインターフェースを提供して、複数のResourceをロードします.このインターフェースはResource Loaderを継承して、「Resource[]getResource(String locationPattern)」を追加して複数のResourceをロードします.
 
javaコード:
public interface ResourcePatternResolver extends ResourceLoader {
       String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
       Resource[] getResources(String locationPattern) throws IOException;
}
 
Springは、モードマッチングに基づいています.デフォルトではAntPathMatMatch Matchを使って経路マッチングを行います.これはResource Loaderサポートのプレフィックスの他に、「classpath*」をサポートします.
 
まず準備をして、プロジェクトの「レスポンス」に「META-INNF」ディレクトリを作成し、その下に「INDEX.LIST」ファイルを作成します.また、「org.springframe ewark.beans-3.05.RELEASE.jar」と「org.springframe ork.com.tentxt-3.05.RELEASE.jar」の二つのjarパッケージにも同じディレクトリとファイルがあります.そして「LICENSE」ファイルを作成します.このファイルは「comp.springsource.c n.sf.cglib-2.2.jar」に存在します.
 
 
一、「クラスパス」: クラスパス(jarパケットを含む)のうちの1つをロードするために使用され、1つのリソースのみ;複数のマッチの場合も1つだけ戻りますので、複数のマッチが必要な場合は「クラスパス*」プレフィックスを考慮してください.
 
javaコード:
@Test
public void testClasspathPrefix() throws IOException {
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    //         Resource,   ResourceLoader.getResource    
    Resource[] resources=resolver.getResources("classpath:META-INF/INDEX.LIST");
    Assert.assertEquals(1, resources.length);
    //        Resource,   ResourceLoader.getResource    
    resources = resolver.getResources("classpath:META-INF/*.LIST");
    Assert.assertTrue(resources.length == 1);
}
 
二、「クラスパス*」:  クラスパス(jarパケットを含む)内のすべての整合されたリソースをロードするために使用されます.ワイルドカード付きのクラスパスパスは、「クラスLoader」の「Eumeration<URL>get Resource」を使用しています. name)「方法」は、ワイルドカードの前のリソースを検索し、そしてパターンマッチングによってマッチングされたリソースを取得する.「クラスパス:META-INF/*.LIST」は、まずワイルドカード前のディレクトリ「META-INF」をロードし、その後、経路を巡回してサブパスマッチングを行い、マッチングされたリソースを取得する.
 
javaコード:
@Test
public void testClasspathAsteriskPrefix () throws IOException {
     ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
     //            Resource
    //     ClassLoader.getResources("META-INF")         
    //          
    Resource[] resources=resolver.getResources("classpath*:META-INF/INDEX.LIST");
    Assert.assertTrue(resources.length > 1);
    //          Resource
    resources = resolver.getResources("classpath*:META-INF/*.LIST");
    Assert.assertTrue(resources.length > 1);
}
 
注意「reourcess.length」は複数のResourceに戻ることを説明します.パターンマッチングに関わらず、非モードマッチングに関わらず、マッチしたものは戻ります.
 
       「comp.spring source.n.s.s.cglib-2.2.jar」には「asm-license.txt」のファイルが含まれています.「clasasasspath*:asm-*.txt」を使ってリソースをロードすると何も「asm-license.txt」のファイルをロードできなくなります.パターンマッチングに注意してください.これは「Class Loader」の「String(get Resource)」によるものです. name)「方法の制限」は、nameが「」である場合には、ファイルシステムのクラスパスのみに戻り、jarルートの経路を変更することはありません.
 
 
javaコード:
@Test
public void testClasspathAsteriskPrefixLimit() throws IOException {
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();      //     ClassLoader.getResources("")    ,
    //               jar    
    //          
    Resource[] resources = resolver.getResources("classpath*:asm-*.txt");
    Assert.assertTrue(resources.length == 0);
    //   ClassLoader.getResources("asm-license.txt")  
    //asm-license.txt   com.springsource.net.sf.cglib-2.2.0.jar
    resources = resolver.getResources("classpath*:asm-license.txt");
    Assert.assertTrue(resources.length > 0);
    //              Resource
    resources = resolver.getResources("classpath*:LICENS*");
    Assert.assertTrue(resources.length == 1);
}
 
「resover.get Resource(「claspath*.asm-*.txt」)」については、プロジェクト「resource」ディレクトリにないので、0リソースを返すべきです.「resover.get Resource」(「claspath*:asm-license.txt」)は、jarカバンのResourceに戻ります.「resover.get Resource("classipath*:LICENS*")」は、ファイルシステムクラスのパスリソースのみに戻るため、1つのリソースに戻ります.
 
       したがって、プレフィックス「classpath*」を通じてワイルドカードパスをロードする場合、一部ではなく、ロードされたリソースが全てであることを保証するために、ルートディレクトリを含む必要があります.
 
 
三、「file」:一つ以上のファイルシステムのResourceをロードします.「file:D:/*.txt」のようにDディスク下のすべてのtxtファイルに戻ります.      
 
四、プレフィックスなし:Resource Loaderによってリソースのロードを実現する.
 
ApppliacationContectが提供するgetsResource方法はResource PatternResolaverに資源の取得を委託して実現し、デフォルトではPathMatch Resource PatternResolaverを使用します.ここではその使い方を紹介する必要はありません.
 
4.4.2.  Resourceアレイを注入
       Springはまた、注入されたResource配列をサポートしています.直接配置を見ると、次のようになります.
 
javaコード:
<bean id="resourceBean1" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources">
        <array>
            <value>cn/javass/spring/chapter4/test1.properties</value>
            <value>log4j.xml</value>
        </array>
    </property>
</bean>
<bean id="resourceBean2" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources" value="classpath*:META-INF/INDEX.LIST"/>
</bean>
<bean id="resourceBean3" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources">
        <array>
            <value>cn/javass/spring/chapter4/test1.properties</value>
            <value>classpath*:META-INF/INDEX.LIST</value>
        </array>
    </property>
</bean>
 
       「reourcere Beany 1」は多く紹介しなくてもいいです.伝統的な実現方法です.「レスポンスビーム2」にはプレフィックス「classipath*」が使われていますが、これを見てわかるはずです.複数のリソースをロードします.「reourcere Beann 3」は混ぜ合わせたものです.テストコードは「cn.javass.spring.chapter 4.Resource Inject Test.testResource ArayInject」です.
       SpringはResource ArayPropertyEditorを通じてタイプ変換を行い、またデフォルトでは「PathMatch Resource PatternResolaver」を使用して経路をResourceオブジェクトに解析します.すべての人が「PathMatch Resource PatternResolaver」を使う限り、他のいくつかの実現は、ApppliacationContectの「getsResource」方法などに委託されます.
 
4.4.3  ApppliacationContectは各種Resourceに対する支持を実現します.
       一、Class PathXml Application Contect:デフォルトではclasspathでローディングしてClass PathResourceに戻ります.二つのコンストラクション方法を提供します.
 
javaコード:
public class ClassPathXmlApplicationContext {
    //1)  ResourcePatternResolver    configLocation    
       public ClassPathXmlApplicationContext(String configLocation);
       public ClassPathXmlApplicationContext(String... configLocations);
       public ClassPathXmlApplicationContext(String[] configLocations, ……);

    //2)      path    ClasspathResource
       public ClassPathXmlApplicationContext(String path, Class clazz);
       public ClassPathXmlApplicationContext(String[] paths, Class clazz);
       public ClassPathXmlApplicationContext(String[] paths, Class clazz, ……);
}
 
       第1のクラスのコンストラクタは、提供されたプロファイルパスに基づいて「Resource PatternResolaver」を使用した「getsResource()」インターフェースをマッチングしてリソースを取得することである.つまり「classipath:config.xml」
       第二のコンストラクタは提供された経路とclazzに基づいてClass Resourceリソースを構築する.すなわち、「public Class PathResource(String path、Classclazz)」コンストラクタを用いてリソースを取得する.
 
 
        二、FileSystemXmlAppliation Contect:現在の作業ディレクトリに対する「configLocation」位置のリソースをロードします.linuxシステム上で「configLocation」が「/」を持つかどうかに関わらず、すべて相対パスとして作用することに注意してください.windowシステムでは、「D:/resource Inject.xml」は絶対パスです.そのため、必要でない限り、このアプリContectを使用することを勧めません.
 
javaコード:
public class FileSystemXmlApplicationContext{
       public FileSystemXmlApplicationContext(String configLocation);
       public FileSystemXmlApplicationContext(String... configLocations,……);
}
 
 
 
javaコード:
//linux  ,         vm      
new FileSystemXmlApplicationContext("chapter4/config.xml");
new FileSystemXmlApplicationContext("/chapter4/confg.xml");
//windows  ,         vm      ;
//             
new FileSystemXmlApplicationContext("chapter4/config.xml");
new FileSystemXmlApplicationContext("d:/chapter4/confg.xml");
 
 
       ここでは、linuxシステムでは、ビルダーは相対パスを使用し、ctx.getsResource()方法は、「/」で始まると、絶対パスリソースを取得することを表し、プリアンブル「/」を持たずに相対パスリソースを返すことができる.以下のとおりです
 
javaコード:
//linux  ,         vm      ;
//             
ctx.getResource ("chapter4/config.xml");
ctx.getResource ("/root/confg.xml");
//windows  ,         vm      ;
//             
ctx.getResource ("chapter4/config.xml");
ctx.getResource ("d:/chapter4/confg.xml");
 
       したがって、絶対パスリソースをロードする必要があるなら、プレフィックス「file」方式を選択したほうがいいです.絶対パスに従って全部ロードされます.linuxシステムでは「ctx.getResource(file:/root/confg.xml)」