Yay sınıfıyol öneki farkı


141

Burada belgelenmiş belirtiyor

Bu özel önek, verilen adla eşleşen tüm sınıf yolu kaynaklarının edinilmesi gerektiğini belirtir (dahili olarak, bu temelde bir ClassLoader.getResources (...) çağrısı yoluyla gerçekleşir) ve daha sonra son uygulama bağlam tanımını oluşturmak için birleştirilir.

Birisi bunu açıklayabilir mi?

Kullanma arasındaki fark nedir classpath*:conf/appContext.xmlaksine classpath:conf/appContext.xmlyıldız işareti olmadan.


Gelecekteki okuyucular, bu durumu "status = reddedildi" ifadesiyle de görürler. github.com/spring-projects/spring-framework/issues/16017 URL'nin eninde sonunda başarısız olması durumunda, hata mesajının başlığı " Jcard dosyasının kök dizininden joker dosya yolu ve joker karakter yolu ile bir XML dosyasının içe aktarılması çalışmıyor [SPR-
11390

Yanıtlar:


207

BASİT TANIM

classpath*:conf/appContext.xmlBasitçe anlamına gelir tüm appContext.xml dosyaları altında confsınıf yolunda tüm kavanozlarda klasörler aldı ve bir büyük uygulama bağlamında içine katılacak.

Buna karşılık, classpath:conf/appContext.xmlyükleyecektir sadece tek bir dosya ... Sınıfyolu bulunan ilkini.


6
aralarında daha ilginç bir fark var. Ayrıca soruma bakın: stackoverflow.com/questions/16985770/…
Eugene

27
Çok önemli bir şey - * kullanırsanız ve Spring hiçbir eşleşme bulamazsa, şikayet etmeyecektir. * 'İ kullanmazsanız ve eşleşme yoksa, bağlam başlamaz (!)
Roy Truelove

39

classpath*:...Joker sözdizimi kullanarak, birden fasulye tanım dosyalarını bir uygulama bağlamı oluşturmak istediğinizde öncelikle zaman sözdizimi yararlıdır.

Örneğin, bağlamınızı kullanarak yapılandırırsanız classpath*:appContext.xml, sınıf yolu sınıfyolunda çağrılan her kaynak için taranır appContext.xmlve hepsinden fasulye tanımları tek bir bağlamda birleştirilir.

Buna karşılık, sınıfyolundan classpath:conf/appContext.xmlçağrılan bir ve sadece bir dosya elde edilir appContext.xml. Birden fazla varsa, diğerleri göz ardı edilir.


2
Classpath * alt dizinlere de bakar mı? Başka bir deyişle, sınıf yolu kökünde appContext.xml ve /dir/appContext.xml dosyalarında bir tane varsa, classpath *: appContext.xml kullandığımda her ikisi de yüklenir mi?
AHungerArtist

21

sınıf yolu *: Bu bir atıfta kaynaklar listesinde ve tüm yükler bu tür dosyalar sınıf yolunda ve içinde mevcut boş olabilir listesinde ve eğer böyle bir dosya mevcut sınıf yolunda ardından uygulama herhangi istisna değil (sadece hatayı yok sayar).

classpath: Belirli bir kaynağa atıfta bulunur ve yalnızca sınıf yolunda bulunan ilk dosyayı yükler ve sınıf yolunda böyle bir dosya yoksa bir istisna atar

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

Resmi Doküman " ResourceKaynak, bir kerede yalnızca bir kaynağa işaret eden bir gerçek oluşturmak için classpath *: önekini kullanmak mümkün değildir ." artı bu garip hatayı aldım, işte böyle bitirdim. Eğer kaynağı içe aktaracaksanız, joker sınıf yolu önekini kullanmanın bir anlamı yoktur.
GabrielOshiro

0

Bahar'ın kaynak kodu:

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)};
      }
   }
}  

Açıklayabilir misin?
RtmY
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.