web-dev-qa-db-fra.com

Différence de préfixe Spring

Documenté ici il est indiqué

Ce préfixe spécial spécifie que toutes les ressources de chemin d'accès aux classes qui correspondent au nom donné doivent être obtenues (en interne, cela se produit essentiellement via un appel ClassLoader.getResources (...)), puis fusionnées pour former la définition de contexte d'application finale.

Quelqu'un peut-il expliquer cela?

Quelle est la différence entre utiliser classpath*:conf/appContext.xml Par opposition à classpath:conf/appContext.xml Sans l'astérisque.

135
JavaRocky

DÉFINITION SIMPLE

Le classpath*:conf/appContext.xml signifie simplement que tous les fichiers appContext.xml sous conf les dossiers de tous vos fichiers JAR du chemin de classe seront pris en compte et réunis dans un seul et même contexte d’application.

En revanche, classpath:conf/appContext.xml chargera n seul fichier de ce type ... le premier trouvé sur votre chemin de classe.

198
Eugene Ryzhikov

Le classpath*:... La syntaxe est utile principalement lorsque vous souhaitez créer un contexte d'application à partir de plusieurs fichiers de définition de bean, à l'aide de la syntaxe générique.

Par exemple, si vous construisez votre contexte en utilisant classpath*:appContext.xml, le chemin de classe sera analysé pour chaque ressource appelée appContext.xml dans le chemin de classe et les définitions de beans de toutes fusionnées dans un seul contexte.

En revanche, classpath:conf/appContext.xml obtiendra un et un seul fichier nommé appContext.xml du classpath. S'il y en a plus d'un, les autres seront ignorés.

38
skaffman

classpath *: Il fait référence à un liste de ressources et charge tout ces fichiers présents dans le classpath et la liste peut être vide et si aucun fichier de ce type n'est présent dans le chemin d'accès aux classes, puis application ne lève aucune exception (ignore simplement l'erreur).

classpath: Il fait référence à un fichier certaines ressources et ne charge que le premier fichier trouvé sur le chemin d'accès aux classes et si aucun fichier de ce type n'est présent dans le classpath, une exception sera lancée

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

Le code source de 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)};
      }
   }
}  
0
zzz