springではクラスパスとクラスパス*が違います.

7504 ワード

Springは、classpath*:classigpath:プレフィクスとパスを指定することによって、beanの定義ファイルなどのclasspathからファイルをロードすることができます.classpath*:の出現は、複数のjarファイルから同じファイルをロードするためです.
例えば、resource 1.jarのpackage'come.test.rs'には'jarAppcontext.xml'というファイルがあります.内容は以下の通りです.
<bean name=「ProcessorImplA」class=「comp.test.spring.di.ProcessorsorImplA」/>
resource.jarのpackage'come.test.rs'も'jarAppcontext.xml'のファイルがあります.内容は以下の通りです.
<bean id=「ProcessormplB」class=「comp.test.spring.di.ProcessorsorImplB」/>
  • pblic InputStream get InputStream() ローソン IOException {  
  •     InputStream is = this.servlet Contactext.getsResource Astream(this.path)  
  •     if (is == null {  
  •         throw new FileNotFoundException(「Could」 not open " + get Description();  
  •     }  
  •     return is;  
  • }  
  • pblic InputStream get InputStream() ローソン IOException {  
  •     InputStream is;  
  •     if (this.clazz != null {  
  •         is = this.clazz.gets Resource Astream(this.path)  
  •     }  
  • FileSystem Resourceがinput streamを得る方法はFileInput Streamを利用することです.
        public InputStream getInputStream()throws IOException{        return new FileInputStream(this.file);    }
    ServletContactextResourceがinputstreamを得る方法は、servlet Contactext.get Resource Astreamを利用することである.
    [java] view plin copy
    <EMBED ID=ZeroClipboard Movieme=ZeroClipboard Movieu 5 type=appication/x-shocwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode=「tranparent」flashvars=「id=5&width=18&height=18」allowfullscreen=「false」「allowscriptaccess=」always「bgcolor=」菗菗ffff「quality=」ベスト「menu=」false「loop=」false">
  • protected Resource get Resource ByPath(String) パス) {  
  •         return new ServletContect Resource(this.servlet Contect) パス  
  •     }  
  •   
  •  FileSystemXmlAppleicationComptextは次のようにカバーされています.  
  •   
  • protected Resource get Resource ByPath(String) パス) {  
  •         if (パス != null && path.starts With(/) {  
  •             パス = path.substring(1)  
  •         }  
  •         return new FileSystem Resource(path);  
  •     }  
  • 最終的にファイルを読み込む時はJAVAでよく見られるファイルの読み込み方法です.
    Class PathResourceがinputstreamを得る方法はclass loaderを利用することです.
    [java] view plin copy
    <EMBED ID=ZeroClipboard Movieme=ZeroClipboard Movieu 4 type=appliation/x-shocwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode=「tranparent」flashvars=「id=4&width=18&height=18」allowfullscreen=「false」allowscriptaccess=「always」bgcolor=「芫ffff」quality=「ベスト」menu=「false」loop=「false」
  • pblic Resource get Resource(String) location) {  
  •         Asert.notNull(location) 「Location」 must not be null");  
  •         if (location.starts With(CLASSPATHUURLUPREFIX)) {  
  •             return new Class PathResource(locations.substring)、 get Class Loader()  
  •         }  
  •         else {  
  •             try {  
  •                 // Try ト パース the location as a. URL…  
  •                 URL url = new URL(location)  
  •                 return new UrlResource  
  •             }  
  •             catch (Mal formedURLException ex) {  
  •                 // No. URL -> レスリング as resource パス.  
  •                 return get Resource ByPath;  
  •             }  
  •         }  
  •     }  
  • get Resource ByPathは異なるApplicationContextである. 上書きを実現します
    GeneraicWebApplication Comptextのようなカバーは以下の通りです.
    [java] view plin copy
    <EMBED ID=ZeroClipboard Movieme=ZeroClipboard Movieu 3 type=appliation/x-shocwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode=「tranparent」flashvars=「id=3&width=18&height=18」allowfullscreen=「false」allowscriptaccess=「always」bgcolor=「芫ffff」quality=「ベスト」menu=「false」loop=「false」
  • protected Resource[] findAll Class PathResource(String) location) ローソン IOException {  
  •     String パス = location;  
  •     if (path.starts With(「/」) {  
  •         パス = path.substring(1)  
  •     }  
  •     Eumeration resource Urls = get Class Loader().get Resource(path);  
  •     Set レスリング = new Linked HashSet<Resource>(16);  
  •     while (resource Urls.has MoreElements() {  
  •         URL url = (URL) resource Urls.nextElement()  
  •         result.add(convert Class Loader URL);  
  •     }  
  •     return result.toAray(new Resource[result.size];  
  • }  
  • http://blog.csdn.net/kkdelta/article/details/5560210JAVAでclasspathを通して見つかったすべての該当する名前のファイルを紹介しました.
    また、resourceをロードする際に、他のプレフィックスの意味は下表の通りです.classipath*は指定されたプロファイルとのパスしか使えないので、getsResourceに使うパラメータは使えません.例えば、apConttext.getsResource(「clasassity*:conf/bfactoryCtx.xml」)は異常です.
    プレフィックス

    説明
    クラスパス:classpath:com/myapp/config.xmlクラスパスからロードします.
    file:file:/data/config.xmlとして  URL ファイルシステムから読み込みます.
    http:http://myserver/logo.pngとして  URL 読み込み
    (none)/data/config.xmlによると  ApplicationContext 判断を下す
    Springのソースからは、理由が分かります.もしクレスパスであれば、最初に、classpathからローディングします.さもなければ、URLを試してみます.失敗したら、getsResource ByPathを呼び出します.
    [java] view plin copy
    <EMBED ID=ZeroClipboard Movieme=ZeroClipboard Movieu 2 type=appication/X-shocwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode=「tranparent」flashvars=「id=2&width=18&height=18」allowfullscreen=「false」allowscriptaccess=「always」bgcolor=「芫ffff」quality=「ベスト」menu=「false」loop=「false」
    下記のコードを使うことで、二つのjarカバンの中のファイルを全部読み込むことができます.
    Apple Conteext ctx=new Class PathXml Apple Controtext("classipath*:com/test/rs/jarAppcontext.xml")
    下のコードを書くと、その中の一つのxmlファイルしか見つけられません.(jarパッケージのロード順序によって順番が異なります.)
    Apple Conteext ctx=new Class PathXml Apple Controtext(「classity:com/test/rs/jarAppcontext.xml」);
    classipath*:複数のcomponent(最終的には異なるjarパッケージにリリースされる)を並列に開発するために、それぞれのbean定義ファイルは一定の規則に従います.package+filename、これらのcomponentを使用するコーディネーターはこれらのファイルを全部読み込むことができます.
    classipath*:のローディングはclassloaderのを使用しました.  getResources() 方法は、異なるJ 2 EEサーバ上で実行される場合、アプリケーションサーバが自分のクラスリーダーを提供して実現するため、Jarファイルを処理する際の挙動は異なるかもしれません.classpath*:をテストします. 有効かどうかは、クラスパスパスのJarファイルからテストを行うためにclassloaderを使ってもいいです.getClass().getClassLoader().getResources("<someFileInsideTheJar>").(上の例はsunのjreで実行されている状態です.)
     Springのソースコードから、PathMatch Resource PatternResolaverクラスでは、私たちはより明確にその処理を理解することができます:もしclasspath*で始まるならば、それはclasspathを遍歴することができます.
    [java] view plin copy
    <EMBED ID=ZeroClipboard Movieme=ZeroClipboard Movieu 1 type=appliation/x-shocwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode=「tranparent」flashvars=「id=1&width=18&height=18」allowfullscreen=「false」allowscriptaccess=「always」bgcolor=「芫ffff」quality=「ベスト」menu=「false」loop=「false」