Differenza prefisso percorso classe primavera


141

Documentato qui afferma

Questo prefisso speciale specifica che tutte le risorse del percorso di classe che corrispondono al nome specificato devono essere ottenute (internamente, ciò avviene essenzialmente tramite una chiamata ClassLoader.getResources (...)) e quindi unite per formare la definizione finale del contesto dell'applicazione.

Qualcuno può spiegare questo?

Qual è la differenza tra usare classpath*:conf/appContext.xmlal contrario di classpath:conf/appContext.xmlsenza l'asterisco.


I lettori futuri vedranno anche questo bug con uno "status = rifiutato". github.com/spring-projects/spring-framework/issues/16017 Nel caso in cui l'URL alla fine non riesca, il titolo del bug post è "Importazione di un file XML dalla radice di un file JAR con percorso jolly della classe e percorso jolly non funziona [SPR-11390] "
granadaCoder

Risposte:


207

DEFINIZIONE SEMPLICE

La classpath*:conf/appContext.xmlsignifica semplicemente che tutti i file appContext.xml sotto confcartelle in tutti i vasi sul percorso di classe saranno raccolti e uniti in un contesto grande applicazione.

Al contrario, classpath:conf/appContext.xmlcaricherà solo uno di questi file ... il primo trovato sul tuo percorso di classe.


6
c'è un'altra differenza interessante tra loro. Vedi anche la mia domanda: stackoverflow.com/questions/16985770/…
Eugene

27
Una cosa molto importante: se usi * e Spring non trova corrispondenze, non si lamenterà. Se non usi * e non ci sono corrispondenze, il contesto non si avvierà (!)
Roy Truelove,

39

La classpath*:...sintassi è utile principalmente quando si desidera creare un contesto di applicazione da più file di definizione bean, utilizzando la sintassi jolly.

Ad esempio, se si costruisce il proprio contesto utilizzando classpath*:appContext.xml, il percorso di classe verrà scansionato per ogni risorsa chiamata appContext.xmlnel percorso di classe e le definizioni dei bean di tutti loro verranno unite in un singolo contesto.

Al contrario, classpath:conf/appContext.xmlotterrà uno e un solo file chiamato appContext.xmldal classpath. Se ce n'è più di uno, gli altri verranno ignorati.


2
Classpath * cercherà anche nelle sottodirectory? In altre parole, se ho appContext.xml nella directory principale classpath e uno in /dir/appContext.xml, verranno caricati entrambi quando uso classpath *: appContext.xml?
AHungerArtist,

21

classpath *: fa riferimento a un elenco di risorse e carica tutti i file presenti nel percorso di classe e l' elenco può essere vuoto e se tale file non è presente nel percorso di classe, l'applicazione non genera alcuna eccezione (ignora solo l'errore).

percorso di classe: fa riferimento a una determinata risorsa e carica solo il primo file trovato sul percorso di classe e se tale percorso non è presente nel percorso di classe genererà un'eccezione

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

Doc ufficiale "Non è possibile utilizzare il classpath *: prefix per costruire un effettivo Resource, poiché una risorsa punta a una sola risorsa alla volta." inoltre ho appena ricevuto questo strano errore, ecco come sono finito qui. Se hai intenzione di importare risorse, non ha senso usare il prefisso classpath con caratteri jolly.
GabrielOshiro,

0

Il codice sorgente di Spring:

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}  

Puoi spiegare per favore?
RtmY
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.